為幫助理解這個長設(shè)備路徑的含義, 我們描述內(nèi)核如何標識 USB 設(shè)備.
第一個 USB 設(shè)備是一個根集線器. 這是 USB 控制器, 常常包含在一個 PCI 設(shè)備中. 控制器的命名是由于它控制整個連接到它上面的 USB 總線. 控制器是一個 PCI 總線和 USB 總線之間的橋, 同時是總線上的第一個設(shè)備.
所有的根集線器被 USB 核心安排了一個唯一的號. 在我們的例子里, 根集線器稱為 usb2, 因為它是注冊到 USB 核心的第 2 個根集線器. 可包含在單個系統(tǒng)中在任何時間的根集線器的數(shù)目沒有限制.
每個在 USB 總線上的設(shè)備采用根集線器的號作為它的名子的第一個數(shù)字. 緊跟著的是 - 字符和設(shè)備插入的端口號. 由于我們例子中的設(shè)備插在第一個端口, 一個 1 被添加到名子. 因此給主 USB 鼠標設(shè)備的名子是2-1. 因為這個 USB 設(shè)備包含一個接口, 那使得樹中的另一個設(shè)備被添加到 sysfs 路徑. 到此點, USB 接口的命名方法是設(shè)備名:在我們的例子, 是 2-1 接著一個分號和 USB 配置名, 接著一個句點和接口名. 因此對這個例子, 設(shè)備名是 2-1:1.0 因為它是第一個配置并且有接口號 0.
總結(jié), USB sysfs 設(shè)備命名方法是:
root_hub-hub_port:config.interface
隨著設(shè)備在 USB 樹中進一步向下, 并且越來越多的 USB 集線器, 集線器端口號被添加到字符串中緊隨著鏈中之前的集線器端口號. 對一個 2 層的樹, 設(shè)備名看來象:
root_hub-hub_port-hub_port:config.interface
如同可在之前的 USB 設(shè)備和接口目錄列表中見到的, 所有的 USB 特定信息可直接從 sysfs 獲得(例如, idVendor, idProduct, 和 bMaxPower 信息). 一個文件, bConfigrationValue, 可被寫入來改變激活的正被使用的 USB 配置. 這對有多個配置的設(shè)備是有用的, 當(dāng)內(nèi)核不能決定選擇什么配置來正確操作設(shè)備. 許多 USB 貓需要有正確的配置值被寫到這個文件來使正確的 USB 驅(qū)動綁定到設(shè)備.
sysfs 沒暴露一個 USB 設(shè)備的所有的不同部分,因為它停止在接口水平. 任何這個設(shè)備可能包含的預(yù)備配置都沒有展示, 連同關(guān)聯(lián)到接口的端點的細節(jié). 這個信息可在 usbfs 文件系統(tǒng)中找到, 它加載在系統(tǒng)的 /proc/bus/usb/ 目錄. 文件 /proc/bus/usb/devices 展示了所有的在 sysfs 中暴露的信息, 連同所有的出現(xiàn)在系統(tǒng)中的 USB 設(shè)備的預(yù)備配置和端點信息. usbfs 也允許用戶空間程序直接對話 USB 設(shè)備, 這已使能了許多內(nèi)核驅(qū)動被移出到用戶空間, 這里容易維護和調(diào)試. USB 掃描器驅(qū)動是這個的一個好例子, 由于它不再在內(nèi)核中出現(xiàn), 它的功能現(xiàn)在包含在用戶空間的 SANE 庫程序中.
更多建議: