1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2018
4  * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
5  */
6 
7 #include <display_options.h>
8 #include <dm.h>
9 #include <video_osd.h>
10 #include <asm/test.h>
11 #include <dm/test.h>
12 #include <test/test.h>
13 #include <test/ut.h>
14 
15 #include "../../drivers/video/sandbox_osd.h"
16 
17 const uint memsize = 2 * 10 * 10;
18 
split(u8 * mem,uint size,u8 * text,u8 * colors)19 static void split(u8 *mem, uint size, u8 *text, u8 *colors)
20 {
21 	int i;
22 	u16 *p = (u16 *)mem;
23 
24 	for (i = 0; i < size; i++) {
25 		colors[i] = p[i] % 0x100;
26 		text[i] = p[i] / 0x100;
27 	}
28 }
29 
print_mem(u8 * mem,uint width,uint height)30 static void print_mem(u8 *mem, uint width, uint height)
31 {
32 	const uint memsize = 2 * 10 * 10;
33 	u8 colors[memsize / 2];
34 	u8 text[memsize / 2];
35 	int i;
36 
37 	split(mem, memsize / 2, text, colors);
38 
39 	for (i = 0; i < width * height; i++) {
40 		printf("%c", text[i]);
41 		if (i > 0 && ((i + 1) % width) == 0)
42 			printf("\n");
43 	}
44 
45 	printf("\n");
46 
47 	for (i = 0; i < width * height; i++) {
48 		printf("%c", colors[i]);
49 		if (i > 0 && ((i + 1) % width) == 0)
50 			printf("\n");
51 	}
52 }
53 
dm_test_osd_basics(struct unit_test_state * uts)54 static int dm_test_osd_basics(struct unit_test_state *uts)
55 {
56 	struct udevice *dev;
57 	u8 mem[memsize + 1];
58 	u8 colors[memsize / 2];
59 	u8 text[memsize / 2];
60 	struct video_osd_info info;
61 
62 	ut_assertok(uclass_first_device_err(UCLASS_VIDEO_OSD, &dev));
63 
64 	video_osd_get_info(dev, &info);
65 
66 	ut_asserteq(10, info.width);
67 	ut_asserteq(10, info.height);
68 	ut_asserteq(1, info.major_version);
69 	ut_asserteq(0, info.minor_version);
70 
71 	ut_assertok(sandbox_osd_get_mem(dev, mem, memsize));
72 	split(mem, memsize / 2, text, colors);
73 
74 	ut_asserteq_mem(text,
75 			"          "
76 			"          "
77 			"          "
78 			"          "
79 			"          "
80 			"          "
81 			"          "
82 			"          "
83 			"          "
84 			"          ", memsize / 2);
85 
86 	ut_asserteq_mem(colors,
87 			"kkkkkkkkkk"
88 			"kkkkkkkkkk"
89 			"kkkkkkkkkk"
90 			"kkkkkkkkkk"
91 			"kkkkkkkkkk"
92 			"kkkkkkkkkk"
93 			"kkkkkkkkkk"
94 			"kkkkkkkkkk"
95 			"kkkkkkkkkk"
96 			"kkkkkkkkkk", memsize / 2);
97 
98 	print_mem(mem, 10, 10);
99 
100 	ut_assertok(video_osd_print(dev, 1, 1, COLOR_RED, "Blah"));
101 
102 	ut_assertok(sandbox_osd_get_mem(dev, mem, memsize));
103 	split(mem, memsize / 2, text, colors);
104 
105 	ut_asserteq_mem(text,
106 			"          "
107 			" Blah     "
108 			"          "
109 			"          "
110 			"          "
111 			"          "
112 			"          "
113 			"          "
114 			"          "
115 			"          ", memsize / 2);
116 
117 	ut_asserteq_mem(colors,
118 			"kkkkkkkkkk"
119 			"krrrrkkkkk"
120 			"kkkkkkkkkk"
121 			"kkkkkkkkkk"
122 			"kkkkkkkkkk"
123 			"kkkkkkkkkk"
124 			"kkkkkkkkkk"
125 			"kkkkkkkkkk"
126 			"kkkkkkkkkk"
127 			"kkkkkkkkkk", memsize / 2);
128 
129 	print_mem(mem, 10, 10);
130 
131 	return 0;
132 }
133 DM_TEST(dm_test_osd_basics, UTF_SCAN_PDATA | UTF_SCAN_FDT);
134 
dm_test_osd_extended(struct unit_test_state * uts)135 static int dm_test_osd_extended(struct unit_test_state *uts)
136 {
137 	struct udevice *dev;
138 	u8 mem[memsize + 1];
139 	u8 colors[memsize / 2];
140 	u8 text[memsize / 2];
141 	struct video_osd_info info;
142 	u16 val;
143 
144 	ut_assertok(uclass_first_device_err(UCLASS_VIDEO_OSD, &dev));
145 
146 	ut_assertok(video_osd_set_size(dev, 20, 5));
147 
148 	video_osd_get_info(dev, &info);
149 
150 	ut_asserteq(20, info.width);
151 	ut_asserteq(5, info.height);
152 	ut_asserteq(1, info.major_version);
153 	ut_asserteq(0, info.minor_version);
154 
155 	ut_assertok(sandbox_osd_get_mem(dev, mem, memsize));
156 	split(mem, memsize / 2, text, colors);
157 
158 	ut_asserteq_mem(text,
159 			"                    "
160 			"                    "
161 			"                    "
162 			"                    "
163 			"                    ", memsize / 2);
164 
165 	ut_asserteq_mem(colors,
166 			"kkkkkkkkkkkkkkkkkkkk"
167 			"kkkkkkkkkkkkkkkkkkkk"
168 			"kkkkkkkkkkkkkkkkkkkk"
169 			"kkkkkkkkkkkkkkkkkkkk"
170 			"kkkkkkkkkkkkkkkkkkkk", memsize / 2);
171 
172 	print_mem(mem, 20, 5);
173 
174 	/* Draw green border */
175 	val = '-' * 0x100 + 'g';
176 	ut_assertok(video_osd_set_mem(dev, 1, 0, (u8 *)&val, 2, 18));
177 	ut_assertok(video_osd_set_mem(dev, 1, 4, (u8 *)&val, 2, 18));
178 	ut_assertok(video_osd_print(dev, 0, 1, COLOR_GREEN, "|"));
179 	ut_assertok(video_osd_print(dev, 0, 2, COLOR_GREEN, "|"));
180 	ut_assertok(video_osd_print(dev, 0, 3, COLOR_GREEN, "|"));
181 	ut_assertok(video_osd_print(dev, 19, 1, COLOR_GREEN, "|"));
182 	ut_assertok(video_osd_print(dev, 19, 2, COLOR_GREEN, "|"));
183 	ut_assertok(video_osd_print(dev, 19, 3, COLOR_GREEN, "|"));
184 	ut_assertok(video_osd_print(dev, 0, 0, COLOR_GREEN, "+"));
185 	ut_assertok(video_osd_print(dev, 19, 0, COLOR_GREEN, "+"));
186 	ut_assertok(video_osd_print(dev, 19, 4, COLOR_GREEN, "+"));
187 	ut_assertok(video_osd_print(dev, 0, 4, COLOR_GREEN, "+"));
188 
189 	/* Add menu caption and entries */
190 	ut_assertok(video_osd_print(dev, 5, 0, COLOR_GREEN, " OSD menu "));
191 	ut_assertok(video_osd_print(dev, 2, 1, COLOR_BLUE, " *  Entry 1"));
192 	ut_assertok(video_osd_print(dev, 2, 2, COLOR_BLUE, "(*) Entry 2"));
193 	ut_assertok(video_osd_print(dev, 2, 3, COLOR_BLUE, " *  Entry 3"));
194 
195 	ut_assertok(sandbox_osd_get_mem(dev, mem, memsize));
196 	split(mem, memsize / 2, text, colors);
197 
198 	print_mem(mem, 20, 5);
199 
200 	ut_asserteq_mem(text,
201 			"+---- OSD menu ----+"
202 			"|  *  Entry 1      |"
203 			"| (*) Entry 2      |"
204 			"|  *  Entry 3      |"
205 			 "+------------------+", memsize / 2);
206 
207 	ut_asserteq_mem(colors,
208 			"gggggggggggggggggggg"
209 			"gkbbbbbbbbbbbkkkkkkg"
210 			"gkbbbbbbbbbbbkkkkkkg"
211 			"gkbbbbbbbbbbbkkkkkkg"
212 			"gggggggggggggggggggg", memsize / 2);
213 
214 	return 0;
215 }
216 DM_TEST(dm_test_osd_extended, UTF_SCAN_PDATA | UTF_SCAN_FDT);
217