USB stands for Universal Serial Bus and is basically an external interface standard that enables communication between the computer and various other peripherals. Some of the most commonly used USB devices today are keyboards, mice, pen drives, digital cameras, external CD & DVD writers, printers etc.
There are currently two versions of USB in use, i.e. USB 1.1 and USB 2.0.
Since USB has always been backward compatible with its previous versions,
USB 2.0 is backwards compatible with USB 1.1. The latest USB devices are
typically USB 2.0 compatible. USB 2.0 supports a maximum data transmission
speed of 480 Mbps or 60 MBps and this is the major difference between the two
standards. Another advantage with USB is that the devices are all
Before we go onto the exact configuration options in the kernel, it would
be apt to look at USB in a little more detail. If you're in a hurry or want
to skip this section, please go to
A USB system has a host controller, hubs, a
The hardware vendor provides an interface for the programmer that allows the system to interact with the hardware and this is called the HCD or Host Controller Device. It is through this HCD that the device interacts with the system software. The following diagram should make things easier to comprehend.
(Software consists of other components as well like the device driver, but for the sake of simplicity, they are not shown) + ---- Hardware ---- + ---- Software ---- + | | | | [USB Dev] -+-> {EHCI} -+---> ( EHCD ) | | | | | User | `-> {UHCI} -+---> ( UHCD ) | | | | + ---- Hardware ---- + ---- Software ---- +
A USB device can either use a custom driver or use one already present in
the system and this is based on the concept of a device
It is very simple to find out whether your machine has USB 2.0 support or not.
We make use of the
(In system that is USB 1.1 compliant, note the UHCI only) # lspci -v | grep USB 0000:00:04.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB (rev 01) (prog-if 00 [UHCI])(A system that is USB 2.0 compliant, note the EHCI and UHCI) 00:1d.0 USB Controller: Intel Corp. 82801DB USB (Hub #1) (rev 01) (prog-if 00 [UHCI]) 00:1d.1 USB Controller: Intel Corp. 82801DB USB (Hub #2) (rev 01) (prog-if 00 [UHCI]) 00:1d.2 USB Controller: Intel Corp. 82801DB USB (Hub #3) (rev 01) (prog-if 00 [UHCI]) 00:1d.7 USB Controller: Intel Corp. 82801DB USB EHCI Controller (rev 01) (prog-if 20 [EHCI])
So using the
First emerge the kernel sources of your choice. Here we'll use the
# emerge gentoo-sources
Now, lets get on with the task of configuring the kernel.
# cd /usr/src/linux # make menuconfig
Now we will look at some of the options we will have to enable in the 2.6
kernel to ensure proper USB support for our devices. If you are using a 2.4
kernel, please proceed with
Device Drivers ---> SCSI device support --->(Although SCSI will be enabled automatically when selecting USB Mass Storage, we need to enable disk support.) --- SCSI support type (disk, tape, CD-ROM) <*> SCSI disk support(Then move back a level and go into USB support) USB support --->(This is the root hub and is required for USB support. If you'd like to compile this as a module, it will be called usbcore.) <*> Support for Host-side USB(Enable this option to see your USB devices in /proc/bus/usb. This is recommended.) [*] USB device filesystem(Select at least one of the HCDs. If you are unsure, picking all is fine.) --- USB Host Controller Drivers <*> EHCI HCD (USB 2.0) support < > OHCI HCD support <*> UHCI HCD (most Intel and VIA) support(Moving a little further down, we come to CDC and mass storage.) < > USB Modem (CDC ACM) support <*> USB Printer support <*> USB Mass Storage support(Then the HID bits. You have to select HID input support if you have a USB keyboard, mouse, joystick or any other USB input device) --- USB Input Devices <*> USB Human Interface Device (full HID) support [*] HID input layer support(If you have a USB Network Card like the RTL8150, you'll need this) USB Network Adapters ---> <*> USB RTL8150 based ethernet device support (EXPERIMENTAL)(If you have a serial to USB converter like the Prolific 2303, you'll need this) USB Serial Converter support ---> <*> USB Serial Converter support <*> USB Prolific 2303 Single Port Serial Driver (NEW)
Now that your options are set, you can (re)compile the kernel and USB support
should be functional once you reboot into the new kernel. You can now proceed
to
We will look at the options the we will have to enable in the 2.4 kernel to
ensure proper USB support for our devices. If you are using a 2.6 kernel,
please look at
(This immediate config is only for those who have USB input devices. Input core support is needed by USB HID later.) Input core support ---> <*> Input core support < > Keyboard support < > Mouse support < > Event interface support USB support --->(This is the root hub and is required for USB support. If you'd like to compile this as a module, it will be called usbcore.o) <*> Support for USB(Enable this option to see your USB devices in /proc/bus/usb. This is recommended.) [*] Preliminary USB device filesystem(Select at least one of the HCDs. If you are unsure, picking all is fine.) --- USB Host Controller Drivers <*> UHCI Alternate Driver (JE) support < > OHCI (Compaq, iMacs, OPTi, SiS, ALi, ...) support(This is the device section. Select only what you need.) --- USB Device Class drivers < > USB Audio support <*> USB Mass Storage support < > USB Modem (CDC ACM) support <*> USB Printer support(Followed by the HID section. This is needed if you have an USB based input device.) --- USB Human Interface Devices (HID) <*> USB Human Interface Device (full HID) support [*] HID input layer support(If you have a serial to USB converter like the Prolific 2303, you'll need this) USB Serial Converter support ---> <*> USB Serial Converter support <*> USB Prolific 2303 Single Port Serial Driver (NEW)
Now that the options are set, you can (re)compile the kernel and USB support should be functional once you reboot into the new kernel.
The time has finally come to play with those USB devices :) So let's get
started. In this chapter, we'll see how the system responds to various USB
devices. We'll start by plugging in a USB 512 MB Memory Stick/Pen Drive. You
could use some other similar mass storage device. We will primarily use
(Plug in Memory Stick into available USB port and then..) # dmesg | less(The device is picked up as a USB 1.1 and allocated an address. Also says what HCD it is using.) usb 1-1: new full speed USB device using uhci_hcd and address 2(SCSI emulation automatically kicks in) scsi0 : SCSI emulation for USB Mass Storage devices usb-storage: device found at 2(Now the device information including model number is retrieved) usb-storage: waiting for device to settle before scanning Vendor: JetFlash Model: TS512MJF2A Rev: 1.00 Type: Direct-Access ANSI SCSI revision: 02 SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)(The write-protect sense is EXPERIMENTAL code in the later kernels) sda: Write Protect is off sda: Mode Sense: 0b 00 00 08 sda: assuming drive cache: write through SCSI device sda: 1003600 512-byte hdwr sectors (514 MB) /dev/scsi/host0/bus0/target0/lun0: p1 Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0 Attached scsi generic sg0 at scsi0, channel 0, id 0, lun 0, type 0 usb-storage: device scan complete(At this point, the device is generally accessible by mounting /dev/sda1) (When the device is disconnected, the system acknowledges the same) usb 1-1: USB disconnect, address 2
Once the device is connected and mounted, you can access it like a normal hard
disk. Usual operations like
# mount /dev/sda1 /mnt/usb # df -h Filesystem Size Used Avail Use% Mounted on /dev/hda8 9.4G 7.5G 1.9G 80% / /dev/hda9 11G 8.1G 2.4G 78% /usr none 189M 0 189M 0% /dev/shm /dev/sda1 490M 34M 457M 7% /mnt/usb
How would a USB mouse show up in case you had one? It will show up as an HID device.
# dmesg | grep USB drivers/usb/input/hid-core.c: v2.0:USB HID core driver usb 1-1: new low speed USB device using address 2 input: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on usb-0000:00:07.2-1
Another nifty command you can use to see the status of your USB ports is
So far we've seen how much support exists on the kernel/system side for USB on Linux. Now we'll take a peek into what kind of support is provided by Gentoo for USB in the userspace.
One of the most useful tools around is
# emerge usbutils
Once installed, you can just run
# lsusb(This is the 512 MB Memory Stick from Transcend) Bus 001 Device 003: ID 0c76:0005 JMTek, LLC. USBdisk(This is the Optical Mouse) Bus 001 Device 002: ID 046d:c00e Logitech, Inc. Optical Mouse(This is the root hub) Bus 001 Device 001: ID 0000:0000
If you are one of those types who love to see lots of information, you have
the option of running
# lsusb -t Bus# 1 `-Dev# 1 Vendor 0x0000 Product 0x0000 |-Dev# 2 Vendor 0x046d Product 0xc00e `-Dev# 3 Vendor 0x0c76 Product 0x0005
You can easily correlate the outputs of
Gentoo uses
Firmware can be defined as the software on a piece of hardware that is loaded and executed but can't be modified easily. Many devices have firmware in them to ensure that they work properly and often firmware may contain code that is critical to ensure that the hardware performs as expected. Firmware is present in a wide variety of computer devices ranging from ROM chips to state of the art USB and PCMCIA cards. When a device is plugged in, the firmware (which may, in some cases, be the driver as well) is read and loaded onto memory after which the device can be used by the system.
To cut the long story short, Gentoo uses
# emerge hotplug
A good number of online documents helped me during the development of this document and there are some that are highly technical but truly interesting. I thought they all deserve some credit, so here we go!