引导程序

引导程序

我正在使用 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
    

解决方案

获取参数

  1. 拔出您的设备
  2. 运行udevadm monitor -kups usb命令以获取完全填充的事件
  3. 连接它以获取日志

编写规则

你有两个选择:

  1. 根据原始KERNEL事件编写规则:

    ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \
      ENV{PRODUCT}=="403/6011/0", SYMLINK+="my_port"
    
  2. 根据扩展UDEV事件编写规则:

    ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \
      ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6011", SYMLINK+="my_port"
    

测试规则

您应该在生产前测试您的规则以避免不必要的行为(例如,太宽泛的条件 => 多个匹配 => 多次运行)

  1. 从上次运行的输出中获取设备路径udevadm monitor(例如:usb1/1-3在您的情况下)
  2. 运行udevadm testfor试运行udev 规则:

    udevadm test --action=add /sys/bus/usb/devices/usb1/1-3
    

应用更改并尝试

  1. 重新加载规则:

    udevadm control --reload
    
  2. 触发USB设备重新连接:

    udevadm trigger -v --action=add --subsystem-match /sys/bus/usb/devices/usb1/1-3
    

相关内容