USB ==== The Universal Serial Bus (USB) can be utilized for many functions on the development kit, including external media. The phyCORE-AM64x System-on-Module (SOM) provides one USB 3.1 Gen 1 Dual-Role Device (DRD) Subsystem (USB0) which can be utilized as a USB 2.0 port with OTG functionality or as a USB 3.1 port with USB 3.1 Gen 1 and xHCI 1.1 specification. The full pinout of the USB 3.1 controller includes the signaling for both USB 3.1 and USB 2.0. This means that USB0 can be used as either a USB 3.1 port or a USB 2.0 port. This guide will show you how to use the USB Host capabilities featured on the phyCORE-AM64x development kit. To learn more information about the phyCORE-AM64x USB interface, please see section 7.8 in the `Hardware Manual `_. The USB0 interface uses a USB HUB to split the bus to 4x locations. .. list-table:: USB0 Split by USB Hub :header-rows: 1 * - Type - Qty - Header Location - Speed - Bus * - USB A Double Stacked - 2 - X13 - 3.1 - 002 * - Mini PCIe - 1 - X31 - 2.0 - 001 * - Pin Header - 1 - X27 (Pin 21, 22, 37, 39) - 2.0 - 001 .. image:: ../../images/phycore-am64x/pb-07225_usb.png :width: 600px :alt: phyCORE-AM64x USB Connections on the Front .. image:: ../../images/phycore-am64x/pb-07225_usb_backside.png :width: 600px :alt: phyCORE-AM64x miniPCIe Connector Location .. warning:: The USB super speed signals are muxed between the miniPCIe interface and the USB HUB. Enabling miniPCIe will disable USB3.0 speeds at the stacked type-A USB connector but USB2.0 speeds will still be available. Requirements ------------- * `USB Storage Device `_ Development Kit Setup ---------------------- * First, 'poweroff' the development kit. .. code-block:: none :caption: Target (Linux) poweroff * Power on the development kit and stop in U-Boot when prompted. * Enable the device tree overlay. .. code-block:: none :caption: Target (U-Boot) setenv overlays k3-am64-phyboard-electra-rdk-pcie-usb2.dtbo boot .. note:: For more information about overlays see chapter :ref:`ConfiguringTheBootloader-64`. Verifying USB Interface ------------------------ * With the phyCORE-AM64x development kit booted into Linux, see that there are 4 USB devices. There should be 2 devices on each bus. .. code-block:: none :caption: Target (Linux) lsusb .. code-block:: none :caption: Expected Output Bus 002 Device 001: ID 1d6b:0003 Linux 6.1.33-bsp-yocto-ampliphy-am64x-pd23.2.0 xhci-hcd xHCI Host Controller Bus 001 Device 002: ID 0451:8242 Bus 001 Device 001: ID 1d6b:0002 Linux 6.1.33-bsp-yocto-ampliphy-am64x-pd23.2.0 xhci-hcd xHCI Host Controller * Insert a USB3.0 storage device into the top connector on X13. You should see something like the following on the serial console: .. code-block:: none :caption: Expected Output root@phyboard-electra-am64xx-2:~# [ 30.428000] usb 1-1.1: new high-speed USB device number 4 using xhci-hcd [ 30.532866] usb 1-1.1: New USB device found, idVendor=0781, idProduct=5591, bcdDevice= 1.00 [ 30.541258] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 30.548583] usb 1-1.1: Product: SanDisk 3.2Gen1 [ 30.553247] usb 1-1.1: Manufacturer: USB [ 30.557275] usb 1-1.1: SerialNumber: 0401a83fbd697e437712b826697973aaaf57d1c75e9691ad879dfe7934b8a81bea020000000000000000000037ac13c5ff935d18915581076e2cc649 [ 30.573038] usb-storage 1-1.1:1.0: USB Mass Storage device detected [ 30.580206] scsi host0: usb-storage 1-1.1:1.0 [ 31.609115] scsi 0:0:0:0: Direct-Access USB SanDisk 3.2Gen1 1.00 PQ: 0 ANSI: 6 [ 31.622632] sd 0:0:0:0: [sda] 30031872 512-byte logical blocks: (15.4 GB/14.3 GiB) [ 31.636317] sd 0:0:0:0: [sda] Write Protect is off [ 31.641991] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 31.664047] sd 0:0:0:0: [sda] Attached SCSI removable disk * Re-run the *'lsusb'* command and verify that the USB drive connected to bus 002. .. code-block:: none :caption: Target (Linux) lsusb .. code-block:: none :caption: Expected Output root@phyboard-electra-am64xx-2:~# lsusb Bus 002 Device 001: ID 1d6b:0003 Linux 6.1.33-bsp-yocto-ampliphy-am64x-pd23.2.0 xhci-hcd xHCI Host Controller Bus 001 Device 004: ID 0781:5591 USB SanDisk 3.2Gen1 Bus 001 Device 002: ID 0451:8242 Bus 001 Device 001: ID 1d6b:0002 Linux 6.1.33-bsp-yocto-ampliphy-am64x-pd23.2.0 xhci-hcd xHCI Host Controller * To list more information about the USB device and buses on the development kit use the following command. This command will output a good chunk of information. This guide will only show a snippet of the expected output for the USB drive that was just connected. .. code-block:: none :caption: Target (Linux) lsusb -v -s 001:004 .. note:: "001" refers to bus 001 and "004" refers to the device number, both of these can be found in the *lsusb* command. .. code-block:: none :caption: Expected Output for Example USB Drive Bus 001 Device 004: ID 0781:5591 USB SanDisk 3.2Gen1 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.10 bDeviceClass 0 bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0781 idProduct 0x5591 bcdDevice 1.00 iManufacturer 1 USB iProduct 2 SanDisk 3.2Gen1 iSerial 3 0401a83fbd697e437712b826697973aaaf57d1c75e9691ad879dfe7934b8a81bea020000000000000000000037ac13c5ff935d18915581076e2cc649 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 0x0020 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) ..continues.. * The speed of the USB device can be determined with either the *lsusb -v* from above or by reading the device's "speed" .. code-block:: none :caption: Target (Linux) cat /sys/bus/usb/devices/usb2/speed .. code-block:: none :caption: Expected Output root@phyboard-electra-am64xx-2:~# cat /sys/bus/usb/devices/usb2/speed 5000 .. note:: USB3.0 has transmission speeds up to 5000 Mbit/s, also known as "super speed". USB2.0 has transmission speeds up to 480Mbit/s, also known as "full speed". Mounting USB Stroage Devices ----------------------------- * Verify that a device directory was established for the USB drive. #. Run the following command to confirm the USB device name. .. code-block:: none :caption: Target (Linux) ls /dev/sd* .. code-block:: none :caption: Expected Output root@phyboard-electra-am64xx-2:~# ls /dev/sd* /dev/sda #. Remove the USB drive. #. Re-run the *'ls /dev/sd'* command to confirm the device name. .. code-block:: none :caption: Expected Output root@phyboard-electra-am64xx-2:~# ls /dev/sd* /dev/sda #. Re-insert the USB drive to the top connector of X13. .. note:: In this example the device name for the USB drive is "sda". * Make a directory for mounting the USB device. .. code-block:: none :caption: Target (Linux) mkdir ~/usb_sda * Format file type. .. code-block:: none :caption: Target (Linux) mkfs.vfat /dev/sda * Mount the USB device to the directory. .. code-block:: none :caption: Target (Linux) mount /dev/sda ~/usb_sda/ * See what media is on the USB drive. .. code-block:: none :caption: Target (Linux) ls ~/usb_sda/ Write to the USB Host Device ------------------------------ * Generate a random 10 MB file to test transferring data from the storage device. .. code-block:: none :caption: Target (Linux) dd if=/dev/urandom of=test.file count=10 bs=1M .. code-block:: none :caption: Expected Output root@phyboard-electra-am64xx-2:~# dd if=/dev/urandom of=test.file count=10 bs=1M 10+0 records in 10+0 records out 10485760 bytes (10 MB, 10 MiB) copied, 0.216022 s, 48.5 MB/s * Copy the file to your storage device. .. code-block:: none :caption: Target (Linux) cp test.file ~/usb_sda/ && sync Read from the USB Host Device ------------------------------ * Copy the test file we previously created during the write process back to the host: .. code-block:: none :caption: Target (Linux) cp ~/usb_sda/test.file readback-usb.file && sync * We can double check that the file was successfully copied to and from the USB device by checking the md5sum of the file: .. code-block:: none :caption: Target (Linux) md5sum test.file readback-usb.file .. code-block:: none :caption: Expected Output root@phyboard-electra-am64xx-2:~# md5sum test.file readback-usb.file d3aa3ee1db746d6f7fb66c9b42f4ea6b test.file d3aa3ee1db746d6f7fb66c9b42f4ea6b readback-usb.file Unmounting the Drive --------------------- .. warning:: **Make sure the drive is unmounted prior to physically disconnecting the device.** Failure to do so may result in loss of data and corruption of files .. code-block:: none :caption: Target (Linux) umount ~/usb_sda/ umount /dev/sda