Linux-Kernel

Linux 中的假 USB 集線器

  • April 3, 2019

使用 Ubuntu 18.04,我的台式機主機板獲得:

$ lsusb -t
   /:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
   /:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/14p, 480M
       |__ Port 13: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
       |__ Port 14: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
       |__ Port 14: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
   /:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
       |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
   /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
       |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M

主機板正好有 14 個 USB 物理連接器,就像Bus 03.Port 1: Dev 1. 任何新的 USB 設備(例如,USB 2.0 儲存密鑰)在Bus 03.

顯示的lsusb -t應該是本系統中所有的USB設備。然後:

  1. 如果Bus 003單獨能夠覆蓋主機板上的所有物理 USB 連接器,那麼Bus 001Bus 002是什麼Bus 004

在這個處理 USB 匯流排的答案中,聲明:

其中一些或全部可能具有用於插入各種 USB 外部設備的外部埠。

暗示某些 USB 匯流排可能沒有外部埠。但是之後:

2)如果沒有內部(例如,焊接)設備連接到它們,並且也沒有外部設備可以連接到它們,那麼這種假匯流排有什麼用處?


編輯這個(非常有用的)答案涉及公共汽車編號。相反,我的文章處理的是 Linux 核心列出了一些 USB 匯流排的可能性,但它們並不對應於任何真實的匯流排。為什麼會出現這些公共汽車,它們的用途是什麼?這與簡單地處理匯流排編號約定不同。我也確信這是一個軟體問題,因為它是關於 Linux 核心如何表示硬體的。

USB3 標準帶來了 SuperSpeed 模式,帶有新的電纜和連接器。您的匯流排 4 涵蓋了 SuperSpeed 模式,該模式在 USB 電纜中使用完全不同的一組電線。因此,由於高速模式與舊的 USB 接線在物理上是分開的,因此將其完全顯示為單獨的匯流排是有意義的。

剩下的匯流排 1 和 2。它們基本上允許使用 USB 鍵盤、滑鼠和/或安裝介質輕鬆安裝 Windows 7 :-)

請記住,Windows 7(以及任何 USB3 之前的作業系統)沒有內置 XHCI USB 控制器驅動程序。因此,作為向後兼容功能,您的系統也有 EHCI USB2 控制器。系統韌體可以選擇最初僅啟動 EHCI 控制器並將它們連接到 USB 2 線路而不是 XHCI 控制器。這允許作業系統安裝程序使用普通的舊 EHCI USB 驅動程序啟動和執行,用於鍵盤、滑鼠和 USB 儲存。

當安裝適當的驅動程序並啟動 XHCI 控制器時,有一個移交協議允許它也接管埠 USB2 端的控制。此時,可以完全禁用 EHCI 控制器。因此,您的 USB 匯流排 1 和 2 是兩個廉價的向後兼容 EHCI 控制器,它們現在已將各自的 USB 埠移交給閃亮的新 XHCI 控制器。

請注意,兩個 EHCI 控制器每個僅支持 2 個埠,並且它們與單獨的根集線器對象連接,分別支持 8 個和 6 個埠,總共有 14 個 USB2 埠 - 與單個根集線器處理的數量完全相同匯流排 3,它是 XHCI 控制器的“慢”端。

(在引入 USB 2 時,對於向後兼容性問題有一種類似的解決方案:舊的 USB 1.1 UHCI/OHCI 控制器作為“配套控制器”與 USB 2.0 EHCI 控制器一起存在了很長時間。但那個解決方案沒有包含切換協議,因此兩代 USB 控制器並存了很長時間。在 USB 3 中,規範制定者包含了切換協議,希望擺脫傳統的 EHCI控制器快一點。)

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