NOTICE: The Processors Wiki will End-of-Life on January 15, 2021. It is recommended to download any files or other content you may need that are hosted on processors.wiki.ti.com. The site is now set to read only.
Networking over USB
Contents
Prerequisites[edit]
- A DaVinci DM355 EVM (USB peripheral device)
- A computer running Linux (USB Host)
- TI DaVinci LSP kernel source
- A USB A to mini-B cable
Configuring the EVM Hardware[edit]
This section will cover how to configure the DaVinci hardware as a USB peripheral device.
DM355[edit]
- J9 jumpered
- J10 un-jumpered
Host PC[edit]
Connect the USB cable to a standard USB A socket. Connect the USB Mini-B end of the cable to the DM355 EVM (J5).
Kernel Config[edit]
USB Support:
< > Support for Host-side USB <M> Inventra USB Highspeed Dual Role Controller Support --- DaVinci 644x USB support Driver Mode (USB Peripheral (gadget stack)) ---> [*] Disable DMA (always use PIO) (0) Logging Level (0 - none / 3 - annoying / ... ) --- NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information USB Gadget Support --->
USB Gedget Support:
<M> Support for USB Gadgets [*] Debugging information files USB Peripheral Controller (Inventra (M)HDRC USB Peripheral) ---> USB Gadget Drivers < > Gadget Zero (DEVELOPMENT) <M> Ethernet Gadget [*] RNDIS support (EXPERIMENTAL) < > Gadget Filesystem (EXPERIMENTAL) < > File-backed Storage Gadget < > Serial Gadget
Network Operation[edit]
Connect the DM355 EVM to the Host PC via the USB cable.
Set the DM355 up as a Network Gadget:
modprobe musb_hdrc use_dma=n modprobe g_ether ifconfig usb0 10.0.0.2 up
Output from dmesg on the DM355 EVM:
musb_hdrc: version 2.2a/db-0.4.8 [cppi-dma] [peripheral] [debug=0] Registering platform device 'musb_hdrc'. Parent at platform musb_hdrc: ConfigData=0x06 (UTMI-8, dyn FIFOs, SoftConn) musb_hdrc: MHDRC RTL version 1.300 musb_hdrc: setup fifo_mode 4 musb_hdrc: hw_ep 0shared, max 64 musb_hdrc: hw_ep 1tx, max 512 musb_hdrc: hw_ep 1rx, max 512 musb_hdrc: hw_ep 2tx, max 512 musb_hdrc: hw_ep 2rx, max 512 musb_hdrc: hw_ep 3tx, max 512 musb_hdrc: hw_ep 3rx, max 512 musb_hdrc: hw_ep 4tx, max 512 musb_hdrc: hw_ep 4rx, max 256 musb_hdrc: USB Peripheral mode controller at c886e000 using PIO, IRQ 12 usb0: Ethernet Gadget, version: Equinox 2004 usb0: using musb_hdrc, OUT ep1out IN ep1in STATUS ep2in usb0: MAC de:b8:d7:c3:54:27 usb0: HOST MAC 66:ae:d1:47:3a:32 usb0: RNDIS ready usb0: high speed config #3: 100 mA, Ethernet Gadget, using CDC Ethernet
The Host PC (running Linux) should have automatically loaded the necessary drivers for the USB CDC class: cdc_ether and usbnet.
Bring the network up and ping the USB device:
ifconfig usb0 10.0.0.1 up ping 10.0.0.2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=7.49 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.390 ms
Output from dmesg on the Host PC:
usb 7-4: new high speed USB device using ehci_hcd and address 14 usb 7-4: configuration #3 chosen from 2 choices usb0: register 'cdc_ether' at usb-0000:00:1a.7-4, CDC Ethernet Device, 66:ae:d1:47:3a:32
Throughput Testing[edit]
Netcat is a very useful tool for sending and receiving data over the network.
Setup the DM355 EVM to receive data from the Host PC:
nc -l -p 3000 > /dev/null
Create a test file on the Host PC and send this over the network to the USB device:
dd if=/dev/urandom of=100M-random.data bs=1M count=100 time ( cat 100M-random.data | nc -q 0 10.0.0.2 3000 ) real 1m8.690s user 0m0.012s sys 0m0.404s
Therefore the throughput = ( 100MB * 8 / 68 sec ) = 11.76 Mbps
Conclusion[edit]
- The g_ether driver does not seem to work when musb_hdrc is using DMA, and tests using the g_file_storage driver show that PIO is 5 times slower. Perhaps patches have been submitted to fix this.
- The above result is very close to 12Mbps, which is the maximum for full-speed USB. Is this a coincidence, or is something preventing high-speed USB rates ?
I expected the throughput to be much higher...