13.2. USB 和 sysfs

2018-02-24 15:50 更新

13.2.?USB 和 sysfs

由于單個(gè) USB 物理設(shè)備的復(fù)雜性, 設(shè)備在 sysfs 中的表示也非常復(fù)雜. 物理 USB 設(shè)備(通過(guò) struct usb_device 表示)和單個(gè) USB 接口(由 struct usb_interface 表示)都作為單個(gè)設(shè)備出現(xiàn)在 sysfs . (這是因?yàn)檫@ 2 個(gè)結(jié)構(gòu)都包含一個(gè) struct device結(jié)構(gòu)). 例如, 對(duì)于一個(gè)簡(jiǎn)單的只包含一個(gè) USB 接口的 USB 鼠標(biāo), 下面的內(nèi)容給這個(gè)設(shè)備的 sysfs 目錄樹(shù):


/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

結(jié)構(gòu) usb_device 在樹(shù)中被表示在:


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

而鼠標(biāo)的 USB 接口 - USB 鼠標(biāo)設(shè)備驅(qū)動(dòng)被綁定到的接口 - 位于目錄:


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

為幫助理解這個(gè)長(zhǎng)設(shè)備路徑的含義, 我們描述內(nèi)核如何標(biāo)識(shí) USB 設(shè)備.

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

所有的根集線器被 USB 核心安排了一個(gè)唯一的號(hào). 在我們的例子里, 根集線器稱為 usb2, 因?yàn)樗亲?cè)到 USB 核心的第 2 個(gè)根集線器. 可包含在單個(gè)系統(tǒng)中在任何時(shí)間的根集線器的數(shù)目沒(méi)有限制.

每個(gè)在 USB 總線上的設(shè)備采用根集線器的號(hào)作為它的名子的第一個(gè)數(shù)字. 緊跟著的是 - 字符和設(shè)備插入的端口號(hào). 由于我們例子中的設(shè)備插在第一個(gè)端口, 一個(gè) 1 被添加到名子. 因此給主 USB 鼠標(biāo)設(shè)備的名子是2-1. 因?yàn)檫@個(gè) USB 設(shè)備包含一個(gè)接口, 那使得樹(shù)中的另一個(gè)設(shè)備被添加到 sysfs 路徑. 到此點(diǎn), USB 接口的命名方法是設(shè)備名:在我們的例子, 是 2-1 接著一個(gè)分號(hào)和 USB 配置名, 接著一個(gè)句點(diǎn)和接口名. 因此對(duì)這個(gè)例子, 設(shè)備名是 2-1:1.0 因?yàn)樗堑谝粋€(gè)配置并且有接口號(hào) 0.

總結(jié), USB sysfs 設(shè)備命名方法是:


root_hub-hub_port:config.interface 

隨著設(shè)備在 USB 樹(shù)中進(jìn)一步向下, 并且越來(lái)越多的 USB 集線器, 集線器端口號(hào)被添加到字符串中緊隨著鏈中之前的集線器端口號(hào). 對(duì)一個(gè) 2 層的樹(shù), 設(shè)備名看來(lái)象:


root_hub-hub_port-hub_port:config.interface 

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)