Linux Debian - 辨識 USB 特定埠已插入?
我很難
USB connection
在我的 Google Coral Board 上執行Debian
。我正在嘗試確保系統可以確定是否插入了 USB-C 埠硬體。最好的方法是什麼?非常感謝任何幫助或建議!
我的回答對 USB 是通用的;由於缺少硬體,我沒有專門測試 USB-C。無論如何,即使 USB-C 可能與 USB-1/2/3 不同,它也應該讓您大致了解需要做什麼。
根據您的評論,我了解您希望在插入設備時點亮每個埠的 LED。
首先,您需要一種事件驅動的方法。udevd提供了這一點,允許您編寫在添加和刪除設備時觸發的規則(在啟動時,所有檢測到的設備都會觸發一個
add
事件,因此您不需要對啟動進行任何特殊處理)。乍一看,您可能想要過濾SUBSYSTEM=usb
和DEVTYPE=usb_device
。有了適當的規則,udevd將觸發一個處理程序腳本來告訴您何時添加或刪除設備,並提供一些有關它的資訊,例如事件類型和設備路徑/sys
。然後,您的處理程序腳本必須查找其中包含的資訊,
/sys
以確定設備是否連接到根 USB 集線器之一上的已知埠(請參閱 參考資料/sys/bus/usb/devices/usb[0-9]
)。並非所有設備添加/刪除都會切換燈,因為有些設備可以從集線器添加/刪除,在這種情況下,只有集線器本身會觸發燈。因此,對於每個事件,檢查port
文件的符號連結目標 - 在目標名稱中,您將擁有集線器的名稱,後跟埠號。例如,在我的系統上……每個 USB 版本/速度似乎都有自己的匯流排,所以如果我查看根集線器:
$ lsusb -t |grep ^/ /: Bus 09.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/4p, 12M /: Bus 08.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/2p, 12M /: Bus 07.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/5p, 12M /: Bus 06.Port 1: Dev 1, Class=root_hub, Driver=ohci-pci/5p, 12M /: Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M /: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M /: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/4p, 480M /: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/5p, 480M /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/5p, 480M
匯流排 1、2、3 和 6、7、9 共享相同的物理埠(它們共享相同的 PCI 設備編號,只是功能不同)。與匯流排 4 和 5 相同(甚至相同的 PCI 功能,這也解釋了為什麼它們都使用相同的 xhci 驅動程序)。匯流排 8 僅為 USB1。其中一些設備具有內部 USB 接頭,因為我只有 4 個板載 USB2 埠。有些甚至可能根本沒有接頭,例如為特殊的板載設備或基於相同晶片/PCB的其他主機板型號保留的接頭。
此命令查看連接到我的桌面的所有設備,不包括所有介面 (
*:*
),並在它們下列印埠符號連結:$ for f in /sys/bus/usb/devices/+([^:])/*port*; do printf '%-32s: %s\n' $f $(readlink $f); done /sys/bus/usb/devices/1-2.1/port : ../1-2:1.0/1-2-port1 /sys/bus/usb/devices/1-2.2/port : ../1-2:1.0/1-2-port2 /sys/bus/usb/devices/1-2.4/port : ../1-2:1.0/1-2-port4 /sys/bus/usb/devices/1-2/port : ../1-0:1.0/usb1-port2 /sys/bus/usb/devices/4-1/port : ../4-0:1.0/usb4-port1 /sys/bus/usb/devices/5-1.1/port : ../5-1:1.0/5-1-port1 /sys/bus/usb/devices/5-1.3/port : ../5-1:1.0/5-1-port3 /sys/bus/usb/devices/5-1/port : ../5-0:1.0/usb5-port1 /sys/bus/usb/devices/7-1/port : ../7-0:1.0/usb7-port1
請注意,我正在查看以下設備
/sys/bus/usb/devices/
;udev 將為您提供完整的路徑/sys/devices/
- 它們是相同的;您可以使用它udevadm info
來獲取實際的設備路徑。查看這個並探勘底層設備資訊,我可以看到我的顯示器集線器
usb1-port2
與三個設備(鍵盤、滑鼠、1-2 上的網路攝像頭)相連;在匯流排 4/5 上,有一個 USB3 集線器顯示為連接到usb4-port1
和usb5-port1
(相同的物理埠,EHCI/XHCI)和它下面的兩個 USB3 設備(在 5-1);最後是一個低速串列設備usb7-port1
。如果您的設備中有二級集線器,您將需要找到如何辨識它們並考慮它們的埠。例如,我的 RPi v3 有 4 個外部 USB 埠,但是當我查看設備時,SoC 的板載控制器只有 1 個 USB2 埠,上面有一個 5 埠集線器,第一個埠連接板載 USB 乙太網控制器和其餘 4 個是可用的 USB 埠。
最後,如果您有多個根集線器,則需要一種方法來可靠地辨識每個相關集線器 - 使用供應商/型號 ID(僅使用數字值,解碼的名稱通常來自本地數據庫並且可能會更改),或者,如果您有多個相同的集線器,則為底層匯流排 ID(如果是 PCI/PCIe 設備,則為 PCI ID)。PCI ID 可能會隨著底層硬體(主機板型號甚至修訂版本)而發生變化,但如果根設備始終使用相同的插槽號,您至少可以信任設備 ID 順序。然後根據規格或通過測試埠,將每個集線器的埠號與物理埠位置相匹配。如果外部集線器具有相同的供應商/型號 ID,您也可以檢查深度。
要配置udevd,請參見手冊頁
man 7 udev
。該udevadm
工具對於配置規則也非常有用,尤其是info和monitor命令。您可以使用
lsusb
和usbview
讀取sysfs屬性來查看有關已連接設備的資訊。在sysfs下找到的特定於 USB 的資訊記錄在Linux 核心文件的 Linux-USB 主機端 API部分中,並且許多屬性與 USB 規範直接相關。
您可以從https://www.usb.org找到USB 類程式碼,這對於辨識設備類型很有用。有關 USB 配置層次結構的更一般描述,請參閱NutShell 章節中的 USB。5:USB 描述符。