13.2. USB 和 sysfs

2018-02-24 15:50 更新

13.2.?USB 和 sysfs

由于單個 USB 物理設備的復雜性, 設備在 sysfs 中的表示也非常復雜. 物理 USB 設備(通過 struct usb_device 表示)和單個 USB 接口(由 struct usb_interface 表示)都作為單個設備出現(xiàn)在 sysfs . (這是因為這 2 個結構都包含一個 struct device結構). 例如, 對于一個簡單的只包含一個 USB 接口的 USB 鼠標, 下面的內(nèi)容給這個設備的 sysfs 目錄樹:


/sys/devices/pci0000:00/0000:00:09.0/usb2/2-1
|-- 2-1:1.0
|  |-- bAlternateSetting  
|  |-- bInterfaceClass  
|  |-- bInterfaceNumber  
|  |-- bInterfaceProtocol  
|  |-- bInterfaceSubClass  
|  |-- bNumEndpoints  
|  |-- detach_state  
|  |-- iInterface  
|  `-- power  
|  `-- state  
|-- bConfigurationValue
|-- bDeviceClass
|-- bDeviceProtocol
|-- bDeviceSubClass
|-- bMaxPower
|-- bNumConfigurations
|-- bNumInterfaces
|-- bcdDevice
|-- bmAttributes
|-- detach_state
|-- devnum
|-- idProduct
|-- idVendor
|-- maxchild
|-- power
| `-- state
|-- speed
`-- version

結構 usb_device 在樹中被表示在:


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

而鼠標的 USB 接口 - USB 鼠標設備驅(qū)動被綁定到的接口 - 位于目錄:


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

為幫助理解這個長設備路徑的含義, 我們描述內(nèi)核如何標識 USB 設備.

第一個 USB 設備是一個根集線器. 這是 USB 控制器, 常常包含在一個 PCI 設備中. 控制器的命名是由于它控制整個連接到它上面的 USB 總線. 控制器是一個 PCI 總線和 USB 總線之間的橋, 同時是總線上的第一個設備.

所有的根集線器被 USB 核心安排了一個唯一的號. 在我們的例子里, 根集線器稱為 usb2, 因為它是注冊到 USB 核心的第 2 個根集線器. 可包含在單個系統(tǒng)中在任何時間的根集線器的數(shù)目沒有限制.

每個在 USB 總線上的設備采用根集線器的號作為它的名子的第一個數(shù)字. 緊跟著的是 - 字符和設備插入的端口號. 由于我們例子中的設備插在第一個端口, 一個 1 被添加到名子. 因此給主 USB 鼠標設備的名子是2-1. 因為這個 USB 設備包含一個接口, 那使得樹中的另一個設備被添加到 sysfs 路徑. 到此點, USB 接口的命名方法是設備名:在我們的例子, 是 2-1 接著一個分號和 USB 配置名, 接著一個句點和接口名. 因此對這個例子, 設備名是 2-1:1.0 因為它是第一個配置并且有接口號 0.

總結, USB sysfs 設備命名方法是:


root_hub-hub_port:config.interface 

隨著設備在 USB 樹中進一步向下, 并且越來越多的 USB 集線器, 集線器端口號被添加到字符串中緊隨著鏈中之前的集線器端口號. 對一個 2 層的樹, 設備名看來象:


root_hub-hub_port-hub_port:config.interface 

如同可在之前的 USB 設備和接口目錄列表中見到的, 所有的 USB 特定信息可直接從 sysfs 獲得(例如, idVendor, idProduct, 和 bMaxPower 信息). 一個文件, bConfigrationValue, 可被寫入來改變激活的正被使用的 USB 配置. 這對有多個配置的設備是有用的, 當內(nèi)核不能決定選擇什么配置來正確操作設備. 許多 USB 貓需要有正確的配置值被寫到這個文件來使正確的 USB 驅(qū)動綁定到設備.

sysfs 沒暴露一個 USB 設備的所有的不同部分,因為它停止在接口水平. 任何這個設備可能包含的預備配置都沒有展示, 連同關聯(lián)到接口的端點的細節(jié). 這個信息可在 usbfs 文件系統(tǒng)中找到, 它加載在系統(tǒng)的 /proc/bus/usb/ 目錄. 文件 /proc/bus/usb/devices 展示了所有的在 sysfs 中暴露的信息, 連同所有的出現(xiàn)在系統(tǒng)中的 USB 設備的預備配置和端點信息. usbfs 也允許用戶空間程序直接對話 USB 設備, 這已使能了許多內(nèi)核驅(qū)動被移出到用戶空間, 這里容易維護和調(diào)試. USB 掃描器驅(qū)動是這個的一個好例子, 由于它不再在內(nèi)核中出現(xiàn), 它的功能現(xiàn)在包含在用戶空間的 SANE 庫程序中.

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號