如何解决Linux下USB设备节点名不固定问题

时间:2022-05-21 07:44:47

如何解决Linux下USB设备节点名不固定问题

以USB转串口为例,通常设备节点名为ttyUSBx(x为0~n),Linux内核会根据插入设备的先后顺序进行编号的分配,比如第一个插入的设备编号为0,然后依此加1。

如果仅仅以设备节点ttyUSBn来区别具体是哪个设备,因为末位的编号是随时会变的,所以就会造成混乱。无法保证A设备就是0,B设备就是1。其实这个问题在LDD3上已经提到过,目前的内核早已经解决类似的问题,将所以有USB设备都导致到sys文件系统中,其实每个USB端口都有唯一的端口号,相当于每个门店的门牌号。只要我们依据端口号来进行设备的区分,那么问题就迎刃而解了。

比如当前设备插入两个USB转串口设备后,查看ttyUSBn所在端口的端口号:

root@android:/ $ ls -l /sys/class/tty/
...
lrwxrwxrwx root     root              2011-01-01 13:40 ttyUSB0 -> ../../devices/ff540000.usb/usb3/3-1/3-1.1/3-1.1:1.0/ttyUSB0/tty/ttyUSB0
lrwxrwxrwx root     root              2011-01-01 13:43 ttyUSB1 -> ../../devices/ff540000.usb/usb3/3-1/3-1.2/3-1.2:1.0/ttyUSB1/tty/ttyUSB1
root@android:/ $ 

其中ttyUSB0所在的端口号为3-1.1,而ttyUSB1所在的端口号为3-1.2

其它类型USB设备同理,以上思路清理完毕。

在调试USB Audio设备时,同样遇到了这个问题。记录一下查看USB Audio的方式以及如何区分他们:

tony@tony-E431:~$ cat /proc/asound/cards 
 0 [PCH            ]: HDA-Intel - HDA Intel PCH
                      HDA Intel PCH at 0xe4610000 irq 30
 1 [Device         ]: USB-Audio - USB PnP Audio Device
                      C-Media Electronics Inc. USB PnP Audio Device at usb-0000:00:14.0-3, full speed
tony@tony-E431:~$ ls -l /sys/class/sound/card1/
total 0
drwxr-xr-x 3 root root    0 1031 11:53 controlC1
lrwxrwxrwx 1 root root    0 1031 11:53 device -> ../../../3-3:1.0
-rw-r--r-- 1 root root 4096 1031 11:53 id
-r--r--r-- 1 root root 4096 1031 11:53 number
drwxr-xr-x 3 root root    0 1031 11:53 pcmC1D0c
drwxr-xr-x 2 root root    0 1031 11:54 power
lrwxrwxrwx 1 root root    0 1031 11:53 subsystem -> ../../../../../../../../class/sound
-rw-r--r-- 1 root root 4096 1031 11:53 uevent
tony@tony-E431:~$ 

在NanoPi2上:

root@nanopi2:/ # cat /proc/asound/cards 
 0 [I2SES8316      ]: I2S-ES8316 - I2S-ES8316
                      I2S-ES8316
 1 [SPDIFTranscieve]: SPDIF-Transciev - SPDIF-Transciever
                      SPDIF-Transciever
 2 [Device         ]: USB-Audio - USB PnP Audio Device
                      C-Media Electronics Inc. USB PnP Audio Device at usb-nxp-ehci-1.1, full speed
root@nanopi2:/ # ls -l /sys/class/sound/card2/ 
drwxr-xr-x root     root              2017-10-31 03:58 controlC2
lrwxrwxrwx root     root              2017-10-31 03:58 device -> ../../../1-1.1:1.0
-rw-r--r-- root     root         4096 2017-10-31 03:58 id
-r--r--r-- root     root         4096 2017-10-31 03:58 number
drwxr-xr-x root     root              2017-10-31 03:58 pcmC2D0c
drwxr-xr-x root     root              2017-10-31 03:58 power
lrwxrwxrwx root     root              2017-10-31 03:58 subsystem -> ../../../../../../../../../class/sound
-rw-r--r-- root     root         4096 2017-10-31 03:58 uevent
root@nanopi2:/ #