我正在使用 USB <-> 串行盒,并且希望为串行端口提供自定义符号链接。
根据输出,udevadm
我知道每个端口都有不同的 KERNELS 值:
KERNELS=="1-3:1.0" (this is labeled as port 1 on the box)
KERNELS=="1-3:1.1" (port 2)
KERNELS=="1-3:1.2" (port 3)
KERNELS=="1-3:1.3" (port 4)
我尝试了以下规则:
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", KERNELS=="1-3:1.3", SYMLINK+="my_port"
这不起作用。但是,如果我使用KERNELS=="1-3"
而不是KERNELS=="1-3:1.3"
,则会创建符号链接。
如何重写规则以区分不同的串行端口?
$ udevadm info --path=/sys/bus/usb-serial/devices/ttyUSB19 --attribute-walk
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3/ttyUSB19':
KERNEL=="ttyUSB19"
SUBSYSTEM=="usb-serial"
DRIVER=="ftdi_sio"
ATTR{latency_timer}=="16"
ATTR{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3':
KERNELS=="1-3:1.3"
SUBSYSTEMS=="usb"
DRIVERS=="ftdi_sio"
ATTRS{authorized}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceNumber}=="03"
ATTRS{bInterfaceProtocol}=="ff"
ATTRS{bInterfaceSubClass}=="ff"
ATTRS{bNumEndpoints}=="02"
ATTRS{interface}=="USB <-> Serial Cable"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3':
KERNELS=="1-3"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{bMaxPower}=="100mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 4"
ATTRS{bcdDevice}=="0800"
ATTRS{bmAttributes}=="80"
ATTRS{busnum}=="1"
ATTRS{configuration}==""
ATTRS{devnum}=="65"
ATTRS{devpath}=="3"
ATTRS{idProduct}=="6011"
ATTRS{idVendor}=="0403"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="FTDI"
[...]
答案1
引导程序
KERNEL
正如 @dirkt 所写,在为 USB 设备编写规则时,您无法进行数学计算。- 不幸的是,该设备在“”处的填充率不足以
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3/ttyUSB19'
进行正确的匹配(正如您在问题中看到的那样)。 但是
udev
您之前的规则和其他规则可以提供帮助!将udevadm info
打印原始设备信息,但是,将udevadm monitor -u -p
打印填充的版本:udevadm monitor --help ... -p --property Print the event properties -k --kernel Print kernel uevents -u --udev Print udev events -s --subsystem-match=SUBSYSTEM[/DEVTYPE] Filter events by subsystem
解决方案
获取参数
- 拔出您的设备
- 运行
udevadm monitor -kups usb
命令以获取完全填充的事件 - 连接它以获取日志
编写规则
你有两个选择:
根据原始
KERNEL
事件编写规则:ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \ ENV{PRODUCT}=="403/6011/0", SYMLINK+="my_port"
根据扩展
UDEV
事件编写规则:ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \ ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6011", SYMLINK+="my_port"
测试规则
您应该在生产前测试您的规则以避免不必要的行为(例如,太宽泛的条件 => 多个匹配 => 多次运行)
- 从上次运行的输出中获取设备路径
udevadm monitor
(例如:usb1/1-3
在您的情况下) 运行
udevadm test
for试运行udev 规则:udevadm test --action=add /sys/bus/usb/devices/usb1/1-3
应用更改并尝试
重新加载规则:
udevadm control --reload
触发USB设备重新连接:
udevadm trigger -v --action=add --subsystem-match /sys/bus/usb/devices/usb1/1-3