1
2
3
4
5
6#include <common.h>
7#include <console.h>
8#include <dm.h>
9#include <part.h>
10#include <usb.h>
11#include <asm/io.h>
12#include <asm/state.h>
13#include <asm/test.h>
14#include <dm/device-internal.h>
15#include <dm/test.h>
16#include <dm/uclass-internal.h>
17#include <test/test.h>
18#include <test/ut.h>
19
20struct keyboard_test_data {
21 const char modifiers;
22 const char scancode;
23 const char result[6];
24};
25
26
27static int dm_test_usb_base(struct unit_test_state *uts)
28{
29 struct udevice *bus;
30
31 ut_asserteq(-ENODEV, uclass_get_device_by_seq(UCLASS_USB, 0, &bus));
32 ut_assertok(uclass_get_device(UCLASS_USB, 0, &bus));
33 ut_asserteq(-ENODEV, uclass_get_device_by_seq(UCLASS_USB, 2, &bus));
34
35 return 0;
36}
37DM_TEST(dm_test_usb_base, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
38
39
40
41
42
43
44static int dm_test_usb_flash(struct unit_test_state *uts)
45{
46 struct blk_desc *dev_desc, *chk;
47 struct udevice *dev, *blk;
48 char cmp[1024];
49
50 state_set_skip_delays(true);
51 ut_assertok(usb_init());
52 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
53 ut_assertok(blk_get_device_by_str("usb", "0", &dev_desc));
54 chk = blk_get_by_device(dev);
55 ut_asserteq_ptr(chk, dev_desc);
56
57 ut_assertok(device_find_first_child_by_uclass(dev, UCLASS_BLK, &blk));
58 ut_asserteq_ptr(chk, blk_get_by_device(dev));
59
60
61 ut_asserteq(512, dev_desc->blksz);
62 memset(cmp, '\0', sizeof(cmp));
63 ut_asserteq(2, blk_read(blk, 0, 2, cmp));
64 ut_asserteq_str("this is a test", cmp);
65
66 strcpy(cmp, "another test");
67 ut_asserteq(1, blk_write(blk, 1, 1, cmp));
68
69 memset(cmp, '\0', sizeof(cmp));
70 ut_asserteq(2, blk_read(blk, 0, 2, cmp));
71 ut_asserteq_str("this is a test", cmp);
72 ut_asserteq_str("another test", cmp + 512);
73
74 memset(cmp, '\0', sizeof(cmp));
75 ut_asserteq(1, blk_write(blk, 1, 1, cmp));
76
77 memset(cmp, '\0', sizeof(cmp));
78 ut_asserteq(2, blk_read(blk, 0, 2, cmp));
79 ut_asserteq_str("this is a test", cmp);
80 ut_asserteq_str("", cmp + 512);
81
82 ut_assertok(usb_stop());
83
84 return 0;
85}
86DM_TEST(dm_test_usb_flash, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
87
88
89static int dm_test_usb_multi(struct unit_test_state *uts)
90{
91 struct udevice *dev;
92
93 state_set_skip_delays(true);
94 ut_assertok(usb_init());
95 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
96 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev));
97 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
98 ut_assertok(usb_stop());
99
100 return 0;
101}
102DM_TEST(dm_test_usb_multi, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
103
104
105static int dm_test_usb_fdt_node(struct unit_test_state *uts)
106{
107 struct udevice *dev;
108 ofnode node;
109
110 state_set_skip_delays(true);
111 ut_assertok(usb_init());
112 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
113 node = ofnode_path("/usb@1/hub/usbstor@1");
114 ut_asserteq(1, ofnode_equal(node, dev_ofnode(dev)));
115 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev));
116 ut_asserteq(1, ofnode_equal(ofnode_null(), dev_ofnode(dev)));
117 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
118 node = ofnode_path("/usb@1/hub/usbstor@3");
119 ut_asserteq(1, ofnode_equal(node, dev_ofnode(dev)));
120 ut_assertok(usb_stop());
121
122 return 0;
123}
124DM_TEST(dm_test_usb_fdt_node, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
125
126static int count_usb_devices(void)
127{
128 struct udevice *hub;
129 struct uclass *uc;
130 int count = 0;
131 int ret;
132
133 ret = uclass_get(UCLASS_USB_HUB, &uc);
134 if (ret)
135 return ret;
136
137 uclass_foreach_dev(hub, uc) {
138 struct udevice *dev;
139
140 count++;
141 for (device_find_first_child(hub, &dev);
142 dev;
143 device_find_next_child(&dev)) {
144 count++;
145 }
146 }
147
148 return count;
149}
150
151
152static int dm_test_usb_stop(struct unit_test_state *uts)
153{
154 struct udevice *dev;
155
156
157 state_set_skip_delays(true);
158 ut_assertok(usb_init());
159 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
160 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev));
161 ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
162 ut_asserteq(6, count_usb_devices());
163 ut_assertok(usb_stop());
164 ut_asserteq(0, count_usb_devices());
165
166 return 0;
167}
168DM_TEST(dm_test_usb_stop, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197static int dm_test_usb_keyb(struct unit_test_state *uts)
198{
199 struct udevice *dev;
200 const struct keyboard_test_data *pos;
201 const struct keyboard_test_data kbd_test_data[] = {
202
203 {0x00, 0x04, "a"},
204
205 {0x00, 0x05, "b"},
206
207 {0x00, 0x06, "c"},
208
209 {0x00, 0x07, "d"},
210
211 {0x00, 0x08, "e"},
212
213 {0x00, 0x09, "f"},
214
215 {0x00, 0x0a, "g"},
216
217 {0x00, 0x0b, "h"},
218
219 {0x00, 0x0c, "i"},
220
221 {0x00, 0x0d, "j"},
222
223 {0x00, 0x0e, "k"},
224
225 {0x00, 0x0f, "l"},
226
227 {0x00, 0x10, "m"},
228
229 {0x00, 0x11, "n"},
230
231 {0x00, 0x12, "o"},
232
233 {0x00, 0x13, "p"},
234
235 {0x00, 0x14, "q"},
236
237 {0x00, 0x15, "r"},
238
239 {0x00, 0x16, "s"},
240
241 {0x00, 0x17, "t"},
242
243 {0x00, 0x18, "u"},
244
245 {0x00, 0x19, "v"},
246
247 {0x00, 0x1a, "w"},
248
249 {0x00, 0x1b, "x"},
250
251 {0x00, 0x1c, "y"},
252
253 {0x00, 0x1d, "z"},
254
255
256 {0x02, 0x04, "A"},
257
258 {0x20, 0x1d, "Z"},
259
260
261 {0x01, 0x04, "\x01"},
262
263 {0x10, 0x1d, "\x1a"},
264
265
266 {0x00, 0x1e, "1"},
267
268 {0x00, 0x1f, "2"},
269
270 {0x00, 0x20, "3"},
271
272 {0x00, 0x21, "4"},
273
274 {0x00, 0x22, "5"},
275
276 {0x00, 0x23, "6"},
277
278 {0x00, 0x24, "7"},
279
280 {0x00, 0x25, "8"},
281
282 {0x00, 0x26, "9"},
283
284 {0x00, 0x27, "0"},
285
286
287 {0x02, 0x1e, "!"},
288
289 {0x20, 0x1f, "@"},
290
291 {0x02, 0x20, "#"},
292
293 {0x20, 0x21, "$"},
294
295 {0x02, 0x22, "%"},
296
297 {0x20, 0x23, "^"},
298
299 {0x02, 0x24, "&"},
300
301 {0x20, 0x25, "*"},
302
303 {0x02, 0x26, "("},
304
305 {0x20, 0x27, ")"},
306
307
308 {0x00, 0x28, "\r"},
309
310 {0x00, 0x29, "\x1b"},
311
312 {0x00, 0x2a, "\x08"},
313
314 {0x00, 0x2b, "\x09"},
315
316 {0x00, 0x2c, " "},
317
318 {0x00, 0x2d, "-"},
319
320 {0x00, 0x2e, "="},
321
322 {0x00, 0x2f, "["},
323
324 {0x00, 0x30, "]"},
325
326 {0x00, 0x31, "\\"},
327
328 {0x00, 0x32, "#"},
329
330 {0x00, 0x33, ";"},
331
332 {0x00, 0x34, "'"},
333
334 {0x00, 0x35, "`"},
335
336 {0x00, 0x36, ","},
337
338 {0x00, 0x37, "."},
339
340 {0x00, 0x38, "/"},
341
342
343 {0x02, 0x28, "\r"},
344
345 {0x20, 0x29, "\x1b"},
346
347 {0x02, 0x2a, "\x08"},
348
349 {0x20, 0x2b, "\x09"},
350
351 {0x02, 0x2c, " "},
352
353 {0x20, 0x2d, "_"},
354
355 {0x02, 0x2e, "+"},
356
357 {0x20, 0x2f, "{"},
358
359 {0x02, 0x30, "}"},
360
361 {0x20, 0x31, "|"},
362
363 {0x02, 0x32, "~"},
364
365 {0x20, 0x33, ":"},
366
367 {0x02, 0x34, "\""},
368
369 {0x20, 0x35, "~"},
370
371 {0x02, 0x36, "<"},
372
373 {0x20, 0x37, ">"},
374
375 {0x02, 0x38, "?"},
376#ifdef CONFIG_USB_KEYBOARD_FN_KEYS
377
378 {0x00, 0x3a, "\x1bOP"},
379
380 {0x00, 0x3b, "\x1bOQ"},
381
382 {0x00, 0x3c, "\x1bOR"},
383
384 {0x00, 0x3d, "\x1bOS"},
385
386 {0x00, 0x3e, "\x1b[15~"},
387
388 {0x00, 0x3f, "\x1b[17~"},
389
390 {0x00, 0x40, "\x1b[18~"},
391
392 {0x00, 0x41, "\x1b[19~"},
393
394 {0x00, 0x42, "\x1b[20~"},
395
396 {0x00, 0x43, "\x1b[21~"},
397
398 {0x00, 0x44, "\x1b[23~"},
399
400 {0x00, 0x45, "\x1b[24~"},
401
402 {0x00, 0x49, "\x1b[2~"},
403
404 {0x00, 0x4a, "\x1b[H"},
405
406 {0x00, 0x4b, "\x1b[5~"},
407
408 {0x00, 0x4c, "\x1b[3~"},
409
410 {0x00, 0x4d, "\x1b[F"},
411
412 {0x00, 0x4e, "\x1b[6~"},
413
414 {0x00, 0x4f, "\x1b[C"},
415
416 {0x00, 0x50, "\x1b[D"},
417
418 {0x00, 0x51, "\x1b[B"},
419
420 {0x00, 0x52, "\x1b[A"},
421#endif
422
423
424 {0x00, 0x00, "\0"}
425 };
426
427
428 state_set_skip_delays(true);
429 ut_assertok(usb_init());
430
431
432 ut_asserteq(0, tstc());
433
434 ut_assertok(uclass_get_device_by_name(UCLASS_USB_EMUL, "keyb@3",
435 &dev));
436
437
438
439
440
441 for (pos = kbd_test_data; pos->scancode; ++pos) {
442 const char *c;
443 char scancodes[USB_KBD_BOOT_REPORT_SIZE] = {0};
444
445 scancodes[0] = pos->modifiers;
446 scancodes[2] = pos->scancode;
447
448 ut_assertok(sandbox_usb_keyb_add_string(dev, scancodes));
449
450 for (c = pos->result; *c; ++c) {
451 ut_asserteq(1, tstc());
452 ut_asserteq(*c, getchar());
453 }
454 ut_asserteq(0, tstc());
455 }
456 ut_assertok(usb_stop());
457
458 return 0;
459}
460DM_TEST(dm_test_usb_keyb, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
461