]> git.sur5r.net Git - u-boot/blobdiff - test/dm/usb.c
Merge branch 'master' of git://git.denx.de/u-boot-uniphier
[u-boot] / test / dm / usb.c
index 721d3ad2072936227e5c72752bbecefd43430ff1..b46ae6060207b53022b0679949eaf59687db7653 100644 (file)
@@ -10,6 +10,7 @@
 #include <usb.h>
 #include <asm/io.h>
 #include <asm/state.h>
+#include <asm/test.h>
 #include <dm/device-internal.h>
 #include <dm/test.h>
 #include <dm/uclass-internal.h>
@@ -38,19 +39,20 @@ DM_TEST(dm_test_usb_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 static int dm_test_usb_flash(struct unit_test_state *uts)
 {
        struct udevice *dev;
-       block_dev_desc_t *dev_desc;
+       struct blk_desc *dev_desc;
        char cmp[1024];
 
        state_set_skip_delays(true);
        ut_assertok(usb_init());
        ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
-       ut_assertok(get_device("usb", "0", &dev_desc));
+       ut_assertok(blk_get_device_by_str("usb", "0", &dev_desc));
 
        /* Read a few blocks and look for the string we expect */
        ut_asserteq(512, dev_desc->blksz);
        memset(cmp, '\0', sizeof(cmp));
-       ut_asserteq(2, dev_desc->block_read(dev_desc->dev, 0, 2, cmp));
+       ut_asserteq(2, blk_dread(dev_desc, 0, 2, cmp));
        ut_assertok(strcmp(cmp, "this is a test"));
+       ut_assertok(usb_stop());
 
        return 0;
 }
@@ -66,6 +68,7 @@ static int dm_test_usb_multi(struct unit_test_state *uts)
        ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
        ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev));
        ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
+       ut_assertok(usb_stop());
 
        return 0;
 }
@@ -107,9 +110,9 @@ static int dm_test_usb_remove(struct unit_test_state *uts)
        ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 0, &dev));
        ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 1, &dev));
        ut_assertok(uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
-       ut_asserteq(5, count_usb_devices());
+       ut_asserteq(6, count_usb_devices());
        ut_assertok(usb_stop());
-       ut_asserteq(5, count_usb_devices());
+       ut_asserteq(6, count_usb_devices());
 
        /* Remove the second emulation device */
        ut_assertok(uclass_find_device_by_name(UCLASS_USB_EMUL, "flash-stick@1",
@@ -127,9 +130,9 @@ static int dm_test_usb_remove(struct unit_test_state *uts)
 
        ut_asserteq(-ENODEV, uclass_get_device(UCLASS_MASS_STORAGE, 2, &dev));
 
-       ut_asserteq(4, count_usb_devices());
+       ut_asserteq(5, count_usb_devices());
        ut_assertok(usb_stop());
-       ut_asserteq(4, count_usb_devices());
+       ut_asserteq(5, count_usb_devices());
 
        return 0;
 }
@@ -146,7 +149,10 @@ const char usb_tree_base[] =
 "  |    sandbox flash flash-stick@1\n"
 "  |  \n"
 "  |\b+-4  Mass Storage (12 Mb/s, 100mA)\n"
-"       sandbox flash flash-stick@2\n"
+"  |    sandbox flash flash-stick@2\n"
+"  |  \n"
+"  |\b+-5  Human Interface (12 Mb/s, 100mA)\n"
+"       sandbox keyboard keyb@3\n"
 "     \n";
 
 /* test that the 'usb tree' command output looks correct */
@@ -177,7 +183,10 @@ const char usb_tree_remove[] =
 "  |    sandbox flash flash-stick@0\n"
 "  |  \n"
 "  |\b+-3  Mass Storage (12 Mb/s, 100mA)\n"
-"       sandbox flash flash-stick@2\n"
+"  |    sandbox flash flash-stick@2\n"
+"  |  \n"
+"  |\b+-4  Human Interface (12 Mb/s, 100mA)\n"
+"       sandbox keyboard keyb@3\n"
 "     \n";
 
 /*
@@ -208,3 +217,86 @@ static int dm_test_usb_tree_remove(struct unit_test_state *uts)
        return 0;
 }
 DM_TEST(dm_test_usb_tree_remove, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+const char usb_tree_reorder[] =
+"  1  Hub (12 Mb/s, 100mA)\n"
+"  |  sandbox hub 2345\n"
+"  |\n"
+"  |\b+-2  Mass Storage (12 Mb/s, 100mA)\n"
+"  |    sandbox flash flash-stick@0\n"
+"  |  \n"
+"  |\b+-3  Mass Storage (12 Mb/s, 100mA)\n"
+"  |    sandbox flash flash-stick@2\n"
+"  |  \n"
+"  |\b+-4  Human Interface (12 Mb/s, 100mA)\n"
+"  |    sandbox keyboard keyb@3\n"
+"  |  \n"
+"  |\b+-5  Mass Storage (12 Mb/s, 100mA)\n"
+"       sandbox flash flash-stick@1\n"
+"     \n";
+
+/*
+ * test that the 'usb tree' command output looks correct when we reorder two
+ * devices.
+ */
+static int dm_test_usb_tree_reorder(struct unit_test_state *uts)
+{
+       struct udevice *dev, *parent;
+       char *data;
+       int len;
+
+       /* Remove the second emulation device */
+       ut_assertok(uclass_find_device_by_name(UCLASS_USB_EMUL, "flash-stick@1",
+                                              &dev));
+       parent = dev->parent;
+
+       /* Reorder the devices in the parent list and uclass list */
+       list_del(&dev->sibling_node);
+       list_add_tail(&dev->sibling_node, &parent->child_head);
+
+       list_del(&dev->uclass_node);
+       list_add_tail(&dev->uclass_node, &dev->uclass->dev_head);
+
+       state_set_skip_delays(true);
+       ut_assertok(usb_init());
+       console_record_reset_enable();
+       usb_show_tree();
+       len = membuff_getraw(&gd->console_out, -1, true, &data);
+       if (len)
+               data[len] = '\0';
+       ut_asserteq_str(usb_tree_reorder, data);
+       ut_assertok(usb_stop());
+
+       return 0;
+}
+DM_TEST(dm_test_usb_tree_reorder, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+
+static int dm_test_usb_keyb(struct unit_test_state *uts)
+{
+       struct udevice *dev;
+
+       state_set_skip_delays(true);
+       ut_assertok(usb_init());
+
+       /* Initially there should be no characters */
+       ut_asserteq(0, tstc());
+
+       ut_assertok(uclass_get_device_by_name(UCLASS_USB_EMUL, "keyb",
+                                             &dev));
+
+       /*
+        * Add a string to the USB keyboard buffer - it should appear in
+        * stdin
+        */
+       ut_assertok(sandbox_usb_keyb_add_string(dev, "ab"));
+       ut_asserteq(1, tstc());
+       ut_asserteq('a', getc());
+       ut_asserteq(1, tstc());
+       ut_asserteq('b', getc());
+       ut_asserteq(0, tstc());
+
+       ut_assertok(usb_stop());
+
+       return 0;
+}
+DM_TEST(dm_test_usb_keyb, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);