複数の tty デバイスを持つデバイスの rule.d ルールを追加中に問題が発生しました。

複数の tty デバイスを持つデバイスの rule.d ルールを追加中に問題が発生しました。

/etc/udev/rules.dTexas Instruments CC1352P-2開発ボードのルールを追加したいです。私のUbuntuサーバーは2つのttyACMデバイスを作成します。

crw-rw-rw- 1 root dialout 166, 1 Sep 28 10:37 /dev/ttyACM1
crw-rw-rw- 1 root dialout 166, 2 Sep 28 07:28 /dev/ttyACM2

ttyACM1最初のデバイス(この場合)へのシンボリックリンクを作成したいと思います。ただし、使用する場合は、ベンダーusb-devicesID + 製品 ID セットを使用してボードのセクションを作成します。

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  5 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=0451 ProdID=bef3 Rev=01.00
S:  Manufacturer=Texas Instruments
S:  Product=XDS110 (03.00.00.15) Embed with CMSIS-DAP
S:  SerialNumber=L430037Y
C:  #Ifs= 7 Cfg#= 1 Atr=80 MxPwr=500mA
I:  If#=0x0 Alt= 0 #EPs= 1 Cls=02(commc) Sub=02 Prot=01 Driver=cdc_acm
I:  If#=0x1 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
I:  If#=0x2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)
I:  If#=0x3 Alt= 0 #EPs= 1 Cls=02(commc) Sub=02 Prot=01 Driver=cdc_acm
I:  If#=0x4 Alt= 0 #EPs= 2 Cls=0a(data ) Sub=00 Prot=00 Driver=cdc_acm
I:  If#=0x5 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid
I:  If#=0x6 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=00 Prot=00 Driver=(none)

次に、次のIDを使用してルールを作成します/etc/udev/rules.d/50-devboards.rules

# Texas Instruments CC1352P-2 development kit
KERNEL=="ttyACM*" ATTRS{idVendor}=="0451", ATTRS{idProduct}=="bef3", MODE="0666", SYMLINK+="tty-CC1352P-2"

ttyACM2これにより、を指すシンボリックリンクが生成されますttyACM1

lrwxrwxrwx 1 root root 7 Sep 28 07:28 /dev/tty-CC1352P-2 -> ttyACM2

質問:デバイスがその下に複数のttyデバイスを作成する場合、ルールのターゲットを特定のttyデバイスとして指定するにはどうすればよいですか/dev

答え1

「ttyデバイス」と「USBデバイス」の間には中間層があります。 - 「USB相互作用ドライバはUSBデバイスに完全に接続されていませんが、各インターフェイスに別々のドライバインスタンスがあります(他のドライバである可能性があります)。

(残念ながら、Ubuntuにusbutilsは含まれていません。lsusb.py、この-iオプションを使用すると、インターフェイスを含む完全なUSB階層が表示されます。 )

USBデバイスには0x00から0x06まで番号付けされた複数のインターフェイスがあり、ttyACM1はインターフェイス0を介して生成され、ttyACM2はインターフェイス3を介して生成されました(しかしこれを使用してudevadm info /dev/ttyACM2理解できます)。

一致の一部としてインターフェイス番号を使用します(例:)ATTRS{bInterfaceNumber}=="00"


ただし、単一のルール内のすべてのATTRS(およびENVS)一致は同じ「親」レベルにロックされますが、2つの異なるレベルの属性を一致させる必要があります。したがって、ENVS を使用するか、次の 2 つの規則が必要になる場合があります。

  1. 最初のルールでは、「インターフェース」デバイスを一致させ、ENV属性を適用します。

    ACTION!="remove", DEVTYPE=="usb_interface", \
      ATTRS{idVendor}=="xx", ATTRS{idProduct}=="xx", \
      ATTR{bInterfaceNumber}=="xx",
      ENV{devboard_link}="tty-CC1352P-2"
    
  2. 次に、「tty」デバイスを一致させ、親デバイスに対応する属性があることを確認します。

    ACTION!="remove", SUBSYSTEM=="tty", \
      ENVS{devboard_link}=="?*",
      IMPORT{parent}="devboard_link",
      TAG+="uaccess", SYMLINK+="$env{devboard_link}"
    

(テストされていない例です。)

関連情報