The Universal Serial Bus (USB) is a new way of attaching devices to personal
computers. The bus architecture features two-way communication and has been developed as
a response to devices becoming smarter and requiring more interaction with the host. USB
support is included in all current PC chipsets and is therefore available in all recently
built PCs. Apple's introduction of the USB-only iMac has been a major incentive for
hardware manufacturers to produce USB versions of their devices. The future PC
specifications specify that all legacy connectors on PCs should be replaced by one or
more USB connectors, providing generic plug and play capabilities. Support for USB
hardware was available at a very early stage in NetBSD and was developed by Lennart
Augustsson for the NetBSD project. The code has been ported to FreeBSD and we are
currently maintaining a shared code base. For the implementation of the USB subsystem a
number of features of USB are important.
Lennart Augustsson has done most of the
implementation of the USB support for the NetBSD project. Many thanks for this incredible
amount of work. Many thanks also to Ardy and Dirk for their comments and proofreading of
this paper.
-
Devices connect to ports on the computer directly or on devices called hubs, forming a
treelike device structure.
-
The devices can be connected and disconnected at run time.
-
Devices can suspend themselves and trigger resumes of the host system
-
As the devices can be powered from the bus, the host software has to keep track of
power budgets for each hub.
-
Different quality of service requirements by the different device types together with
the maximum of 126 devices that can be connected to the same bus, require proper
scheduling of transfers on the shared bus to take full advantage of the 12Mbps bandwidth
available. (over 400Mbps with USB 2.0)
-
Devices are intelligent and contain easily accessible information about themselves
The development of drivers for the USB subsystem and devices connected to it is
supported by the specifications that have been developed and will be developed. These
specifications are publicly available from the USB home pages. Apple has been very strong
in pushing for standards based drivers, by making drivers for the generic classes
available in their operating system MacOS and discouraging the use of separate drivers
for each new device. This chapter tries to collate essential information for a basic
understanding of the present implementation of the USB stack in FreeBSD/NetBSD. It is
recommended however to read it together with the relevant specifications mentioned in the
references below.
The USB support in FreeBSD can be split into three layers. The lowest layer contains
the host controller driver, providing a generic interface to the hardware and its
scheduling facilities. It supports initialisation of the hardware, scheduling of
transfers and handling of completed and/or failed transfers. Each host controller driver
implements a virtual hub providing hardware independent access to the registers
controlling the root ports on the back of the machine.
The middle layer handles the device connection and disconnection, basic initialisation
of the device, driver selection, the communication channels (pipes) and does resource
management. This services layer also controls the default pipes and the device requests
transferred over them.
The top layer contains the individual drivers supporting specific (classes of)
devices. These drivers implement the protocol that is used over the pipes other than the
default pipe. They also implement additional functionality to make the device available
to other parts of the kernel or userland. They use the USB driver interface (USBDI)
exposed by the services layer.