web-dev-qa-db-ja.com

udev:sysデバイスが属する物理デバイスをどのように識別しますか?

私はいくつかのエンドポイントを持っているいくつかのUSBモデムを持っています:多くのTTY、ネットワークインターフェイス、cdc-wdmポート、および他のいくつかのもの。たとえば、ttyUSB3、ttyUSB4、wwan1、およびcdc-wdm1がすべて同じ物理USBデバイスに属していることがわかるように、それらをグループ化しようとしています。

$idは物理デバイスを識別することになっていると思ったので、$idENV{id}=$idで環境に追加してみました。これはネットワークインターフェイスとシリアルポートでは機能するようですが、cdc-wdmポートでは機能しません(これらのポートではIDが設定されていません)。

以下は、ENV{id}=$idルールを追加した後のデータの例です。

ルール:SUBSYSTEM=="net", ATTRS{idVendor}=="106c", ATTRS{idProduct}=="3718", ENV{id}="$id"

# udevadm info --query=all --path=/devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-
1.3:1.5/net/wwan0
P: /devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-1.3:1.5/net/wwan0
E: DEVPATH=/devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-1.3:1.5/net/wwan0
E: DEVTYPE=wwan
E: ID_BUS=usb
E: ID_MODEL=PANTECH_UML290
E: ID_MODEL_ENC=PANTECH\x20UML290
E: ID_MODEL_ID=3718
E: ID_REVISION=0000
E: ID_SERIAL=Pantech__Incorporated_PANTECH_UML290
E: ID_TYPE=generic
E: ID_USB_DRIVER=qmi_wwan
E: ID_USB_INTERFACES=:020201:0a0000:ffffff:fffdff:fffeff:fff1ff:
E: ID_USB_INTERFACE_NUM=05
E: ID_VENDOR=Pantech__Incorporated
E: ID_VENDOR_ENC=Pantech\x2c\x20Incorporated
E: ID_VENDOR_ID=106c
E: IFINDEX=5
E: INTERFACE=wwan0
E: SUBSYSTEM=net
E: USEC_INITIALIZED=174833330
E: id=1-1.3

ルール:SUBSYSTEM=="usb", KERNEL=="*cdc-wdm*", ENV{id}="$id"

# udevadm info --query=all --path=/devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-
1.3:1.5/usb/cdc-wdm0
P: /devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-1.3:1.5/usb/cdc-wdm0
N: cdc-wdm0
E: DEVNAME=/dev/cdc-wdm0
E: DEVPATH=/devices/platform/atmel-ehci/usb1/1-1/1-1.3/1-1.3:1.5/usb/cdc-wdm0
E: MAJOR=180
E: MINOR=176
E: SUBSYSTEM=usb
E: USEC_INITIALIZED=174788259
7
Shawn J. Goff

さて、最初に documentation for $idの意味を理解しました

サブシステム、カーネル、ドライバー、およびATTRSのdevpathを上方に検索しているときに一致したデバイスの名前。

...そしてそれは私が思っていたものではありません(これは、いくつかの実験と組み合わされたドキュメントを理解できないことによって形成されました)。

「デバイスの名前」とは、KERNELキーが一致するのと同じことを指します。ドキュメントはKERNELキーについて次のように述べています:

イベントデバイスの名前と一致します。

「名前」と「KERNEL」が関連していることがわかります。

「サブシステム、カーネル、ドライバー、およびATTRSのdevpathを上向きに検索している間に一致」の部分は、ルールで「サブシステム、カーネル、ドライバー、またはATTRS」の一致を指定した場合、デバイスツリーが上に向かって検索されることを意味します。一致;一致したデバイスの名前が使用されます。

つまり、最初のルールでは、それはATTRSキーと一致し、そのデバイスはたまたま物理的なUSBデバイスでした。

次に、他のルールとして、ツリーを見て、物理デバイスに一致するが、その下にはないものを見つける必要がありました。これが私のデバイスツリーです:

# udevadm info --attribute-walk --name=/dev/cdc-wdm0

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/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2/1-1.7.2:1.5/usb/cdc-wdm0':
    KERNEL=="cdc-wdm0"
    SUBSYSTEM=="usb"
    DRIVER==""

  looking at parent device '/devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2/1-1.7.2:1.5':
    KERNELS=="1-1.7.2:1.5"
    SUBSYSTEMS=="usb"
    DRIVERS=="qmi_wwan"
    ATTRS{bInterfaceNumber}=="05"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="f1"
    ATTRS{bInterfaceProtocol}=="ff"
    ATTRS{supports_autosuspend}=="1"

  looking at parent device '/devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2':
    KERNELS=="1-1.7.2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}=="Pantech, Incorporated"
    ATTRS{bNumInterfaces}==" 6"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="c0"
    ATTRS{bMaxPower}=="500mA"
    ATTRS{urbnum}=="496"
    ATTRS{idVendor}=="106c"
    ATTRS{idProduct}=="3718"
    ATTRS{bcdDevice}=="0000"
    ATTRS{bDeviceClass}=="02"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="12"
    ATTRS{devpath}=="1.7.2"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Pantech, Incorporated"
    ATTRS{product}=="PANTECH UML290"

  looking at parent device '/devices/platform/atmel-ehci/usb1/1-1/1-1.7':
    KERNELS=="1-1.7"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="188"
    ATTRS{idVendor}=="1a40"
    ATTRS{idProduct}=="0101"
    ATTRS{bcdDevice}=="0111"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="3"
    ATTRS{devpath}=="1.7"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="4"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{product}=="USB 2.0 Hub"

  looking at parent device '/devices/platform/atmel-ehci/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{urbnum}=="53"
    ATTRS{idVendor}=="1a40"
    ATTRS{idProduct}=="0201"
    ATTRS{bcdDevice}=="0100"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="02"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="1"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="7"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{product}=="USB 2.0 Hub [MTT]"

  looking at parent device '/devices/platform/atmel-ehci/usb1':
    KERNELS=="usb1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{urbnum}=="26"
    ATTRS{idVendor}=="1d6b"
    ATTRS{idProduct}=="0002"
    ATTRS{bcdDevice}=="0206"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{speed}=="480"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{maxchild}=="3"
    ATTRS{quirks}=="0x0"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{authorized}=="1"
    ATTRS{manufacturer}=="Linux 2.6.39.4-acnbfx100 ehci_hcd"
    ATTRS{product}=="Atmel EHCI UHP HS"
    ATTRS{serial}=="atmel-ehci"
    ATTRS{authorized_default}=="1"

  looking at parent device '/devices/platform/atmel-ehci':
    KERNELS=="atmel-ehci"
    SUBSYSTEMS=="platform"
    DRIVERS=="atmel-ehci"
    ATTRS{companion}==""

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

照合するデバイスは/devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2'です。そのデバイスのDRIVERSは「usb」であり、その下には何も一致しないことがわかります。次のルールは私の問題を解決し、デバイスのエンドポイントがusbドライバーによって処理されないことを確信しているため、一般的な解決策になるはずです。

DRIVERS=="usb", KERNEL=="*cdc-wdm*", ENV{id}="$id", RUN="/usr/local/bin/modem_setup.sh"

そして、これは私がずっと探していた結果です:

# udevadm info --query=all --name=/dev/cdc-wdm0
P: /devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2/1-1.7.2:1.5/usb/cdc-wdm0
N: cdc-wdm0
E: DEVNAME=/dev/cdc-wdm0
E: DEVPATH=/devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2/1-1.7.2:1.5/usb/cdc-wdm0
E: MAJOR=180
E: MINOR=176
E: SUBSYSTEM=usb
E: USEC_INITIALIZED=12243969
E: id=1-1.7.2
5
Shawn J. Goff