如何为USB设备添加自定义属性,以便通过udev规则区分设备?
给缺失序列号的USB设备添加自定义标识以通过udev规则区分
首先明确:不存在你设想的那种直接写入ATTRS{}属性的工具,因为ATTRS{}是从硬件或sysfs读取的固有属性,无法随意修改。但可以通过以下几种方式实现设备区分的需求:
方法1:利用现有路径差异编写udev规则
从你提供的/dev/serial/by-id路径能看到两台设备的明显差异:正常设备路径带序列号,异常设备对应位置是短横线。直接基于这个特征写udev规则即可:
创建规则文件/etc/udev/rules.d/99-ftdi-devices.rules,内容如下:
# 匹配带序列号的正常FTDI设备,创建自定义软链接并标记环境变量 SUBSYSTEM=="tty", KERNEL=="ttyUSB*", ENV{ID_SERIAL}=="FTDI_DEVICE-NAME_*[0-9A-F]*", SYMLINK+="ttyFTDI_Normal", ENV{FTDI_TYPE}="normal" # 匹配无序列号的异常FTDI设备 SUBSYSTEM=="tty", KERNEL=="ttyUSB*", ENV{ID_SERIAL}=="FTDI_DEVICE-NAME_-*", SYMLINK+="ttyFTDI_Abnormal", ENV{FTDI_TYPE}="abnormal"
可以用
udevadm info -n /dev/ttyUSB0查看ENV{ID_SERIAL}的具体值,调整规则里的匹配字符串。
写完规则后,执行udevadm control --reload-rules && udevadm trigger生效。
方法2:通过udev脚本设置临时自定义sysfs属性
如果需要给设备添加自定义的可读取属性,可以通过udev调用脚本,在sysfs目录下创建临时属性(设备断开后会消失):
- 创建脚本
/usr/local/bin/set-ftdi-attr.sh,赋予执行权限chmod +x:
#!/bin/bash # 检查设备是否缺失序列号 if [[ -z "$ID_SERIAL_SHORT" ]]; then echo "abnormal" > /sys/class/tty/$KERNEL/ftdi_type chmod 644 /sys/class/tty/$KERNEL/ftdi_type else echo "normal" > /sys/class/tty/$KERNEL/ftdi_type chmod 644 /sys/class/tty/$KERNEL/ftdi_type fi
- 编写udev规则调用该脚本:
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", RUN+="/usr/local/bin/set-ftdi-attr.sh"
替换
idVendor和idProduct为你的FTDI设备实际ID,可通过lsusb命令查看。
方法3:给FTDI设备永久烧录序列号(最彻底)
大部分FTDI芯片支持写入自定义序列号,这是一劳永逸的解决方法:
- 使用FTDI官方工具
ft_prog或开源工具minipro,连接异常设备后读取芯片信息,写入自定义序列号(比如MYFTDI001),保存后重启设备。之后就能像正常设备一样通过ATTRS{serial}字段区分。
内容的提问来源于stack exchange,提问作者tnsh
相关产品推荐
相关产品推荐

