News Archive (1999-2012) | 2013-current at LinuxGizmos | Current Tech News Portal |    About   

About the new Linux USB Device support

Apr 15, 2002 — by LinuxDevices Staff — from the LinuxDevices Archive — views

Lineo has released Linux USB Device software, which was developed to support the Sharp Zaurus Linux PDA, under the GNU GPL open source license. The software can be freely downloaded from Lineo's open source website. This software provides a “stack” which implements USB Devices under Linux.

“But doesn't the Linux kernel (2.4 and later) already contain built-in USB support?”, you ask.

Well yes; and no. Read on . . .

One key point to understand about the architecture of USB is that it based on a strict master/slave relationship. On any USB bus, there is a single master, generally referred to as a USB Host, and there can be multiple slaves, generally referred to as USB Devices. The USB support that is present in the currently released Linux kernel implements the USB Host function, only. Therefore, for a device which uses Embedded Linux as it's internal OS to act as a USB Device, new support was required.

A second important point about USB is that it implements a (usually reliable) data transport layer between the USB Host and the various USB Devices that are attached to it. But there is no specific device model, such as a serial or printer port, NIC, CDROM, etc., implemented by USB. Instead each USB Device implements a function that talks to a driver on the USB Host, that knows what the USB Function does (e.g. a serial or printer port, NIC, CDROM, etc.).

The typical way the USB Host implementations do this, under both Windows and Linux, is to seperate the high level protocol handlers into seperate drivers (typically called class or client) that are independant of the actual host interface drivers (usually UHCI or OHCI for most desktop computers).

So what we did was to implement a similar structure on the USB Device side, resulting in something like the following:

Currently you must compile the USB Device stack in the kernel environement. That is, untar the source in linux/drivers and make a couple of minor changes (typically drivers/Makefile and arch/???/config.in). The end result is three modules, typically something like . . .

  • usbdcore.o
  • net_fd.o
  • sa1100_bi.o
. . . which are then loaded to implement what looks like a network interface using USB to connect you to the USB Host.

Currently, there are two available function drivers . . .

  • network
  • serial
And there are bus interface drivers for . . .
  • StrongARM SA1110
  • ScanLogic SL11
  • Linkup L7205
  • Hitachi SH7727
. . . with work in progress to support Xscale and several other platforms.

The data path has been optimized for speed. For example, on a 206Mhz StrongARM (e.g. Sharp Zaurus), it is possible to download (Host to Device) at up to 850Kbytes/sec and upload (Device to Host) at 800Kbytes/sec (urlget over network connection). This is fairly close to the maximum throughput available for transfers using Bulk IO transactions.

For the Embedded developer, the following questions need to be asked . . .

  1. What bus interface driver?
  2. What function driver?
  3. What class driver for Linux?
  4. what class driver for Windows?
If the device already has a bus interface driver implemented, then it should not be difficult to use. However, depending on the device, some adaptation may be required. It may be necessary to support things like detecting when the device is attached to the bus, and controlling when the device enables itself onto the bus. Such functions are not always implemented in the basic USB function hardware.

If the required function driver has been implemented (currently serial and network), then it should work without change. If a new function is required, then it would be implemented as a separate driver module.

Typically, for testing, at least a Linux USB Host Client driver will be required (again, both serial and network compatible client drivers have already been implemented). If a new function is being developed, then a new Linux Host driver may also be required — unless an existing driver can be used, or modified for use.

Finally, the most difficult (or expensive) decision is, in many ways, determining what to use for a Windows USB Host Client driver. In some cases, it may be possible to use an existing (i.e. provided by Microsoft) driver. But in many cases, if your underlying USB Device hardware does not have enough resources (endpoints, ability to support multiple interfaces), then a custom driver may be required. Commercial USB device drivers exist that can be licensed, or a driver can be implemented from scratch. Unfortunately, few high quality open source drivers for Windows are currently available.




About the author: Stuart Lynne, a Senior Engineer at Lineo Inc., has been a Unix/Linux developer since 1984. He has worked on fax software, web servers, network authentication via radius and LDAP, mail, and imap servers, and network, 802.11 wireless, flash, and USB drivers.

 
This article was originally published on LinuxDevices.com and has been donated to the open source community by QuinStreet Inc. Please visit LinuxToday.com for up-to-date news and articles about Linux and open source.



Comments are closed.