Linux Debian - 识别插入特定端口的 USB?

Linux Debian - 识别插入特定端口的 USB?

USB connection我在运行我的 Google Coral Board 时遇到了困难Debian。我试图确保系统可以确定 USB-C 端口硬件是否已插入。执行此操作的最佳方法是什么?非常感谢任何帮助或建议!

答案1

我的答案是通用的USB;由于缺乏硬件,我没有专门测试 USB-C。无论如何,即使 USB-C 可能与 USB-1/2/3 不同,它也应该让您大致了解需要做什么。

根据您的评论,我的理解是您希望在插入设备时点亮每个端口的 LED。

首先,您需要一种事件驱动的方法。乌德夫德提供了这一点,允许您编写在添加和删除设备时触发的规则(在启动时,所有检测到的设备都会触发一个add事件,因此您不需要对启动进行任何特殊处理)。乍一看,您可能想要过滤SUBSYSTEM=usbDEVTYPE=usb_device。有了适当的规则,乌德夫德将触发一个处理程序脚本来告诉您何时添加或删除设备,以及有关它的一些信息,例如事件类型和设备路径/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。


配置乌德夫德,请参阅联机帮助页,man 7 udev.该udevadm工具对于配置规则也非常有用,尤其是信息监视器命令。

您可以使用lsusbusbview并阅读系统文件系统属性来查看有关已连接设备的信息。

USB 特定信息位于系统文件系统记录在Linux-USB 主机端 APILinux 内核文档部分,许多属性与 USB 规范直接相关。

您可以找到USB 类代码https://www.usb.org,这对于识别设备类型很有用。有关 USB 配置层次结构的更一般描述,请参阅USB 简述一章。 5:USB描述符

相关内容