代码 1.1: USB一般体系结构
|
(软件层还有设备驱动之类的成份构成,但出于简化问题的目的,在此略去)
+ ---- 硬件 ---- + ---- 软件 ---- +
| | |
| [USB Dev] -+-> {EHCI} -+---> ( EHCD ) |
| | | | 用户
| `-> {UHCI} -+---> ( UHCD ) |
| | |
+ ---- 硬件 ---- + ---- 软件 ---- +
|
注意:
lspci工具是
sys-apps/pciutils包的一部分,如果未有安装该软件包,请
emerge pciutils。要注意的是,必须是root用户才有权限执行
lspci命令。
|
代码 1.2: lspci的输出
|
(系统是兼容USB 1.1的,即UHCI接口) # 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]) |
代码 2.1: 获取内核源码
|
# emerge gentoo-sources
|
代码 2.2: 准备配置
|
# cd /usr/src/linux # make menuconfig |
注意: 上例假定
/usr/src/linux是一个符号连接,指向你要使用的内核源码目录。在进行内核配置之前,你要保证有这样的连接。
|
注意: 本文档示例只针对一些基本的USB支持,当然这也是大多数人所需要的,譬如USB块存储设备(数码相机与U盘驱动)。若对一些特殊的USB设备进行配置,请参考设备的用户手册,或者在网上搜索一下内核是否已经实现了对这些设备的支持,再或者使用你所能找到的对应驱动程序。请注意,本文为了简化问题,所有的示例配置都是编译到内核中去的,如果你希望使用内核的模块机制,在确认要编译哪些模块时,相应地调整一下内核配置文件。
|
代码 2.3: make menuconfig选项
|
Device Drivers ---> SCSI device support ---> (尽管在选择USB Mass Storage时会自动启用SCSI支持,也必需启用disk支持) --- SCSI support type (disk, tape, CD-ROM) <*> SCSI disk support (然后返回上一层,进入USB support) USB support ---> (这是根集线器,对于USB支持而言是必须的。如果你想把它编译成模块,那么它就叫做usbcore) <*> Support for Host-side USB (启用这一选项可以让你在/porc/bus/usb中查看USB设备,推荐启用) [*] USB device filesystem (至少要选择一个HCD。如果你不能确定,就都选上好了) --- USB Host Controller Drivers <*> EHCI HCD (USB 2.0) support < > OHCI HCD support <*> UHCI HCD (most Intel and VIA) support (向下移动一下,就可以看到CDC和mass storage的配置选项了) < > USB Modem (CDC ACM) support <*> USB Printer support <*> USB Mass Storage support --- USB Input Devices <*> USB Human Interface Device (full HID) support [*] HID input layer support (如果你有USB网卡,比如RTL8150,应当开启这个选项) USB Network Adapters ---> <*> USB RTL8150 based ethernet device support (EXPERIMENTAL) (如果你有串口-USB转接器,譬如Prolific 2303,你需要开启这一选项) USB Serial Converter support ---> <*> USB Serial Converter support <*> USB Prolific 2303 Single Port Serial Driver (NEW) |
代码 2.4: Enabling HID support
|
Device Drivers ---> [*] HID Devices ---> <*> USB Human Interface Device (full HID) support |
注意:
dmesg在显示我们所需要的信息之前会输出大量的冗余信息,因为它要读取内核的环缓冲区(ring buffer),会输出许多启动信息。下面示例中的输出信息只给出了一部分信息,为了更好的阅读,还添加了一些空行。使用
dmesg | more或
dmesg | less来查看输出信息会更好一些。
|
代码 3.1: 记忆棒的dmesg输出
|
(先将U盘插入可用的USB端口,然后...) # dmesg | less (当前设备被识别为USB 1.1并为之分配一个地址。这也能说明哪一种HCD正在被使用) usb 1-1: new full speed USB device using uhci_hcd and address 2 (SCSI模拟器会自动载入) scsi0 : SCSI emulation for USB Mass Storage devices usb-storage: device found at 2 (现在设备信息,包括模块号,都可以被检索到) 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) (写保护语句是未来新版本内核的试验性代码) 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 (在此,设备通常可以通过挂载/dev/sda1来访问) (当设备断开连接时,系统会给出这样的反馈信息) usb 1-1: USB disconnect, address 2 |
代码 3.2: 访问U盘
|
# 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 |
注意: 也可以像U盘那样访问数码相机。我曾有一个Nikon Coolpix 5200,我正是采用这种方式访问它的。数码相机中的图片通常有两种面向计算机的传输模式:USB块存储与PTP (Picture Transfer Protocol)。相机要是被设置为USB块存储模式,就如同上面所讲的U盘访问过程一样,但是也要注意这并非放之四海皆准的。
|
代码 3.3: USB光电鼠标
|
# 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
|
代码 4.1: 安装usbutils
|
# emerge usbutils
|
注意: 通常你必须以根用户身份运行
lsusb。
|
警告:
lsusb从
/proc/bus/usb中读取USB设备信息,如果你在编译内核时没有进行相应配置,那么
lsusb就无法工作了。所以,一定要确认你的内核配置启用了
/proc文件系统支持,并且保证
usbfs是挂载在
/proc/bus/usb上的(默认就是如此)。
|
代码 4.2: 执行lsusb
|
# 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 |
代码 4.3: lsusb显示USB物理层
|
# lsusb -t
Bus# 1
`-Dev# 1 Vendor 0x0000 Product 0x0000
|-Dev# 2 Vendor 0x046d Product 0xc00e
`-Dev# 3 Vendor 0x0c76 Product 0x0005
|