USB和sysfs文件系统

5 篇文章 0 订阅
1 篇文章 0 订阅
由于单个USB物理设备的复杂性,设备在sysfs中的表示也非常复杂。无论是物理USB设备(用struct  usb_device 表示)还是单独的USB接口(用struct  usb_interface 表示),在sysfs中均表示为单独的设备(这是因为这2个结构都包含一个struct device结构)。 例如, 对于一个简单的只包含一个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。

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

    随着设备更深地进入USB树,和越来越多的USB集线器的使用,集线器的端口号被添加到跟随着链中前一个集线器端口号的字符串中。对于一个两层的树,其设备名类似于:
    root_hub - hub_port - hub_port:config.interface 
     也就是当插入一个usb设备时,实际上在sys中相当于插入了两个设备,分别是 usb_device和usb_interface,那么对应的在sys会产生 root_hub-hub_port:config.interface和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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值