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 <common.h>
8 #include <display_options.h>
9 #include <dm.h>
10 #include <dm/test.h>
11 #include <test/ut.h>
12 #include <video_osd.h>
13 #include <asm/test.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_assertok(memcmp(text, "          "
75 				 "          "
76 				 "          "
77 				 "          "
78 				 "          "
79 				 "          "
80 				 "          "
81 				 "          "
82 				 "          "
83 				 "          ", memsize / 2));
84 
85 	ut_assertok(memcmp(colors, "kkkkkkkkkk"
86 				   "kkkkkkkkkk"
87 				   "kkkkkkkkkk"
88 				   "kkkkkkkkkk"
89 				   "kkkkkkkkkk"
90 				   "kkkkkkkkkk"
91 				   "kkkkkkkkkk"
92 				   "kkkkkkkkkk"
93 				   "kkkkkkkkkk"
94 				   "kkkkkkkkkk", memsize / 2));
95 
96 	print_mem(mem, 10, 10);
97 
98 	ut_assertok(video_osd_print(dev, 1, 1, COLOR_RED, "Blah"));
99 
100 	ut_assertok(sandbox_osd_get_mem(dev, mem, memsize));
101 	split(mem, memsize / 2, text, colors);
102 
103 	ut_assertok(memcmp(text, "          "
104 				 " Blah     "
105 				 "          "
106 				 "          "
107 				 "          "
108 				 "          "
109 				 "          "
110 				 "          "
111 				 "          "
112 				 "          ", memsize / 2));
113 
114 	ut_assertok(memcmp(colors, "kkkkkkkkkk"
115 				   "krrrrkkkkk"
116 				   "kkkkkkkkkk"
117 				   "kkkkkkkkkk"
118 				   "kkkkkkkkkk"
119 				   "kkkkkkkkkk"
120 				   "kkkkkkkkkk"
121 				   "kkkkkkkkkk"
122 				   "kkkkkkkkkk"
123 				   "kkkkkkkkkk", memsize / 2));
124 
125 	print_mem(mem, 10, 10);
126 
127 	return 0;
128 }
129 
130 DM_TEST(dm_test_osd_basics, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
131 
dm_test_osd_extended(struct unit_test_state * uts)132 static int dm_test_osd_extended(struct unit_test_state *uts)
133 {
134 	struct udevice *dev;
135 	u8 mem[memsize + 1];
136 	u8 colors[memsize / 2];
137 	u8 text[memsize / 2];
138 	struct video_osd_info info;
139 	u16 val;
140 
141 	ut_assertok(uclass_first_device_err(UCLASS_VIDEO_OSD, &dev));
142 
143 	ut_assertok(video_osd_set_size(dev, 20, 5));
144 
145 	video_osd_get_info(dev, &info);
146 
147 	ut_asserteq(20, info.width);
148 	ut_asserteq(5, info.height);
149 	ut_asserteq(1, info.major_version);
150 	ut_asserteq(0, info.minor_version);
151 
152 	ut_assertok(sandbox_osd_get_mem(dev, mem, memsize));
153 	split(mem, memsize / 2, text, colors);
154 
155 	ut_assertok(memcmp(text, "                    "
156 				 "                    "
157 				 "                    "
158 				 "                    "
159 				 "                    ", memsize / 2));
160 
161 	ut_assertok(memcmp(colors, "kkkkkkkkkkkkkkkkkkkk"
162 				   "kkkkkkkkkkkkkkkkkkkk"
163 				   "kkkkkkkkkkkkkkkkkkkk"
164 				   "kkkkkkkkkkkkkkkkkkkk"
165 				   "kkkkkkkkkkkkkkkkkkkk", memsize / 2));
166 
167 	print_mem(mem, 20, 5);
168 
169 	/* Draw green border */
170 	val = '-' * 0x100 + 'g';
171 	ut_assertok(video_osd_set_mem(dev, 1, 0, (u8 *)&val, 2, 18));
172 	ut_assertok(video_osd_set_mem(dev, 1, 4, (u8 *)&val, 2, 18));
173 	ut_assertok(video_osd_print(dev, 0, 1, COLOR_GREEN, "|"));
174 	ut_assertok(video_osd_print(dev, 0, 2, COLOR_GREEN, "|"));
175 	ut_assertok(video_osd_print(dev, 0, 3, COLOR_GREEN, "|"));
176 	ut_assertok(video_osd_print(dev, 19, 1, COLOR_GREEN, "|"));
177 	ut_assertok(video_osd_print(dev, 19, 2, COLOR_GREEN, "|"));
178 	ut_assertok(video_osd_print(dev, 19, 3, COLOR_GREEN, "|"));
179 	ut_assertok(video_osd_print(dev, 0, 0, COLOR_GREEN, "+"));
180 	ut_assertok(video_osd_print(dev, 19, 0, COLOR_GREEN, "+"));
181 	ut_assertok(video_osd_print(dev, 19, 4, COLOR_GREEN, "+"));
182 	ut_assertok(video_osd_print(dev, 0, 4, COLOR_GREEN, "+"));
183 
184 	/* Add menu caption and entries */
185 	ut_assertok(video_osd_print(dev, 5, 0, COLOR_GREEN, " OSD menu "));
186 	ut_assertok(video_osd_print(dev, 2, 1, COLOR_BLUE, " *  Entry 1"));
187 	ut_assertok(video_osd_print(dev, 2, 2, COLOR_BLUE, "(*) Entry 2"));
188 	ut_assertok(video_osd_print(dev, 2, 3, COLOR_BLUE, " *  Entry 3"));
189 
190 	ut_assertok(sandbox_osd_get_mem(dev, mem, memsize));
191 	split(mem, memsize / 2, text, colors);
192 
193 	print_mem(mem, 20, 5);
194 
195 	ut_assertok(memcmp(text, "+---- OSD menu ----+"
196 				 "|  *  Entry 1      |"
197 				 "| (*) Entry 2      |"
198 				 "|  *  Entry 3      |"
199 				 "+------------------+", memsize / 2));
200 
201 	ut_assertok(memcmp(colors, "gggggggggggggggggggg"
202 				   "gkbbbbbbbbbbbkkkkkkg"
203 				   "gkbbbbbbbbbbbkkkkkkg"
204 				   "gkbbbbbbbbbbbkkkkkkg"
205 				   "gggggggggggggggggggg", memsize / 2));
206 
207 	return 0;
208 }
209 
210 DM_TEST(dm_test_osd_extended, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
211