Debian

Linux Debian - 辨識 USB 特定埠已插入?

  • December 3, 2020

我很難USB connection在我的 Google Coral Board 上執行Debian。我正在嘗試確保系統可以確定是否插入了 USB-C 埠硬體。最好的方法是什麼?非常感謝任何幫助或建議!

我的回答對 USB 是通用的;由於缺少硬體,我沒有專門測試 USB-C。無論如何,即使 USB-C 可能與 USB-1/2/3 不同,它也應該讓您大致了解需要做什麼。

根據您的評論,我了解您希望在插入設備時點亮每個埠的 LED。

首先,您需要一種事件驅動的方法。udevd提供了這一點,允許您編寫在添加和刪除設備時觸發的規則(在啟動時,所有檢測到的設備都會觸發一個add事件,因此您不需要對啟動進行任何特殊處理)。乍一看,您可能想要過濾SUBSYSTEM=usbDEVTYPE=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-port1usb5-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工具對於配置規則也非常有用,尤其是infomonitor命令。

您可以使用lsusbusbview讀取sysfs屬性來查看有關已連接設備的資訊。

在sysfs下找到的特定於 USB 的資訊記錄在Linux 核心文件的 Linux-USB 主機端 API部分中,並且許多屬性與 USB 規範直接相關。

您可以從https://www.usb.org找到USB 類程式碼,這對於辨識設備類型很有用。有關 USB 配置層次結構的更一般描述,請參閱NutShell 章節中的 USB。5:USB 描述符

引用自:https://unix.stackexchange.com/questions/621742