udev: Làm thế nào để bạn xác định thiết bị vật lý mà thiết bị sys thuộc về?


8

Tôi có một số modem USB mà mỗi modem có một số điểm cuối: rất nhiều TTY, giao diện mạng, cổng cdc-wdm và một số thứ khác. Tôi đang cố gắng nhóm chúng lại với nhau để tôi biết, ví dụ, ttyUSB3, ttyUSB4, wwan1 và cdc-wdm1 đều thuộc cùng một thiết bị USB vật lý.

Tôi nghĩ $idlà nên xác định thiết bị vật lý, vì vậy tôi đã thử thêm $idvào môi trường ENV{id}=$id. Điều này dường như hoạt động cho các giao diện mạng và cổng nối tiếp, nhưng không phải là cổng cdc-wdm (id không được đặt cho các cổng này).

Dưới đây là một số dữ liệu ví dụ sau khi thêm các ENV{id}=$idquy tắc:

quy tắc: 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

quy tắc: 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

Câu trả lời:


6

Được rồi, đầu tiên tôi bây giờ hiểu những gì các tài liệu hướng dẫn cho $idphương tiện

Tên của thiết bị trùng khớp trong khi tìm kiếm đường dẫn lên trên cho SUBSYSTEMS, Kernels, DRIVERS và ATTRS.

... Và đó không phải là điều tôi nghĩ (được hình thành do không hiểu tài liệu kết hợp với một số thử nghiệm).

Với "Tên của thiết bị", nó nói về cùng một thứ mà KERNELkhóa khớp với. Các tài liệu nói về KERNELchìa khóa là:

Khớp tên của thiết bị sự kiện.

Đó là cách bạn biết "tên" và "KernEL" có liên quan.

Phần "khớp trong khi tìm kiếm đường dẫn lên trên cho SUBSYSTEMS, Kernels, DRIVERS và ATTRS" có nghĩa là nếu bạn đã chỉ định một trận đấu "SUBSYSTEMS, Kernels, DRIVERS hoặc ATTRS" trong quy tắc, nó sẽ đi lên cây thiết bị cho đến khi tìm thấy trận đấu; tên của thiết bị phù hợp sẽ được sử dụng.

Vì vậy, theo quy tắc đầu tiên của tôi, nó phù hợp với khóa ATTRS và thiết bị đó tình cờ là thiết bị USB vật lý.

Bây giờ đối với quy tắc khác của tôi, tôi phải nhìn vào cái cây và tìm thứ gì đó phù hợp với thiết bị vật lý nhưng không có gì bên dưới nó. Đây là cây thiết bị của tôi:

# 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==""

Thiết bị tôi muốn kết hợp là /devices/platform/atmel-ehci/usb1/1-1/1-1.7/1-1.7.2'. Bạn có thể thấy rằng DRIVERS cho thiết bị đó là 'usb' và không có gì bên dưới nó sẽ phù hợp với điều đó. Quy tắc sau đây giải quyết vấn đề của tôi, thậm chí nên là một giải pháp chung vì tôi khá chắc chắn rằng không có điểm cuối nào của thiết bị sẽ được xử lý bởi trình điều khiển usb.

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

Và kết quả là tôi đã tìm kiếm tất cả cùng:

# 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.