USB in the Solaris Environment
The Solaris USB architecture includes the USBA 2.0 framework and USB client drivers.
USBA 2.0 Framework
The USBA 2.0 framework is a service layer that presents an abstract view
of USB devices to USBA-compliant client drivers. The framework enables USBA-compliant client drivers to
manage their USB devices. The USBA 2.0 framework supports the USB 2.0 specification except for
high speed isochronous pipes. For information on the USB 2.0 specification, see https://www.usb.org/.
The USBA 2.0 framework is platform-independent. The Solaris USB architecture is shown in the
following figure. The USBA 2.0 framework is the USBA layer in the figure. This
layer interfaces through a hardware-independent host controller driver interface to hardware-specific host controller
drivers. The host controller drivers access the USB physical devices through the host
controllers they manage.
Figure 20-1 Solaris USB Architecture
USB Client Drivers
The USBA 2.0 framework is not a device driver itself. This chapter describes
the client drivers shown in Figure 20-1 and Figure 20-2. The client drivers interact with various
kinds of USB devices such as mass storage devices, printers, and human interface
devices. The hub driver is a client driver that is also a nexus
driver. The hub driver enumerates devices on its ports and creates devinfo
nodes for those devices and then attaches the client drivers. This chapter does
not describe how to write a hub driver.
USB drivers have the same structure as any other Solaris driver. USB drivers
can be block drivers, character drivers, or STREAMS drivers. USB drivers follow the
calling conventions and use the data structures and routines described in the Solaris
OS section 9 man pages. See Intro(9E), Intro(9F), and Intro(9S).
The difference between USB drivers and other Solaris drivers is that USB drivers
call USBA 2.0 framework functions to access the device instead of directly accessing the
device. The USBA 2.0 framework supplements the standard Solaris DDI routines. See the following
figure.
Figure 20-2 Driver and Controller Interfaces
Figure 20-2 shows interfaces in more detail than Figure 20-1 does. Figure 20-2 shows that the
USBA is a kernel subsystem into which a client driver can call, just
as a client driver can call DDI functions.
Not all systems have all of the host controller interfaces shown in
Figure 20-2. OHCI (Open Host Controller Interface) hardware is most prevalent on SPARC systems
and third-party USB PCI cards. UHCI (Universal Host Controller Interface) hardware is most
prevalent on x86 systems. However, both OHCI and UHCI hardware can be
used on any system. When EHCI (Enhanced Host Controller Interface) hardware is present,
the EHCI hardware is on the same card and shares the same ports
with either OHCI or UHCI.
The host controllers, host controller drivers, and HCDI make up a transport layer
that is commanded by the USBA. You cannot directly call into the
OHCI, EHCI, or UHCI. You call into them indirectly through the platform-independent USBA interface.