USB学习笔记二之总线拓扑及sysfs

  1. 总线拓扑

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总线树就一个总线号。

  1. 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。

  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中的接口的内容则包含了一些接口描述符的内容,不再罗列。

  1. 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
    └── ...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • "计算机网络的拓扑结构是引用拓扑学中研究与大小、形状无关的点、线关系的方法,把网络中的计算机和通信设备抽象为一个点...
    小学究鑫鑫阅读 745评论 0 0
  • 怎么打开usb 详细的debug 信息Symbol: USB_DEBUG [=y] ...
    sgy1993阅读 1,418评论 0 1
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,306评论 2 89
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,834评论 28 54
  • 信任包括信任自己和信任他人 很多时候,很多事情,失败、遗憾、错过,源于不自信,不信任他人 觉得自己做不成,别人做不...
    吴氵晃阅读 6,365评论 4 8

友情链接更多精彩内容