Board logo

标题: 如何在LINUX下实现硬件的自动检测 - USB设备的自动检测 [打印本页]

作者: look_w    时间: 2018-4-15 19:53     标题: 如何在LINUX下实现硬件的自动检测 - USB设备的自动检测

5.1 USB设备检测的一般过程USB设备检测也是通过/proc目录下的USB文件系统进行的。为了使一个USB设备能够正常工作,必须要现在系统中插入USB桥接器模块。在检测开始时,一般要先检测是否存在/proc/bus/usb目录,若不存在则尝试插入USB桥接模块。
现在一般的USB桥接器模块有两种类型,UHCI和OHCI。在决定插入那一个桥接器模块时,可以察看/proc/pci文件来决定。打开此文件,您若发现USB节为        I/O at 0xHHHH格式(例如出现 I/O at 0xe000[0xe01f]),HHHH为16进制数,则桥接器类型为UHCI。若是它为        32 bitmemory at 0xHH000000形式(例如出现32 bit memory at0xee000000),HH为16进制数,则桥接器类型为OHCI。但是若您的桥接器类型不满足上述任何一种情况,唯一的解决办法就是您尝试插入这两种模块,直到成功为止。一般而言,UHCI类型的桥接器它的插入模块是uhci或usb-uhci(由内核版本决定);而对于OHCI类型的桥接器它的插入模块是ohci或usb-ohci。      
您在正确的插入了桥接器模块之后,这时/proc文件系统下就会出现USB设备目录,不过这时这个目录是空的,没有任何文件。这时您就必须挂接usbdevfs文件系统,然后通过此文件系统检测连接的设备。在成功挂接usb文件系统之后,就会生成文件/proc/bus/usb/devices,/proc/bus/usb/drivers和目录/proc/bus/usb/busNo。挂接usbdevfs文件您可以通过如下操作实现:        
mount -t usbdevfs none /proc/bus/usb
或在/etc/fstab上加入        
none /proc/bus/usb usbdevfs defaults 0 0
然后通过/proc/bus/usb/devices文件的内容,您就可以获得连接的设备信息,包括设备标识和制造商标是等信息。
usb设备类型描述:
表5-1 usb设备类码设备规范设备类码接口类码应用程序特定-0xFE声音接口0x000x01通信设备0x02-CDC控制接口e-0x02CDC数据接口-0x0AHID0x000x03HUB0x090x09批量存储设备0x000x08监视器same as HIDsame as HID电源设备same as HIDsame as HID物理设备-0x05打印机-0x07供应商特定-0xFF
5.2 usb文件系统简介T = 总线拓扑结构(Lev, Prnt, Port, Cnt,        
等),是指USB设备和主机之间的连接方式        
B = 带宽 (仅用于USB主控制器)        
D = 设备描述信息        
P = 产品标识信息        
S = 串描述符        
C = 配置描述信息 (* 表示活动配置)        
I = 接口描述信息        
E = 终端点描述信息      
一般格式:        
d = 十进制数        
x = 十六进制数        
s = 字符串      
拓扑信息
1
2
3
4
5
6
7
8
9
10
T:  Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd
|   |       |       |         |        |        |         |         |__最大子设备
|   |       |       |         |        |        |         |__设备速度(Mbps)
|   |       |       |         |        |        |__设备编号
|   |       |       |         |        |__这层的设备数
|   |       |       |         |__此设备的父连接器/端口
|   |       |       |__父设备号
|   |       |__此总线在拓扑结构中的层次
|   |__总线编号
|__拓扑信息标志




带宽信息
1
2
3
4
5
B:  Alloc=ddd/ddd us (xx%), #Int=ddd, #Iso=ddd
|   |                            |           |__同步请求编号
|   |                            |__中断请求号
|   |__分配给此总线的总带宽
|__带宽信息标志




设备描述信息和产品标识信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
D:  Ver=x.xx Cls=xx(s) Sub=xx Prot=xx MxPS=dd #Cfgs=dd
P:  Vendor=xxxx ProdID=xxxx Rev=xx.xx
D:  Ver=x.xx Cls=xx(sssss) Sub=xx Prot=xx MxPS=dd #Cfgs=dd
|   |          |               |        |        |        |__配置编号
|   |          |               |        |        |______缺省终端点的最大包尺寸
|   |          |               |        |                  
|   |          |               |        |__设备协议
|   |          |               |__设备子类型
|   |          |__设备类型
|   |__设备USB版本
|__设备信息标志编号#1
P:  Vendor=xxxx ProdID=xxxx Rev=xx.xx
|   |             |              |__产品修订号
|   |             |__产品标识编码
|   |__制造商标识编码
|__设备信息标志编号#2




串描述信息
1
2
3
4
5
6
7
8
9
S:  Manufacturer=ssss
|   |__设备上读出的制造商信息
|__串描述信息
S:  Product=ssss
|   |__设备上读出的产品描述信息,对于USB主控制器此字段为"USB *HCI Root Hub"
|__串描述信息
S:  SerialNumber=ssss
|   |__设备上读出的序列号,对于USB主控制器它是一个生成的字符串,表示设备标识
|__串描述信息




配置描述信息
1
2
3
4
5
6
C:  #Ifs=dd Cfg#=dd Atr=xx MPwr=dddmA
|   |         |        |       |__最大电流(mA)
|   |         |        |__属性
|   |         |__配置编号
|   |__接口数
|__配置信息标志




接口描述信息(可为多个)
1
2
3
4
5
6
7
8
9
I:  If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss
|   |       |        |        |                |       |        |__驱动名
|   |       |        |        |                |       |__接口协议
|   |       |        |        |                |__接口子类
|   |       |        |        |__接口类
|   |       |        |__中断点数
|   |       |__可变设置编号
|   |__接口编号
|__接口信息标志




终端点描述信息
1
2
3
4
5
6
7
E:  Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms
E:  Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=dddms
|   |          |              |           |__间隔
|   |          |              |__终端点最大包尺寸
|   |          |__属性(终端点类型)
|   |__终端点地址(I=In,O=Out)
|__终端点信息标志




举个例子,这是在连接了一个USB键盘时的配置情况。         
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
T: Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#= 1 Spd=12 MxCh=
2
B: Alloc= 41/900 us ( 5%), #Int= 3, #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=e000
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
T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh=
3
D: Ver= 1.10 Cls=09(hub ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=07e4 ProdID=a961 Rev= 0.01
S: Manufacturer=ALCOR
S: Product=Movado USB Keyboard
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=100mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=09(hub ) Sub=00 Prot=00
Driver=hub
E: Ad=81(I) Atr=03(Int.) MxPS= 1 Ivl=255ms
T: Bus=01 Lev=02 Prnt=02 Port=00 Cnt=01 Dev#= 3 Spd=12 MxCh=
0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: Vendor=07e4 ProdID=a961 Rev= 0.01
S: Manufacturer=ALCOR
S: Product=Movado USB Keyboard
C:* #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr= 0mA
I: If#= 0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=01
Driver=hid
E: Ad=81(I) Atr=03(Int.) MxPS= 8 Ivl= 10ms
I: If#= 1 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=00 Prot=00
Driver=hid
E: Ad=82(I) Atr=03(Int.) MxPS= 4 Ivl=255ms




它的物理拓扑可用下图来表示:
对于Linux下的usb设备而言,T:(总线拓扑)行用于生成连接在hub上的设备的描述信息,I:(接口信息)行可用于决定每个设备所用的驱动程序,C:(配置信息)可用于列出设备使用最大电流。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0