シリアルデバイスアドレスを特定のUSBポートにバインド

シリアルデバイスアドレスを特定のUSBポートにバインド

私のオペレーティングシステム:Raspbian Stretch Lite

長すぎる博士。

  1. 同じUSBデバイスが2つあります。
  2. 住所が混同されないようにしたいです。
  3. 私の考えは、アドレスを特定のUSBポートにバインドすることです。ポートを「犠牲」にすることはできますか?
  4. 私はLinuxに初めて触れて何をすべきかわかりません。私が知る限り、udevはポートではなくIDでデバイスを区別します(他のメーカー、モデルなど)。
  5. 他の推奨方法はありますか?

長いバージョン:
だから、同じメーカーのUART-USBコンバータがあるので、udevなどで同じIDを持っています。両方のデバイスが混乱しないようにしたいと思います。たとえば、/ dev / ttyUSB0は常に私が望む特定のハードウェアを指します(例:内部。両方のデバイスがドアに分割されているため、外部と内部を混同しないことが重要です)。

これを実装する方法がわかりません。私の考えは、デバイスが特定のポートに接続されているときに常にそのデバイスに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"

注:ポートを特定のシリアルアドレスにバインドすると、そのポートを他のデバイスに使用できないことを意味しても大丈夫です。

ベストアンサー1

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

おすすめ記事