[ 教学 ] 如何识别 Linux 下的 USB 设备插在哪个口上

其实这个问题换句话说就是,比如我们

$ lspci | grep USB
00:1a.0 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 (rev 03)
00:1a.1 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 (rev 03)
00:1a.7 USB controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 (rev 03)
00:1d.0 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 (rev 03)
00:1d.1 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 (rev 03)
00:1d.2 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 (rev 03)
00:1d.7 USB controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 03)

能得到我们所有的 USB 口的文字表述,我们怎么把它们在计算机上的物理位置和这些文字表述匹配起来。或者说我现在知道我的 USB 设备插在一个 USB 接口上,但是我怎么知道这个接口究竟是什么样呢?

用途可能不是很广,就是有点强迫症而已…

首先我们需要一个鼠标(这都有吧,U 盘的情况可能有所不同,但原理都是相通的),然后 lsusb 看下你的鼠标:

$ lsusb
Bus 003 Device 029: ID 0a5c:2110 Broadcom Corp. Bluetooth Controller
Bus 003 Device 003: ID 0483:2016 SGS Thomson Microelectronics Fingerprint Reader
Bus 005 Device 004: ID 045e:0047 Microsoft Corp. IntelliMouse Explorer 3.0
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

看到我的鼠标是这个:

Bus 005 Device 004: ID 045e:0047 Microsoft Corp. IntelliMouse Explorer 3.0

这个信息只能给你一点提示,作用不是很大,现在我们知道这是一个微软的智慧型鼠标。

现在我们来看 /proc/bus/input/devices,这个是管输入设备的,比如鼠标,外接键盘,要是你用 U 盘来试的话,可能就是 /proc/bus/usb/devices 之类。/proc/bus 是不变的。你可以 cd 过去看一下撒。

$ vi /proc/bus/input/devices
I: Bus=0003 Vendor=045e Product=0047 Version=0110
N: Name="Microsoft Microsoft 5-Button Mouse with IntelliEye(TM)"
P: Phys=usb-0000:00:1d.0-1/input0
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.0/input/input12
U: Uniq=
H: Handlers=mouse1 event2
B: PROP=0
B: EV=17
B: KEY=1f0000 0 0 0 0
B: REL=103
B: MSC=10

我节选了鼠标的部分,其实这文件内容挺多的,比如触摸板,也在这里。我们要看的是 Sysfs 这行:

Sysfs=/devices/pci0000:00/0000:00:1d.0/usb5/5-1/5-1:1.0/input/input12

  • pci0000:00 这是你的 PCI 控制器,没用
  • 0000:00:1d.0 这是你的 USB 控制器的 PCI 标识符,这个有用
  • usb5 USB 控制器本身
  • 5-1 USB Hub 的标识符
  • 5-1:1.0 设备的 #1 配置 #0 接口

也有可能会是 5-1.1:1.0 的样子,这里 5-1.1 表示 USB 连接在那个 Hub 的第一个口上。

具体解释我参考的这里:http://stackoverflow.com/questions/7710835/linux-usb-device-path-meaning-need-to-distinguish-usb-serial-converters

下面记住 00:1d.0 这个字符串。还记得前面的这个吗?

$ lspci | grep USB
00:1a.0 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 (rev 03)
00:1a.1 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 (rev 03)
00:1a.7 USB controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 (rev 03)
00:1d.0 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 (rev 03)
00:1d.1 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 (rev 03)
00:1d.2 USB controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 (rev 03)
00:1d.7 USB controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 03)

看到 00:1d.0 没有?那个字段之前大家都以为是没用的… 现在知道怎么用了吧。

于是你的 USB 设备插着的口在 Linux 下的名称就叫做:

Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 (rev 03)

于是我就记住了,哦,原来我的笔记本电脑右下角的那个 USB 接口是 #1 口啊。

以此类推,就能建立起你对你的计算机硬件的更深刻的认识了,比如笔记本背面的那两个口,上面的是 #2, 下面的是 #3。。。然后它们都是 USB 1.1 的口。至于接口究竟是 USB 几点零的标准,看下面的解释:

  1. OHCI(Open Host Controller Interface)是支持 USB1.1 的标准,但它不仅仅是针对 USB,还支持其他的一些接口,比如它还支持 Apple 的火线(Firewire,IEEE 1394)接口。与 UHCI 相比,OHCI 的硬件复杂,硬件做的事情更多,所以实现对应的软件驱动的任务,就相对较简单。主要用于非 x86 的 USB,如扩展卡、嵌入式开发板的 USB 主控。

  2. UHCI(Universal Host Controller Interface),是 Intel 主导的对 USB1.0、1.1 的接口标准,与 OHCI 不兼容。UHCI 的软件驱动的任务重,需要做得比较复杂,但可以使用较便宜、较简单的硬件的 USB 控制器。Intel 和 VIA 使用 UHCI,而其余的硬件提供商使用 OHCI。

  3. EHCI(Enhanced Host Controller Interface),是 Intel 主导的 USB2.0 的接口标准。EHCI 仅提供 USB2.0 的高速功能,而依靠 UHCI 或 OHCI 来提供对全速(full-speed)或低速(low-speed)设备的支持。

  4. xHCI(eXtensible Host Controller Interface),是最新最火的 USB3.0 的接口标准,它在速度、节能、虚拟化等方面都比前面 3 中有了较大的提高。xHCI 支持所有种类速度的 USB 设备(USB 3.0 SuperSpeed, USB 2.0 Low-, Full-, and High-speed, USB 1.1 Low- and Full-speed)。xHCI 的目的是为了替换前面 3 中(UHCI/OHCI/EHCI)。

上面解释参考的是这里:http://smilejay.com/2012/10/usb_controller_xhci/

Enjoy!填完一个坑了,yeah!

2赞