7.我是谁

7.我是谁

我是谁?USB也一遍一遍地问着自己,当然它不会真的是一棵树,它也不会是太阳,Linux里没有太阳,真要有的话,也只能是Linus。USB子系统只是Linux庞大家族里的一个小部落,主机控制器是它们的族长,族里的每个USB设备都需要被系统识别,被我们识别,而sysfs就是它们对外的窗口,我们可以从sysfs里了解认识每一个USB设备。以一个仅包含一个USB接口的USB鼠标为例,如图1.7.1所示,就是该设备对应的sysfs目录树。

图1.7.1 USB鼠标的sysfs目录树

其中:

/sys/devices/pci0000:00/0000:00:09.0/usb2/2-1

表示鼠标。

下层目录:

/sys/devices/pci0000:00/0000:00:09.0/usb2/2-1/2-1:1.0

表示鼠标的USB接口。sysfs里USB设备都是类似的表示,设备的目录下包括表示设备接口的目录。目录里的各个文件表示设备或接口的描述,大都对应了设备描述符、接口描述符等相应值,可以通过这些值获得您感兴趣的信息。什么是设备描述符和接口描述符?我们这里要暂时忽略它的存在,先关心关心USB设备在sysfs里是如何命名的,弄清它是谁,也就是说,弄清上面路径的含义。

USB系统中的第一个USB设备是Root Hub,前面已经说了它是和主机控制器绑定在一起的。这个Root Hub通常包含在PCI设备中,是连接PCI总线和USB总线的bridge,控制着连接到其上的整个USB总线。所有的Root Hub,内核的USB Core都分配有独特的编号,在上面的例子里就是USB 2。

USB总线上的每个设备都以Root Hub的编号作为其名字的第一个号码。这个号码后跟着一个“-”字符,以及设备所插入的端口号。因此,上面例子中的USB鼠标的设备名就是2-1。因为该USB鼠标具有一个接口,导致了另外一个USB设备被添加到sysfs路径中。因为物理USB设备和单独的USB接口在sysfs中都将表示为单独的设备。USB接口的命名是设备名直到该接口,上面就是2-1后面跟一个“:”和USB配置(Configuration)的编号,然后是一个“.”和该接口的编号。因此,上面的鼠标USB接口就是2-1:1.0,表示使用的是第一个配置,接口编号为0。

sysfs并没有展示USB设备的所有部分,设备可能包含的可选配置都没有显示,不过这些可以通过usbfs找到,该文件系统被挂在/proc/bus/usb目录中,从/proc/bus/usb/device文件可以知道系统中存在的所有USB设备的可选配置。

这里既然提到了USB设备的配置,还是先简要说说。一个设备可以有一种或者几种配置,这能理解吧?没见过具体的USB设备?那么手机见过吧,每部手机都会有多种配置,或者说“设定”。比如,笔者的这款Nokia 6300手机,手机语言可以设定为English、繁体中文、简体中文,一旦选择了其中一种,那么手机里显示的所有信息都是该种语言/字体。再举一个最简单的例子,手机的操作模式也有好几种,标准、无声、会议等。如果我设为“会议”模式,那么就是只振动不发声:要是设为“无声”模式,那么就什么动静也不会有。USB设备的配置也是如此,不同的USB设备当然有不同的配置了,或者说需要配置哪些东西也会不一样。