udev: sys 장치가 속한 물리적 장치를 어떻게 식별합니까?

udev: sys 장치가 속한 물리적 장치를 어떻게 식별합니까?

나는 여러 개의 USB 모뎀을 가지고 있는데, 각각은 다수의 TTY, 네트워크 인터페이스, cdc-wdm 포트, 그리고 몇 가지 다른 엔드포인트를 가지고 있습니다. 예를 들어 ttyUSB3, ttyUSB4, wwan1 및 cdc-wdm1이 모두 동일한 물리적 USB 장치에 속한다는 것을 알 수 있도록 이들을 그룹화하려고 합니다.

$id물리적 장치를 식별해야 한다고 생각 $id하여 ENV{id}=$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

답변1

좋아요, 우선, 이제 제가 무엇을 이해하게 되었나요?문서$id수단을 위해

SUBSYSTEMS, KERNELS, DRIVERS 및 ATTRS에 대한 devpath를 검색할 때 일치하는 장치 이름입니다.

...내가 생각했던 것과는 다릅니다(일부 실험과 결합된 문서를 이해하지 못한 데서 비롯됨).

KERNEL"장치 이름"은 키 일치와 동일한 것을 의미합니다 . 문서의 키에 대한 설명은 KERNEL다음과 같습니다.

이벤트 장치의 이름과 일치합니다.

이것이 "이름"과 "커널"이 관련되어 있다는 것을 아는 방법입니다.

"SUBSYSTEMS, KERNELS, DRIVERS 및 ATTRS에 대한 devpath를 검색할 때 일치" 부분은 규칙에서 "SUBSYSTEMS, KERNELS, DRIVERS 또는 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'. 장치의 드라이버가 "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

관련 정보