LPI 101 考试准备: 硬件和体系结构之七

本文介绍 Linux 下 USB 设备的基本概念、支持模块及如何通过命令行工具查看和管理 USB 设备。涵盖 USB 设备的层次结构、不同版本的传输速率、Linux 中 USB 设备的驱动程序以及如何使用 lsusb 和 dmesg 命令来查找 USB 设备的详细信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原贴:http://blog.chinaunix.net/u/23204/showart_206984.html

 

LPI 101 考试准备: 硬件和体系结构之七
 
 

USB 设备

本节涵盖了针对初级管理员(LPIC-1)101 考试的主题 1.101.7 所需要的资料。此话题的权重为 1。

USB 概述

在本节我们将研究 Linux 对 Universal Serial BusUSB)设备的支持。USB 是由一个公司联盟开发的,目标是为外围设备的连接提供一个单一的、简单的总线。在 BIOS 设置 章节中,我们已经体会到了在 ISA 总线机器中管理端口、IRQ 和 DMA 资源的复杂性。USB 设计允许设备的热插拔,并可以使用标准连接器来连接设备。 USB 设备包括键盘、鼠标、打印机、扫描仪、硬盘驱动器、闪存驱动器、相机、调制解调器、以太网适配器和扬声器。这个列表还在不断增长。当前 Linux 支持的设备非常广泛,尽管有一些设备需要专门的驱动程序,还有一些可能没有得到支持或者只是得到部分支持,尤其是特殊的打印机。

一个计算机系统可能具备一个或多个 控制器集线器(hub),USB 设备或另外的(外部)集线器可以连接到它。一个集线器支持最多 7 个设备,其中有一部分可以是另外的集线器,也可以全部都是。系统中的集线器叫做 root hub。每一个这样的星形拓扑可以支持最多 127 个集线器或者设备。

注意: 我们通常所说的 USB 端口 指的是计算机中的 USB 功能以及连接插口(相对于串行端口或并行端口),而不是设备所使用的内部端口地址。

USB 系统是一个分层次的系统。

  1. 总线接口(Bus Interface)层提供了主机与设备之间物理的、信号的和数据包的连通性,为主机与设备之间提供数据传输。
  2. 设备(Device)层由系统软件所使用,对总线上的设备完成普通的 USB 操作。这样就让主机能够确定设备的特性,包括设备类别、提供商名称、设备名称、电源需求以及很多性能,比如设备速度或 USB 标准的支持。
  3. 功能(Function)层提供与设备相关的另外的功能。与之相匹配的主机与设备软件层支持使用设备的特殊功能。

 

较早的 USB 规范(1.0 和 1.1)支持的最大速度为 12Mbps(megabits 每秒)。遵循此规范的设备是相对较慢的设备,比如打印机、鼠标、键盘、扫描仪和调制解调器。较新的 USB 2.0 规范支持最高速度为 480Mbps,足以满足硬盘驱动器和外置 CD 或 DVD 驱动器的要求。有些 USB 2.0 设备可以向后兼容,能够在较老的系统中使用,不过并不是所有更快的设备都是向后兼容的。如果计算机不具备 USB 2.0 支持,那么可以使用 PCI 卡(或者用于膝上型机器的 PC 卡)来提供一个或多个 USB 2.0 端口。

USB 线缆是较细的 4-wire 线缆,两根信号线,还有一根电源线和一根地线。插入到集线器上的末端有一个具有扁平矩形连接器(称为 A 连接器),而插入到设备或下级集线器的末端有一个较小的更正方的连接器(B 连接器)。有一些不同的 mini-B 连接器,用于将较小的设备连接到计算机,比如相机。 USB 设备和集线器可以通过 USB 总线获得电源,或者可以自供电源。




回页首


Linux USB 模块支持

在 Linux 中现在对 USB 有非常好的支持。2.6 内核树中有很大的发展。很多已经被反向移植到 2.4 内核,甚至在 2.2 内核中也有一些支持。 Linux 支持 USB 2.0 以及更早的规范。由于 USB 的热插拔本性,通常是通过内核模块来对其提供支持的,可以根据需要加载或卸载内核模块。对于本教程,我们将假定发行版本所需要的模块或者是可用的,或者是已经安装。如果需要编译自己的模块,请参考针对 201 考试主题 201 的教程(见 参考资料)。

确定计算机拥有 USB 端口后,可以使用 lspci 命令查看 Linux 系统是否找到了它,如清单 23 所示。已经对输出进行了过滤,只显示与 USB 相关的设备。


清单 23. 关于 USB 设备的 lspci 输出

    
[root@lyrebird root]# lspci | grep -i usb
00:1d.0 USB Controller: Intel Corporation 82801DB/DBL/DBM 
     (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 01)
00:1d.1 USB Controller: Intel Corporation 82801DB/DBL/DBM 
     (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (rev 01)
00:1d.2 USB Controller: Intel Corporation 82801DB/DBL/DBM 
     (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (rev 01)
00:1d.7 USB Controller: Intel Corporation 82801DB/DBM 
     (ICH4/ICH4-M) USB2 EHCI Controller (rev 01)

您会注意到,在这个系统中有四个 USB 控制器。UHCI 和 EHCI 域指明了支持那个控制器所需要的驱动程序模块。正确的 USB 1.1 驱动器依赖于控制器中所使用的芯片组。USB 2.0 需要 EHCI 驱动程序再加上一个 USB 1.1 驱动程序。见表 3。


表 3. Linux USB 驱动程序
驱动程序芯片
EHCIUSB 2.0 支持 - 需要 UHCI、OHCI 或 JE 其中之一
UHCIIntel 与 VIA 芯片组
JE这是用于 2.4 内核的 UHCI 的另一种选择。如果 UHCI 不能使用,并且使用了 Intel 或 VIA 芯片组,那么尝试 JE
OHCICompaq、大部分 PowerMacs、iMacs 以及 PowerBooks、OPTi、SiS、ALi

在前面对声音支持的讨论中已经涉及过 lsmod 命令和模块配置文件 /etc/modules.conf(2.4 内核)和 /etc/modprobe.conf(2.6 内核)。清单 24 展示了清单 23 所使用的同一系统中加载的一些与 USB 设备相关的模块。这个系统有一个 USB 鼠标。


清单 24. 使用 lsmod 显示加载的 USB 模块

    
[root@lyrebird root]# lsmod | egrep 'usb|hci|hid|mouse|Module'
Module                  Size  Used by    Not tainted
usbserial              23420   0  (autoclean) (unused)
mousedev                5524   1
hid                    22244   0  (unused)
input                   5888   0  [keybdev mousedev hid]
ehci-hcd               20008   0  (unused)
usb-uhci               25740   0  (unused)
usbcore                77376   1  [usbserial hid ehci-hcd usb-uhci]

要特别注意的是,usbcore 模块被所有其他 USB 模块以及 hid(human interface device)模块所使用。




回页首


显示 USB 信息

这样,我们现在已经了解了支持 UBS 的模块,那么如何得知是什么 USB 设备连接到了我们的系统?在文件系统的 /proc/bus/usb 部分可以找到此信息。文件 /proc/bus/usb/devices 中有关于当前连接的 USB 设备的摘要信息。我们的系统中部分列表如清单 25 所示。


清单 25. /proc/bus/usb/devices 的部分内容

     
[root@lyrebird root]# cat /proc/bus/usb/devices
T:  Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480 MxCh= 6
B:  Alloc=  0/800 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS= 8 #Cfgs=  1
P:  Vendor=0000 ProdID=0000 Rev= 2.04
S:  Manufacturer=Linux 2.4.21-32.0.1.EL ehci-hcd
S:  Product=Intel Corp. 82801DB USB2
S:  SerialNumber=00:1d.7
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr=  0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   2 Ivl=256ms
T:  Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=12  MxCh= 2
B:  Alloc=  0/900 us ( 0%), #Int=  0, #Iso=  0
D:  Ver= 1.00 Cls=09(hub  ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=0000 ProdID=0000 Rev= 0.00
S:  Product=USB UHCI Root Hub
S:  SerialNumber=1840
C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr=  0mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   8 Ivl=255ms

突出显示的 Spd=480 表明它是 USB 2.0 总线,而 Spd=12 表明它是 USB 1.1(或者可能是 USB 1.0)设备。继续往下读这个列表,可以看到鼠标的参数是 Spd=1.5。对大部分鼠标来说 1.5 MBps 的速度就足够了。

和我们在 /proc 文件系统中看到的其他内容一样,您会欣喜地发现,有一个 lsusb 命令可以帮助您显示这些信息。特别是,通过使用 -t 选项,可以获得 USB 设备的树状视图。这显示出了它们的连接层级。如果使用 -t 选项系统给出了摘要显示,那么可以使用 -d 选项来显示关于特定设备的信息。-v 选项会产生详细的输出,它会对清单 25 中所看到的很多域进行解释。为得到清单 26,我们已经插入了一个外置的集线器,一个 Nikon 数码相机,一个 USB 存储钥匙,以及一个外置 USB 2.0 硬盘驱动器,并展示了部分输出。


清单 26. 使用 lsusb 命令

     
[root@lyrebird root]# lsusb -t
Bus#  4
`-Dev#   1 Vendor 0x0000 Product 0x0000
  |-Dev#   2 Vendor 0x0409 Product 0x0059
  | |-Dev#   8 Vendor 0x04b0 Product 0x0108
  | |-Dev#   4 Vendor 0x0d7d Product 0x1400
  | `-Dev#   7 Vendor 0x1058 Product 0x0401
  `-Dev#   3 Vendor 0x07d0 Product 0x1202
Bus#  3
`-Dev#   1 Vendor 0x0000 Product 0x0000
Bus#  2
`-Dev#   1 Vendor 0x0000 Product 0x0000
Bus#  1
`-Dev#   1 Vendor 0x0000 Product 0x0000
  `-Dev#   2 Vendor 0x1241 Product 0x1111
[root@lyrebird root]# lsusb -d 0x0409:0x0059
Bus 004 Device 002: ID 0409:0059 NEC Corp. HighSpeed Hub
[root@lyrebird root]# lsusb -d 0x04b0:0x0108
Bus 004 Device 008: ID 04b0:0108 Nikon Corp. Coolpix 2500
[root@lyrebird root]# lsusb -d 0x0d7d:0x1400
Bus 004 Device 004: ID 0d7d:1400 Phison Electronics Corp.
[root@lyrebird root]# lsusb -d 0x1058:0x0401
Bus 004 Device 007: ID 1058:0401 Western Digital Technologies, Inc.
[root@lyrebird root]# lsusb -d 0x07d0:0x1202
Bus 004 Device 003: ID 07d0:1202 Dazzle
[root@lyrebird root]# lsusb -d 0x1241:0x1111
Bus 001 Device 002: ID 1241:1111 Belkin Mouse
[root@lyrebird root]#

清单 27 展示了可通过 lsusb 命令得到的部分详细输出。这针对的是一个存储钥匙。注意设备有自己的最高电源要求(200mA)。注意,这个设备将被作为 SCSI 设备来对待。使用 dmesg 命令或者 fdisk -l 命令来查明是哪个 SCSI 设备被映射到这个设备。大部分配备 USB 端口相机,以及读卡器、闪存设备以及硬盘驱动器都被当作是存储类别的设备,在 Linux 作为 SCSI 设备来处理。很多相机都附了帮助从相机中获取图片或者上传图片的 Windows 程序。在 Linux 中,可以简单地挂载对应于相机的那个 SCSI 设备,然后将图片拷贝到硬盘驱动器上,在那里可以使用程序来编辑它们,比如 GNU Image Manipulation Program(GIMP)。甚至可以从存储卡上抹除文件,或者从 Linux 中向它写入文件,让相机可以用作软盘的外来代替者。


清单 27. lsusb 命令的详细输出(部分)

     
[root@lyrebird root]# lsusb -vd 0x0d7d:0x1400

Bus 004 Device 004: ID 0d7d:1400 Phison Electronics Corp.
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x0d7d Phison Electronics Corp.
  idProduct          0x1400
  bcdDevice            0.02
  iManufacturer           1
  iProduct                2 USB DISK 12X
  iSerial                 3 0743112A0083
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
    MaxPower              200mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk (Zip)
      iInterface              0
      ...

通过清单 26 知道了 USB 设备的总线和设备 id,现在可以获得更多信息,这是确定特定设备需要哪些模块的一个途径。在清单 28 中演示了两个。


清单 28. 两个模块

     
[root@lyrebird root]# usbmodules --device /proc/bus/usb/004/003
usb-storage
[root@lyrebird root]# usbmodules --device /proc/bus/usb/004/007
usb-storage
hid




回页首


热插拔

系统可以使用两个命令来处理 USB 设备的热插拔,usbmgrhotplug。根据使用的命令,将在 /etc/usbmgr 或 /etc/hotplug 目录中找到配置文件。较新的系统更倾向于使用 hotplug。

USB 的热插拔(PC 卡也是如此)让用户可以在系统运行时插入设备。然后系统必须:

  • 确定设备类型并找出运行它的驱动程序
  • 将驱动程序绑定到那个设备
  • 向其他子系统就此设备进行通告。举例来说,这样就允许加载磁盘或者添加打印队列。
<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值