Atrybuty z różnych urządzeń nadrzędnych w regule udev

11

Mam problem ze zrozumieniem, w jaki sposób atrybuty urządzenia udev z różnych urządzeń nadrzędnych są oceniane według reguły. Chcę napisać regułę dla określonego szeregowego urządzenia USB (modem HUAWEI), z atrybutem walk w następujący sposób:

$ 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"

Aby zidentyfikować to urządzenie, próbowałem użyć następującej reguły udev:

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

ale niestety nie mogę jednocześnie używać atrybutu ATTRS{bInterfaceNumber}=="00"z urządzenia interfejsu i atrybutów ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506"z urządzenia fizycznego. Używanie któregokolwiek z nich działa dobrze, ale podczas używania ich razem reguła już nie działa.

Czy brakuje mi czegoś związanego z użyciem atrybutów z różnych urządzeń nadrzędnych w jednej regule? Czy jest jakiś inny powód, dla którego używanie atrybutów pochodzących od różnych rodziców może stanowić problem?

Nawiasem mówiąc, dystrybucją jest Arch Linux ARM.

kassiopeia
źródło
Dzięki, to wszystko wyjaśnia. Czy istnieje jednak obejście, jeśli chcę zidentyfikować konkretny interfejs na podstawie określonego urządzenia USB?
kassiopeia
2
Co jeśli zmienisz ATTRS{bInterfaceNumber}=="00"na ENV{ID_USB_INTERFACE_NUM}=="00"? To powinno działać. Jeśli nie, spróbuj zmienić je wszystkie na env:ENV{ID_USB_INTERFACE_NUM}=="00", ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}== ...
don_crissti

Odpowiedzi:

6

Aby użyć atrybutów wielu rodziców, musisz użyć wielu reguł i GOTO. Coś takiego.

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
źródło
1

Możesz użyć dwóch zasad opisanych tutaj (ewentualnie w połączeniu z inną zgrabną sztuczką znalezioną w tym poście na blogu, aby była bardziej ogólna / łatwa do wydania):

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"

Jednak pierwsza zasada musi jednoznacznie dopasować węzeł zawierający prawo idVendori idProductjeszcze nie ma gwarancji, że ustawia USB_IDSsię do prawidłowych wartości, a druga reguła jest w stanie sprostać. Nie znam jednak żadnego atrybutu, który byłby w stanie ogólnie dopasować węzły liści USB. : /

stefanct
źródło