udev:sudoなしでUSBプログラマーを使用する

udev:sudoなしでUSBプログラマーを使用する

プログラマを使用してmspdebugデバイスに接続しています。

mspdebug私が使用しているときだけデバイスに接続されますsudo mspdebug。デバイスを使用しないと見つかりませんsudomspdebug

不要なデバイスにどのように接続しますかsudo

特別に接続するデバイスは次のとおりです。

$ lsusb
Bus 001 Device 018: ID 2047:0013 Texas Instruments MSP Tools Driver

私は次のudev規則を持っています/etc/udev/rules.d/46-TI_launchpad.rules

ATTR{idVendor}=="0451", ATTR{idProduct}=="f432", MODE="0660", GROUP="plugdev"
ATTR{idVendor}=="2047", ATTR{idProduct}=="0013", MODE="0660", GROUP="plugdev"

私はplugdev次のグループに属しています。

$ id $USER
uid=1000(earthishome) gid=1000(earthishome) groups=1000(earthishome),10(wheel),977(pkg-build),1001(plugdev),974(vboxusers),1003(docker)

編集1

追跡装置

デバイスが接続されると、2つのttyが作成されますttyACM0ttyACM1

$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[21580.524390] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2 (usb)
KERNEL[21580.527712] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0 (usb)
KERNEL[21580.528138] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/tty/ttyACM0 (tty)
KERNEL[21580.528301] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0 (usb)
KERNEL[21580.528453] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.1 (usb)
KERNEL[21580.528623] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.1 (usb)
KERNEL[21580.528892] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.2 (usb)
KERNEL[21580.529451] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.2/tty/ttyACM1 (tty)
KERNEL[21580.529600] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.2 (usb)
KERNEL[21580.529746] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.3 (usb)
KERNEL[21580.529892] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.3 (usb)
KERNEL[21580.530075] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2 (usb)
UDEV  [21580.563378] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2 (usb)
UDEV  [21580.570495] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0 (usb)
UDEV  [21580.572104] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.1 (usb)
UDEV  [21580.573582] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.3 (usb)
UDEV  [21580.573663] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.2 (usb)
UDEV  [21580.577042] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.1 (usb)
UDEV  [21580.578987] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.3 (usb)
UDEV  [21580.579357] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/tty/ttyACM0 (tty)
UDEV  [21580.580712] add      /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.2/tty/ttyACM1 (tty)
UDEV  [21580.585516] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0 (usb)
UDEV  [21580.585592] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.2 (usb)
UDEV  [21580.596329] bind     /devices/pci0000:00/0000:00:14.0/usb1/1-2 (usb)

トレースの使用

を開こうとすると、「許可拒否」エラーが発生します/dev/ttyACM0が、実行時にはそうではありませんstrace sudo mspdebug tilib

$ strace mspdebug tilib
openat(AT_FDCWD, "/dev/ttyACM0", O_RDWR|O_NOCTTY|O_NONBLOCK) = -1 EACCES (Permission denied)
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=5000000}, NULL) = 0
openat(AT_FDCWD, "/dev/ttyACM0", O_RDWR|O_NOCTTY|O_NONBLOCK) = -1 EACCES (Permission denied)
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=5000000}, NULL) = 0
openat(AT_FDCWD, "/dev/ttyACM0", O_RDWR|O_NOCTTY|O_NONBLOCK) = -1 EACCES (Permission denied)
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=5000000}, NULL) = 0
openat(AT_FDCWD, "/dev/ttyACM0", O_RDWR|O_NOCTTY|O_NONBLOCK) = -1 EACCES (Permission denied)
clock_nanosleep(CLOCK_REALTIME, 0, {tv_sec=0, tv_nsec=5000000}, NULL) = 0

udevadmを使用してデバイスと親デバイスを検索する

$ udevadm info --attribute-walk /dev/ttyACM0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/tty/ttyACM0':
    KERNEL=="ttyACM0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0':
    KERNELS=="1-2:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="cdc_acm"
    ATTRS{iad_bFunctionSubClass}=="02"
    ATTRS{bmCapabilities}=="2"
    ATTRS{interface}=="MSP Debug Interface"
    ATTRS{bInterfaceClass}=="02"
    ATTRS{authorized}=="1"
    ATTRS{bInterfaceNumber}=="00"
    ATTRS{iad_bFunctionClass}=="02"
    ATTRS{iad_bFunctionProtocol}=="01"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{iad_bFirstInterface}=="00"
    ATTRS{bInterfaceSubClass}=="02"
    ATTRS{bNumEndpoints}=="01"
    ATTRS{bInterfaceProtocol}=="01"
    ATTRS{iad_bInterfaceCount}=="02"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-2':
    KERNELS=="1-2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{busnum}=="1"
    ATTRS{authorized}=="1"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{devnum}=="14"
    ATTRS{bmAttributes}=="80"
    ATTRS{rx_lanes}=="1"
    ATTRS{serial}=="B1443A5106001800"
    ATTRS{bcdDevice}=="0200"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{product}=="MSP Tools Driver"
    ATTRS{idVendor}=="2047"
    ATTRS{bDeviceSubClass}=="02"
    ATTRS{speed}=="12"
    ATTRS{removable}=="removable"
    ATTRS{urbnum}=="140"
    ATTRS{devpath}=="2"
    ATTRS{bDeviceClass}=="ef"
    ATTRS{bNumInterfaces}==" 4"
    ATTRS{tx_lanes}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{idProduct}=="0013"
    ATTRS{configuration}=="MSP430 USB"
    ATTRS{maxchild}=="0"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{quirks}=="0x0"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{manufacturer}=="Texas Instruments"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{bConfigurationValue}=="1"

  looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized_default}=="1"
    ATTRS{idVendor}=="1d6b"
    ATTRS{speed}=="480"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{serial}=="0000:00:14.0"
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{ltm_capable}=="no"
    ATTRS{version}==" 2.00"
    ATTRS{rx_lanes}=="1"
    ATTRS{busnum}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{urbnum}=="268"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bcdDevice}=="0506"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{configuration}==""
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{quirks}=="0x0"
    ATTRS{manufacturer}=="Linux 5.6.19-300.fc32.x86_64 xhci-hcd"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{idProduct}=="0002"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{authorized}=="1"
    ATTRS{maxchild}=="12"
    ATTRS{removable}=="unknown"
    ATTRS{tx_lanes}=="1"
    ATTRS{product}=="xHCI Host Controller"

  looking at parent device '/devices/pci0000:00/0000:00:14.0':
    KERNELS=="0000:00:14.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="xhci_hcd"
    ATTRS{device}=="0x9d2f"
    ATTRS{dbc}=="disabled"
    ATTRS{irq}=="126"
    ATTRS{consistent_dma_mask_bits}=="64"
    ATTRS{driver_override}=="(null)"
    ATTRS{subsystem_device}=="0x082a"
    ATTRS{dma_mask_bits}=="64"
    ATTRS{class}=="0x0c0330"
    ATTRS{subsystem_vendor}=="0x1028"
    ATTRS{vendor}=="0x8086"
    ATTRS{enable}=="1"
    ATTRS{local_cpulist}=="0-7"
    ATTRS{ari_enabled}=="0"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{revision}=="0x21"
    ATTRS{broken_parity_status}=="0"
    ATTRS{local_cpus}=="ff"
    ATTRS{msi_bus}=="1"
    ATTRS{numa_node}=="-1"

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

編集2

コメントのトラブルシューティングのヒントのおかげで、この問題を解決できました。

全長DR

2つのことを変更する必要があります。

  1. 46-TI_launchpad.rulesから次へファイルを移動する94-TI_launchpad.rules

  2. ルールを次のように変更してくださいATTRATTRS

    ATTRS{idVendor}=="2047", ATTRS{idProduct}=="0013", MODE="0660", GROUP="plugdev"

詳細

Artem S. Tashkinovとmihhが指摘したように、この規則はその後の規則によって無視されます。 90年代にファイルの名前を変更すると、ファイルは最後まで実行され、以前のルールによって上書きされません。

dirktが提案したように、udevadm info -aデバイスチェーン全体を印刷します。デバイスチェーンの観点からは、実際のデバイス自体には属性とidVendor定義idProductがなく、これらのプロパティは親デバイスで定義されます。これらの属性を一致させるには、親デバイスの属性と一致するようにATTR変更する必要があります。ATTRS

答え1

質問コメントのトラブルシューティングのヒントのおかげで、この問題を解決できました。

全長DR

2つのことを変更する必要があります。

  1. 46-TI_launchpad.rulesから次へファイルを移動する94-TI_launchpad.rules
  2. ルールを次のように変更してくださいATTRATTRS
ATTRS{idVendor}=="2047", ATTRS{idProduct}=="0013", MODE="0660", GROUP="plugdev"

詳細

Artem S. Tashkinovとmihhが指摘したように、46の規則はその後の規則で上書きされています。 90年代にファイルの名前を変更すると、ファイルは最後まで実行され、以前のルールによって上書きされません。

dirktが提案したように、udevadm info -aデバイスチェーン全体を印刷します。デバイスチェーンの観点からは、実際のデバイス自体には属性とidVendor定義idProductがなく、これらのプロパティは親デバイスで定義されます。親デバイスの属性を一致させるにはATTRに変更する必要がありますATTRS

関連情報