NOTICE: The Processors Wiki will End-of-Life in December of 2020. It is recommended to download any files or other content you may need that are hosted on The site is now set to read only.

Networking over USB

From Texas Instruments Wiki
Jump to: navigation, search


  • 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

This section will cover how to configure the DaVinci hardware as a USB peripheral device.


  • J9 jumpered
  • J10 un-jumpered

Host PC

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

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

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 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 up
 PING ( 56(84) bytes of data.
 64 bytes from icmp_seq=1 ttl=64 time=7.49 ms
 64 bytes from 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

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 bs=1M count=100
 time ( cat | nc -q 0 3000 )
 real    1m8.690s
 user    0m0.012s
 sys     0m0.404s

Therefore the throughput = ( 100MB * 8 / 68 sec ) = 11.76 Mbps


  • 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...