连接到 HUB 的 USB 设备的 KERNELS 路径

连接到 HUB 的 USB 设备的 KERNELS 路径

我正在创建 udev 规则以将我的 USB 设备 (ttyUSB*) 映射到它们所连接的 USB 端口。通常的方法是查看以下输出:

udevadm info --name=/dev/ttyUSB0 --attribute-walk

这是我的输出(我删除了ATTRS没有意义的行):

looking at device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="ftdi_sio"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6/1-1.5.6:1.0':
    KERNELS=="1-1.5.6:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="ftdi_sio"
    ATTRS{interface}=="USB-RS485 Cable"
    ATTRS{supports_autosuspend}=="1"

    looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5.6':
    KERNELS=="1-1.5.6"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{product}=="USB-RS485 Cable"
    ATTRS{serial}=="FTY48GF2"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5':
    KERNELS=="1-1.5"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{product}=="USB 2.0 Hub [MTT]"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"

  looking at parent device '/devices/platform/soc/3f980000.usb/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{manufacturer}=="Linux 4.9.41-v7+ dwc_otg_hcd"
    ATTRS{product}=="DWC OTG Controller"

  looking at parent device '/devices/platform/soc/3f980000.usb':
    KERNELS=="3f980000.usb"
    SUBSYSTEMS=="platform"
    DRIVERS=="dwc_otg"

  looking at parent device '/devices/platform/soc':
    KERNELS=="soc"
    SUBSYSTEMS=="platform"
    DRIVERS==""

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

这里的连接:Raspberry Pi -> USB HUB -> FTDI dongle。我的规则如下:

$ cat /etc/udev/rules.d/99-usb.rules 
KERNEL=="1-1.5.6", SUBSYSTEM=="usb", SYMLINK+="rs485"

但:

# ls -l /dev/rs485 
lrwxrwxrwx 1 root root 15 Oct  4 07:04 /dev/rs485 -> bus/usb/001/009

我原本期望应该创建指向 /dev/ttyUSB0 的符号链接。现在,我了解到我的加密狗位于该 USB 位置:

$ lsusb
Bus 001 Device 006: ID 046d:c062 Logitech, Inc. M-UAS144 [LS1 Laser Mouse]
Bus 001 Device 009: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
...

但当然它不是串行端口(即我不能echo使用它)。尝试用作1-1.5.6:1.0KERNEL 键不起作用 - 未创建符号链接。

我应该使用什么值?

答案1

如果您查看man udevKERNELS则搜索设备路径,同时KERNEL匹配设备本身,并SUBSYSTEM表示生成事件的内核部分。当您的 USB 加密狗插入时,一些当内核的一部分发现设备并做出相应反应时,就会创建 udev 事件。

您希望您的规则在设备本身的操作上触发(SUBSYSTEM=="tty",因为您需要 的链接/dev/ttyUSB0),但对于SUBSYSTEMS=="usb",它会在发现 USB 设备本身时触发,而不是在启动 USB 设备的驱动程序时触发。这就是为什么您会获得从 USB 子系统看到的 USB 设备的链接bus/usb/001/009o

所以你需要的是

KERNELS=="1-1.5.6", SUBSYSTEM=="tty", SYMLINK+="rs485"

(注意Stty)。

相关内容