LPI 101 考试准备: 硬件和体系结构之七
来源:互联网 发布:RecyclerView 添加数据 编辑:程序博客网 时间:2024/06/01 03:58
原贴:http://blog.chinaunix.net/u/23204/showart_206984.html
LPI 101 考试准备: 硬件和体系结构之七
USB 设备
本节涵盖了针对初级管理员(LPIC-1)101 考试的主题 1.101.7 所需要的资料。此话题的权重为 1。
USB 概述
在本节我们将研究 Linux 对 Universal Serial Bus(USB)设备的支持。USB 是由一个公司联盟开发的,目标是为外围设备的连接提供一个单一的、简单的总线。在 BIOS 设置 章节中,我们已经体会到了在 ISA 总线机器中管理端口、IRQ 和 DMA 资源的复杂性。USB 设计允许设备的热插拔,并可以使用标准连接器来连接设备。 USB 设备包括键盘、鼠标、打印机、扫描仪、硬盘驱动器、闪存驱动器、相机、调制解调器、以太网适配器和扬声器。这个列表还在不断增长。当前 Linux 支持的设备非常广泛,尽管有一些设备需要专门的驱动程序,还有一些可能没有得到支持或者只是得到部分支持,尤其是特殊的打印机。
一个计算机系统可能具备一个或多个 控制器 或 集线器(hub),USB 设备或另外的(外部)集线器可以连接到它。一个集线器支持最多 7 个设备,其中有一部分可以是另外的集线器,也可以全部都是。系统中的集线器叫做 root hub。每一个这样的星形拓扑可以支持最多 127 个集线器或者设备。
注意: 我们通常所说的 USB 端口 指的是计算机中的 USB 功能以及连接插口(相对于串行端口或并行端口),而不是设备所使用的内部端口地址。
USB 系统是一个分层次的系统。
- 总线接口(Bus Interface)层提供了主机与设备之间物理的、信号的和数据包的连通性,为主机与设备之间提供数据传输。
- 设备(Device)层由系统软件所使用,对总线上的设备完成普通的 USB 操作。这样就让主机能够确定设备的特性,包括设备类别、提供商名称、设备名称、电源需求以及很多性能,比如设备速度或 USB 标准的支持。
- 功能(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 usb00: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 驱动程序
驱动程序 芯片 EHCI USB 2.0 支持 - 需要 UHCI、OHCI 或 JE 其中之一 UHCI Intel 与 VIA 芯片组 JE 这是用于 2.4 内核的 UHCI 的另一种选择。如果 UHCI 不能使用,并且使用了 Intel 或 VIA 芯片组,那么尝试 JE OHCI Compaq、大部分 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 taintedusbserial 23420 0 (autoclean) (unused)mousedev 5524 1hid 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/devicesT: Bus=04 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=480 MxCh= 6B: Alloc= 0/800 us ( 0%), #Int= 0, #Iso= 0D: Ver= 2.00 Cls=09(hub ) Sub=00 Prot=01 MxPS= 8 #Cfgs= 1P: Vendor=0000 ProdID=0000 Rev= 2.04S: Manufacturer=Linux 2.4.21-32.0.1.EL ehci-hcdS: Product=Intel Corp. 82801DB USB2S: SerialNumber=00:1d.7C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mAI: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hubE: Ad=81(I) Atr=03(Int.) MxPS= 2 Ivl=256msT: Bus=03 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh= 2B: Alloc= 0/900 us ( 0%), #Int= 0, #Iso= 0D: Ver= 1.00 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1P: Vendor=0000 ProdID=0000 Rev= 0.00S: Product=USB UHCI Root HubS: SerialNumber=1840C:* #Ifs= 1 Cfg#= 1 Atr=40 MxPwr= 0mAI: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00 Driver=hubE: 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 -tBus# 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 0x1202Bus# 3`-Dev# 1 Vendor 0x0000 Product 0x0000Bus# 2`-Dev# 1 Vendor 0x0000 Product 0x0000Bus# 1`-Dev# 1 Vendor 0x0000 Product 0x0000 `-Dev# 2 Vendor 0x1241 Product 0x1111[root@lyrebird root]# lsusb -d 0x0409:0x0059Bus 004 Device 002: ID 0409:0059 NEC Corp. HighSpeed Hub[root@lyrebird root]# lsusb -d 0x04b0:0x0108Bus 004 Device 008: ID 04b0:0108 Nikon Corp. Coolpix 2500[root@lyrebird root]# lsusb -d 0x0d7d:0x1400Bus 004 Device 004: ID 0d7d:1400 Phison Electronics Corp.[root@lyrebird root]# lsusb -d 0x1058:0x0401Bus 004 Device 007: ID 1058:0401 Western Digital Technologies, Inc.[root@lyrebird root]# lsusb -d 0x07d0:0x1202Bus 004 Device 003: ID 07d0:1202 Dazzle[root@lyrebird root]# lsusb -d 0x1241:0x1111Bus 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:0x1400Bus 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/003usb-storage[root@lyrebird root]# usbmodules --device /proc/bus/usb/004/007usb-storagehid
回页首
热插拔
系统可以使用两个命令来处理 USB 设备的热插拔,usbmgr 和 hotplug。根据使用的命令,将在 /etc/usbmgr 或 /etc/hotplug 目录中找到配置文件。较新的系统更倾向于使用 hotplug。
USB 的热插拔(PC 卡也是如此)让用户可以在系统运行时插入设备。然后系统必须:
- 确定设备类型并找出运行它的驱动程序
- 将驱动程序绑定到那个设备
- 向其他子系统就此设备进行通告。举例来说,这样就允许加载磁盘或者添加打印队列。