Raspberry-Pi

連接到 HUB 的 USB 設備的 KERNELS 路徑

  • October 4, 2017

我正在創建 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.0用作 KERNEL 密鑰不起作用 - 沒有創建符號連結。

我應該使用什麼值?

如果您查看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)。

引用自:https://unix.stackexchange.com/questions/395962