Udev

將串口設備地址綁定到特定的 USB 埠

  • August 2, 2019

我的作業系統:Raspbian Stretch Lite

tl;博士;

  1. 我有 2 個相同的 USB 設備
  2. 我想確保他們的地址沒有混淆
  3. 我的想法是將地址綁定到特定的 USB 埠。我可以“犧牲”港口
  4. 由於我是linux新手,我不知道該怎麼做。據我所知,udev 通過 ID 區分設備,而不是埠(不同的製造商、型號等)
  5. 有沒有其他推薦的方法?

長版:

所以,我有同一個製造商的這個 UART 到 USB 轉換器,所以它在 udev 和 all 中具有相同的 ID。我想確保 2 設備沒有混淆。例如,/dev/ttyUSB0 將始終指向我想要的特定硬體(例如:內部。這 2 個設備將被一扇門隔開,所以不要弄亂外部和內部是非常重要的)。

我不知道如何做到這一點。我的想法是綁定特定埠,以便當設備插入這些特定埠時,它總是將地址 ttyUSB0 提供給該設備。甚至有可能做到這一點嗎?我是 linux 新手,我知道有 udev 規則。但據我所知,它只通過它的 id 綁定設備,而不是埠。或者有沒有其他推薦的方式來使用udev?

這是我udevadm的設備:

 looking at device '/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/ttyUSB0/tty/ttyUSB0':
   KERNEL=="ttyUSB0"
   SUBSYSTEM=="tty"
   DRIVER==""

 looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/ttyUSB0':
   KERNELS=="ttyUSB0"
   SUBSYSTEMS=="usb-serial"
   DRIVERS=="cp210x"
   ATTRS{port_number}=="0"

 looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0':
   KERNELS=="3-2:1.0"
   SUBSYSTEMS=="usb"
   DRIVERS=="cp210x"
   ATTRS{authorized}=="1"
   ATTRS{bAlternateSetting}==" 0"
   ATTRS{bInterfaceClass}=="ff"
   ATTRS{bInterfaceNumber}=="00"
   ATTRS{bInterfaceProtocol}=="00"
   ATTRS{bInterfaceSubClass}=="00"
   ATTRS{bNumEndpoints}=="02"
   ATTRS{interface}=="CP2102 USB to UART Bridge Controller"
   ATTRS{supports_autosuspend}=="1"

 looking at parent device '/devices/pci0000:00/0000:00:14.0/usb3/3-2':
   KERNELS=="3-2"
   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}==" 1"
   ATTRS{bcdDevice}=="0100"
   ATTRS{bmAttributes}=="80"
   ATTRS{busnum}=="3"
   ATTRS{configuration}==""
   ATTRS{devnum}=="57"
   ATTRS{devpath}=="2"
   ATTRS{idProduct}=="ea60"
   ATTRS{idVendor}=="10c4"
   ATTRS{ltm_capable}=="no"
   ATTRS{manufacturer}=="Silicon Labs"
   ATTRS{maxchild}=="0"
   ATTRS{product}=="CP2102 USB to UART Bridge Controller"
   ATTRS{quirks}=="0x0"
   ATTRS{removable}=="removable"
   ATTRS{serial}=="0001"
   ATTRS{speed}=="12"
   ATTRS{urbnum}=="1909"
   ATTRS{version}==" 1.10"

注意:如果將埠綁定到特定的串列地址意味著我不能將該埠用於任何其他設備,那麼這對我來說很好

與其嘗試根據路徑修復路徑名,不如udev直接使用儲存在/dev/serial/by-path/dev/serial/by-id

這些是設備的符號連結,ttyUSB並在發現設備時更新。

例如在我的機器上:

% ls -l /dev/serial/by-path/
total 0
lrwxrwxrwx 1 root root 13 Dec 12 19:23 pci-0000:00:1a.0-usb-0:1.5.1:1.0-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 Dec 12 19:23 pci-0000:00:1a.0-usb-0:1.5.1:1.1-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root 13 Dec  9 10:56 pci-0000:00:1a.0-usb-0:1.5.2:1.0-port0 -> ../../ttyUSB4
lrwxrwxrwx 1 root root 13 Dec 12 19:23 pci-0000:00:1a.0-usb-0:1.5.4:1.0-port0 -> ../../ttyUSB2
lrwxrwxrwx 1 root root 13 Dec 12 19:23 pci-0000:00:1a.0-usb-0:1.5.4:1.1-port0 -> ../../ttyUSB3
lrwxrwxrwx 1 root root 13 Dec 12 19:24 pci-0000:00:1a.0-usb-0:1.6:1.0-port0 -> ../../ttyUSB5

% ls -l /dev/serial/by-id/  
total 0
lrwxrwxrwx 1 root root 13 Dec  9 10:56 usb-1a86_USB2.0-Ser_-if00-port0 -> ../../ttyUSB4
lrwxrwxrwx 1 root root 13 Dec 12 19:24 usb-1a86_USB2.0-Serial-if00-port0 -> ../../ttyUSB5
lrwxrwxrwx 1 root root 13 Dec 12 19:23 usb-utek_USB__-__Serial_Cable_FTVW64JR-if00-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 Dec 12 19:23 usb-utek_USB__-__Serial_Cable_FTVW64JR-if01-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root 13 Dec 12 19:23 usb-utek_USB__-__Serial_Cable_FTWKU6FP-if00-port0 -> ../../ttyUSB2
lrwxrwxrwx 1 root root 13 Dec 12 19:23 usb-utek_USB__-__Serial_Cable_FTWKU6FP-if01-port0 -> ../../ttyUSB3

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