- 总线拓扑
usb总线拓扑主要使用hub进行拓展(hub本质上也是dev),hub一般有一个或多个端口(Port),用于挂接下级的dev或hub。这样自然而然就有了层次(level)的结构,如下图所示:
root hub
|
hub dev dev dev hub
| |
dev hub dev dev dev hub dev
| |
dev dev dev hub dev
|
dev
注意与pci总线的区别。pci总线使用bridge进行拓展,每个bridge生成一个新的总线,一棵总线树有n个总线,总线编号分别为0~(n-1),而一棵usb总线树就一个总线号。
- sysfs命名规则
引用ldd3中的一段话:
Both the physical USB device (as represented by a struct usb_device) and the individual USB interfaces (as represented by a struct usb_interface) are shown in sysfs as individual devices. (This is because both of those structures contain a struct device structure.)
sysfs(/sys/bus/usb/devices/)中显示的内容主要分成设备和接口两类,名称中带冒号(:)的就是接口,否则就是设备。而usb1,usb2这种也是设备,它们就是root hub。
sysfs中设备的命名规则为:
bus-port.port.port
其中"-port"是该设备的祖先设备所挂接的root hub对应的端口,接着的".port"是root hub下级hub对应的端口,最后的".port"是该设备直接挂接的hub对应的端口。如果是直接挂在root hub下的,则是bus-port(没有".port"),如果挂的hub还要更深,则要继续加".port"(root hub名称例外,形如usb1,usb2)。
sysfs中接口的命名规则就是设备名加上配置编号和接口编号,形如:
bus-port.port.port:configuration.interface
比如
3-1:1.0
表示bus3这个root hub上port 1连的设备,它的配置1,接口0。
而
2-1.3:1.1
表示bus2这个root hub上port 1所连hub的port 3连的设备,它的配置1,接口1。
- sysfs内容
sysfs中的设备的内容包含了大部分设备描述符和配置描述符的内容,形如:
bConfigurationValue // config desc
bDeviceClass // device desc
bDeviceProtocol // device desc
bDeviceSubClass // device desc
bMaxPacketSize0 // device desc
bMaxPower // config desc
bNumConfigurations // device desc
bNumInterfaces // config desc
bcdDevice // device desc
bmAttributes // config desc
busnum // 总线号(一棵总线树就一个总线号)
configuration // config desc, iConfiguration
descriptors // 16进制格式的描述符,包括设备描述符及原始的配置描述符(含接口,端点描述符)
dev // linux设备号,形如major:minor
devnum // 总线树内的设备编号
devpath // hub port形式的设备路径。bus-port.port中的port部分(比如3-1.2取1.2)
idProduct // device desc
idVendor // device desc
maxchild // hub支持的port数目,非hub设备则是0
version // device desc, bcdUSB
sysfs中的接口的内容则包含了一些接口描述符的内容,不再罗列。
- sysfs示例
/sys/bus/usb/devices/目录下列出了所有的设备和接口,形如:
/sys/bus/usb/devices/
├── 1-0:1.0 // usb1这个设备的接口
├── 1-1 // 第1个root hub(bus 1) port 1上挂的设备
├── 1-1:1.0 // 1-1设备的接口
├── 1-1.6 // 第1个root hub(bus 1) port 1上挂的设备(是hub) 的 port 6上挂的设备
├── 1-1.6:1.0 // 1-1.6设备的接口
├── 2-0:1.0 // usb2这个设备的接口
├── 2-1 // 第2个root hub(bus 2) port 1上挂的设备
├── 2-1:1.0 // 2-1设备的接口
├── usb1 // 第1个root hub(bus 1)这个设备
└── usb2 // 第2个root hub(bus 2)这个设备
可以看到,一个设备一般包含了一个接口。
注意root hub的特殊之处,首先它的设备名称就是形如usb1,usb2这样,而不是1-1,2-1这样的。另外,它的接口名称中,port部分是0,而其余设备(及接口)名称中,port部分都是非0的。应该可以这么理解,所有的非root hub设备都是挂在某个hub的物理port上的,port编号从1开始,所以这些设备(及接口)的名称中,port部分都是非0的。而root hub本身就位于拓扑结构最顶层,并不挂在某个hub的物理port上,因此它的接口名称中的port部分其实是无意义的,就指定成特殊的0。
从/sys/bus/usb/devices/这层目录,已经可以看到所有的接口了。而进一步查看设备的内容,则可以看到从属于该设备的接口,以及该设备的下级设备(仅对hub设备),形如:
/sys/bus/usb/devices/
├── 1-0:1.0
│ └── ...
├── 1-1
│ ├── 1-1:1.0
│ ├── 1-1.6
│ └── ...
├── 1-1:1.0
│ └── ...
├── 1-1.6
│ ├── 1-1.6:1.0
│ └── ...
├── 1-1.6:1.0
│ └── ...
├── 2-0:1.0
│ └── ...
├── 2-1
│ ├── 2-1:1.0
│ └── ...
├── 2-1:1.0
│ └── ...
├── usb1
│ ├── 1-0:1.0
│ ├── 1-1
│ └── ...
└── usb2
├── 2-0:1.0
├── 2-1
└── ...