USB和sysfs文件系统

来源:互联网 发布:无限极是传销吗 知乎 编辑:程序博客网 时间:2024/05/22 14:03

2007年08月31日 星期五 19:32
   由于单个USB物理设备的复杂性,设备在sysfs中的表示也非常复杂。无论是物理USB设备(用struct usb_device表示)还是单独的USB接口(用struct usb_interface表示),在sysfs中均表示为单独的设备(这是因为这2个结构都包含一个structdevice结构)。 例如, 对于一个简单的只包含一个USB接口的USB鼠标, 下面的内容给这个设备的sysfs目录树:
                      HostController usb_device  
/sys/devices/pci0000:00/0000:00:1d.1/usb2/2-1
|-- 2-1:1.0 usb_interface          
RootHub
| |-- bAlternateSetting   接口描述符信息
| |-- bInterfaceClass
| |-- bInterfaceNumber
| |-- bInterfaceProtocol
| |-- bInterfaceSubClass
| |-- bNumEndpoints
|
|-- bConfigurationValue   设备配置信息
|-- bNumInterfaces
|-- bMaxPower
|-- bmAttributes
|-- bDeviceClass          设备描述信息
|-- bDeviceSubClass
|-- bDeviceProtocol
|--bMaxPacketSize0
|-- idVendor
|-- idProduct
|-- bcdDevice
|-- bNumConfigurations
|-- devnum               设备信息
|-- maxchild
|--product
|-- serial
|-- speed
|-- manufacturer

   结构usb_device在树中被表示在:
   /sys/devices/pci0000:00/0000:00:09.0/usb2/2-1

   而鼠标的USB接口(USB鼠标驱动程序所绑定的接口)位于如下目录:
   /sys/devices/pci0000:00/0000:00:09.0/usb2/2-1/2-1:1.0

   我们将描述内核如何分类USB设备,以帮助理解上面这些长长的设备路径名的含义。

   第一个USB设备是一个根集线器(root hub)。这是一个USB控制器(控制器器和根Hub集成在一起),通常包含在一个PCI设备中。之所以这样命名该控制器,是因为它控制着连接到其上的整个USB总线。该控制器是连接PCI总线和USB总线的桥,也是该总线上的第一个USB设备。

   所有的根集线器都由USB核心分配了唯一的编号。在我们的例子中,根集线器称为usb2,因为它是注册到USB核心的第2个根集线器。单个系统中可以包含的根集线器的编号在任何时候都是没有限制的。

    USB设备
usb_device的名字: 根Hub的编号 + - + 设备所在的端口号 。 例如: 2-1
   USB总线上的每个设备都以根集线器的编号作为其名字中的第一个号码。该号码随后是一个横扛字符(-)和设备所插入的端口号。因为我们例子中设备插入到第一个端口,1被添加到了名字中。因此,USB鼠标的名字是2-1。因为该USB设备包含一个接口,导致了树中的另一个设备被添加到sysfs路径中。

    USB接口usb_interface的命名: USB设备的名字+ :+ USB配置编号+ . + 接口编号。 例如:
2-1:1.0
   USB接口的命名方案是设备名直到接口为止:在我们的例子中,是2-1后面加一个冒号和USB配置的编号,然后是一个句点和接口的编号。因此对于本例而言,设备名是2-1:1.0,因为它是第一个配置,具有接口编号0。

    概言之,USBsysfs设备命名方案为:
   root_hub-hub_port:config.interface

   随着设备更深地进入USB树,和越来越多的USB集线器的使用,集线器的端口号被添加到跟随着链中前一个集线器端口号的字符串中。对于一个两层的树,其设备名类似于:
   root_hub-hub_port-hub_port:config.interface

   从前面的USB设备和接口的目录列表可以看到,所有的USB特定信息都可以从sysfs直接获得(例如,idVendor、idProduct和bMaxPower信息)。这些文件中的一个,即bConfigurationValue,可以被写入以改变当前使用的活动USB配置。当内核不能够确定选择哪一个配置以恰当地操作设备时,这对于具有多个配置的设备很有用。许多USB调制解调器需要向该文件中写入适当的配置值,以便把适当的USB驱动程序绑定到该设备。
   sysfs并没有展示USB设备所有的不同部分,它只限于接口级别。设备可能包含的任何可选配置都没有显示,还有和接口相关的端点的细节。这些信息可以从usbfs文件系统找到,该文件系统被挂载到系统的/proc/bus/usb/目录。/proc/bus/usb/devices文件确实显示了和sysfs所展示的所有信息相同的信息,还有系统中存在的所有USB设备的可选配置和端点信息。usbfs还允许用户空间的程序直接访问USB设备,这使得许多内核驱动程序可以迁移到用户空间,从而更容易维护和调试。USB扫描仪是一个很好的例子,它不再存在于内核中,因为它的功能现在包含在了用户空间的SANE库程序中。
0 0
原创粉丝点击