Linux系统固定USB串口设备名称
概述
Linux系统下使用多个USB转串口设备或一个USB设备拥有多个串口时,经常会遇到多个串口对应的设备名称无法区分的问题。Linux系统下的串口名称分配和硬件的上电顺序有关,如果是开机启动或者接在同一HUB下面,则由系统枚举各USB设备的顺序相关。以下介绍通过udev工具实现为USB转串口设备固定串口名称的实现原理与方法,该方法也适用于其他USB设备驱动。
关于udev
udev运行在用户态,脱离驱动层的关联,基于这种设计实现,用户可以通过编写规则来动态删除和修改/dev下的设备文件,任意命名设备。除了设备重命名外,还拥有修改设备访问权限的功能,可以实现在普通用户模式下操作/dev下系统设备,无需root模式下进行。
每当udevd收到uevent事件时就会去匹配规则,匹配成功后执行规则对应的操作。用户自定义规则放到/etc/udev/rules.d/目录下,以rules为扩展名。
通过udevadm命令(udevadm info -a -n /dev/ttyUSB0)或者sysfs(ls -la /sys/class/tty)可以查看USB串口芯片详细信息,以CH340为例:
![](https://pic4.zhimg.com/80/v2-20e8b81e5df43183ff22a867e87bd0e7_720w.jpg)
规则匹配主要基于几个字段:
KERNELS:kernel对设备的命名。此处为USB设备路径名。
ATTR / ATTRS:设备的属性,如idProduct/idVendor
SUBSYSTEMS:设备类型
ACTION:设备触发的操作,如add/change/remove
场景一:固定某个USB口的串口设备名称
Linux系统获取到USB设备路径后,然后使用udev工具为USB串口设备创建匹配规则,生成固定名称的串口名称。这样可以实现插入某个USB口的设备生成固定名称的tty串口名称,而不受插入顺序的限制。
如:接入两个相同的CH340设备,查看信息如下:
![](https://pic1.zhimg.com/80/v2-1d58867de9b8b5ca580a76df4ef036f4_720w.jpeg)
在/etc/udev/rules.d/创建自定义规则70-usb.rules,内容如下:
![](https://pic4.zhimg.com/80/v2-3ab301d9fb2d7cef25f866c81e3456e7_720w.jpeg)
通过命令:udevadm control --reload-rules && udevadm trigger让规则生效或重启后自动生效。
设备接入后即可在/dev下查看到SYMLINK中重命名的串口设备。
场景二:固定USB转多串口设备的各串口名称
如:接入一个USB转双串口的CH342设备,查看信息如下:
![](https://pic4.zhimg.com/80/v2-b3dceef5186eabf67b6c1f6b74dfce53_720w.jpg)
同样在/etc/udev/rules.d/创建自定义规则71-usb.rules,内容如下:
![](https://pic4.zhimg.com/80/v2-e9c2d7d4a113334a311799db952d7e2b_720w.png)
如上规则使用了设备的VID和PID,与接口号。(每个串口分别对应一个USB接口)然后通过命令:udevadm control --reload-rules && udevadm trigger让规则生效或重启后自动生效。
设备接入后即可在/dev下查看到SYMLINK中重命名的串口设备。也即上例中的ttyGPS与ttyBLE串口设备。