Atribut dari berbagai perangkat induk dalam aturan udev

11

Saya mengalami kesulitan memahami bagaimana atribut perangkat udev dari perangkat induk yang berbeda dievaluasi dalam suatu aturan. Saya ingin menulis aturan untuk perangkat usb serial tertentu (HUAWEI Modem), dengan atribut walk sebagai berikut:

$ udevadm info --attribute-walk --name=/dev/ttyUSB0

  looking at device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="generic"
    ATTRS{port_number}=="0"

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3/1-1.3:1.0':
    KERNELS=="1-1.3:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbserial_generic"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bInterfaceSubClass}=="02"
    ATTRS{bInterfaceProtocol}=="01"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{supports_autosuspend}=="1"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/platform/bcm2708_usb/usb1/1-1/1-1.3':
    KERNELS=="1-1.3"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{devpath}=="1.3"
    ATTRS{idVendor}=="12d1"
    ATTRS{speed}=="480"
    ATTRS{bNumInterfaces}==" 4"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{busnum}=="1"
    ATTRS{devnum}=="5"
    ATTRS{configuration}==""
    ATTRS{bMaxPower}=="500mA"
    ATTRS{authorized}=="1"
    ATTRS{bmAttributes}=="80"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{maxchild}=="0"
    ATTRS{bcdDevice}=="0001"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{quirks}=="0x0"
    ATTRS{version}==" 2.00"
    ATTRS{urbnum}=="4561"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="HUAWEI"
    ATTRS{removable}=="removable"
    ATTRS{idProduct}=="1506"
    ATTRS{bDeviceClass}=="00"
    ATTRS{product}=="HUAWEI MOBILE"

Untuk mengidentifikasi perangkat ini, saya mencoba menggunakan aturan udev berikut:

ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="00", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506", RUN+="/usr/bin/systemctl start modem_dialer"

tapi sayangnya saya tidak dapat menggunakan atribut ATTRS{bInterfaceNumber}=="00"dari perangkat antarmuka dan atribut ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506"dari perangkat fisik secara bersamaan. Menggunakan salah satu dari mereka berfungsi dengan baik, tetapi saat menggunakannya bersama-sama aturan tidak berfungsi lagi.

Apakah saya melewatkan sesuatu mengenai penggunaan atribut dari perangkat induk yang berbeda secara bersamaan dalam satu aturan? Adakah alasan lain mengapa menggunakan atribut dari orang tua yang berbeda mungkin menjadi masalah?

Omong-omong, distronya adalah Arch Linux ARM.

kassiopeia
sumber
Terima kasih, itu menjelaskan semuanya. Apakah ada solusi jika saya ingin mengidentifikasi antarmuka spesifik dari perangkat USB tertentu?
kassiopeia
2
Bagaimana jika Anda mengubah ATTRS{bInterfaceNumber}=="00"ke ENV{ID_USB_INTERFACE_NUM}=="00"? Itu seharusnya bekerja. Jika tidak coba ubah semuanya menjadi env:ENV{ID_USB_INTERFACE_NUM}=="00", ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}== ...
don_crissti

Jawaban:

6

Untuk menggunakan atribut dari banyak orang tua, Anda perlu menggunakan beberapa aturan dan GOTO. Sesuatu seperti ini.

SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}!="00", GOTO="huawei_end"
ACTION=="add", KERNEL=="ttyUSB[0-9]*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506", RUN+="/usr/bin/systemctl start modem_dialer"
LABEL="huawei_end"
Arnout
sumber
1

Anda dapat menggunakan dua aturan seperti yang dijelaskan di sini (mungkin dikombinasikan dengan trik lain yang ditemukan di posting blog ini agar lebih umum / mudah dikeluarkan):

ACTION=="add", SUBSYSTEM=="usb", ENV{USB_IDS}="%s{idVendor}:%s{idProduct}"
ACTION=="add", ENV{USB_IDS}=="12d1:1506", ATTRS{bInterfaceNumber}=="00", RUN+="/usr/bin/systemctl start modem_dialer"

Namun, aturan pertama harus secara unik mencocokkan node yang berisi hak idVendordan idProducttidak ada jaminan bahwa ia menetapkan USB_IDSke nilai yang benar dan aturan kedua dapat cocok. Saya tidak mengetahui adanya atribut yang secara umum dapat mencocokkan node daun USB. : /

stefanct
sumber