momo zone

调核人的blog

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 bit memory at 0xHH000000形式(例如出现32 bit memory at 0xee000000),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
声音接口 0x00 0x01
通信设备 0x02
CDC控制接口e 0x02
CDC数据接口 0x0A
HID 0x00 0x03
HUB 0x09 0x09
批量存储设备 0x00 0x08
监视器 same as HID same as HID
电源设备 same as HID same 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 = 字符串

拓扑信息

T:  Bus=dd Lev=dd Prnt=dd Port=dd Cnt=dd Dev#=ddd Spd=ddd MxCh=dd
|   |       |       |         |        |        |         |         |__最大子设备
|   |       |       |         |        |        |         |__设备速度(Mbps)
|   |       |       |         |        |        |__设备编号(相对于Bus)
|   |       |       |         |        |__这层的设备数
|   |       |       |         |__此设备的父连接器/端口
|   |       |       |__父设备号
|   |       |__此总线在拓扑结构中的层次
|   |__总线编号
|__拓扑信息标志

带宽信息

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

设备描述信息和产品标识信息

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

串描述信息

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

配置描述信息

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

接口描述信息(可为多个)

I:  If#=dd Alt=dd #EPs=dd Cls=xx(sssss) Sub=xx Prot=xx Driver=ssss
|   |       |        |        |                |       |        |__驱动名
|   |       |        |        |                |       |__接口协议
|   |       |        |        |                |__接口子类
|   |       |        |        |__接口类
|   |       |        |__中断点数
|   |       |__可变设置编号
|   |__接口编号
|__接口信息标志

终端点描述信息

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键盘时的配置情况。

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:(配置信息)可用于列出设备使用最大电流。
Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: