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为例:

规则匹配主要基于几个字段:

KERNELS:kernel对设备的命名。此处为USB设备路径名。

ATTR / ATTRS:设备的属性,如idProduct/idVendor

SUBSYSTEMS:设备类型

ACTION:设备触发的操作,如add/change/remove

场景一:固定某个USB口的串口设备名称

Linux系统获取到USB设备路径后,然后使用udev工具为USB串口设备创建匹配规则,生成固定名称的串口名称。这样可以实现插入某个USB口的设备生成固定名称的tty串口名称,而不受插入顺序的限制。

如:接入两个相同的CH340设备,查看信息如下:

在/etc/udev/rules.d/创建自定义规则70-usb.rules,内容如下:

通过命令:udevadm control --reload-rules && udevadm trigger让规则生效或重启后自动生效。

设备接入后即可在/dev下查看到SYMLINK中重命名的串口设备。

场景二:固定USB转多串口设备的各串口名称

如:接入一个USB转双串口的CH342设备,查看信息如下:

同样在/etc/udev/rules.d/创建自定义规则71-usb.rules,内容如下:

如上规则使用了设备的VID和PID,与接口号。(每个串口分别对应一个USB接口)然后通过命令:udevadm control --reload-rules && udevadm trigger让规则生效或重启后自动生效。

设备接入后即可在/dev下查看到SYMLINK中重命名的串口设备。也即上例中的ttyGPS与ttyBLE串口设备。

posted @ 2022-07-25 09:51  WCH_SoftGroup  阅读(2023)  评论(0编辑  收藏  举报