.. zephyr:code-sample:: testusb-app
:name: USB testing application
:relevant-api: _usb_device_core_api
Test USB device drivers using a loopback function.
This sample implements a loopback function that can be used
to test USB device drivers and the device stack connected to a Linux host
and has a similar interface to "Gadget Zero" of the Linux kernel.
The userspace tool ``testusb`` is needed to start the tests.
Building and flashing
*********************
Follow the general procedure for building and flashing Zephyr device.
Testing
*******
To run USB tests:
#. Load the ``usbtest`` Linux kernel module on the Linux Host.
.. code-block:: console
$ sudo modprobe usbtest vendor=0x2fe3 product=0x0009
The ``usbtest`` module should claim the device:
.. code-block:: console
[21746.128743] usb 9-1: new full-speed USB device number 16 using uhci_hcd
[21746.303051] usb 9-1: New USB device found, idVendor=2fe3, idProduct=0009, bcdDevice= 2.03
[21746.303055] usb 9-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[21746.303058] usb 9-1: Product: Zephyr testusb sample
[21746.303060] usb 9-1: Manufacturer: ZEPHYR
[21746.303063] usb 9-1: SerialNumber: 86FE679A598AC47A
[21746.306149] usbtest 9-1:1.0: matched module params, vend=0x2fe3 prod=0x0009
[21746.306153] usbtest 9-1:1.0: Generic USB device
[21746.306156] usbtest 9-1:1.0: full-speed {control} tests
#. Use the ``testusb`` tool in ``linux/tools/usb`` inside Linux kernel source directory
to start the tests.
.. code-block:: console
$ sudo ./testusb -D /dev/bus/usb/009/016
/dev/bus/usb/009/016 test 0, 0.000007 secs
/dev/bus/usb/009/016 test 9, 4.994475 secs
/dev/bus/usb/009/016 test 10, 11.990054 secs
#. To run all the tests the Zephyr's VID / PID should be inserted to USB
driver id table. The method for loading the ``usbtest`` driver for our
device is described here: https://lwn.net/Articles/160944/.
Since we use the "Gadget Zero" interface we specify reference device
``0525:a4a0``.
.. code-block:: console
$ sudo sh -c "echo 0x2fe3 0x0009 0 0x0525 0xa4a0 > /sys/bus/usb/drivers/usbtest/new_id"
#. Use the ``testusb`` tool in ``linux/tools/usb`` inside Linux kernel source directory
to start the tests.
.. code-block:: console
$ sudo ./testusb -v 512 -D /dev/bus/usb/009/016
/dev/bus/usb/009/017 test 0, 0.000008 secs
/dev/bus/usb/009/017 test 1, 2.000001 secs
/dev/bus/usb/009/017 test 2, 2.003058 secs
/dev/bus/usb/009/017 test 3, 1.054082 secs
/dev/bus/usb/009/017 test 4, 1.001010 secs
/dev/bus/usb/009/017 test 5, 57.962142 secs
/dev/bus/usb/009/017 test 6, 35.000096 secs
/dev/bus/usb/009/017 test 7, 30.000063 secs
/dev/bus/usb/009/017 test 8, 18.000159 secs
/dev/bus/usb/009/017 test 9, 4.984975 secs
/dev/bus/usb/009/017 test 10, 11.991022 secs
/dev/bus/usb/009/017 test 11, 17.030996 secs
/dev/bus/usb/009/017 test 12, 17.103034 secs
/dev/bus/usb/009/017 test 13, 18.022084 secs
/dev/bus/usb/009/017 test 14, 2.458976 secs
/dev/bus/usb/009/017 test 17, 2.001089 secs
/dev/bus/usb/009/017 test 18, 1.998975 secs
/dev/bus/usb/009/017 test 19, 2.010055 secs
/dev/bus/usb/009/017 test 20, 1.999911 secs
/dev/bus/usb/009/017 test 21, 2.440972 secs
/dev/bus/usb/009/017 test 24, 55.112078 secs
/dev/bus/usb/009/017 test 27, 56.911052 secs
/dev/bus/usb/009/017 test 28, 34.163089 secs
/dev/bus/usb/009/017 test 29, 3.983999 secs