Attribute von verschiedenen übergeordneten Geräten in einer udev-Regel

10

Ich habe einige Probleme zu verstehen, wie die udev-Geräteattribute von verschiedenen übergeordneten Geräten in einer Regel ausgewertet werden. Ich möchte eine Regel für ein bestimmtes serielles USB-Gerät (HUAWEI-Modem) mit einem Attribut-Walk wie folgt schreiben:

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

Um dieses Gerät zu identifizieren, habe ich versucht, die folgende udev-Regel zu verwenden:

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

Leider kann ich das Attribut ATTRS{bInterfaceNumber}=="00"vom Schnittstellengerät und die Attribute ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506"vom physischen Gerät nicht zusammen verwenden. Die Verwendung von beiden funktioniert einwandfrei, aber wenn Sie sie zusammen verwenden, funktioniert die Regel nicht mehr.

Fehlt mir etwas in Bezug auf die Verwendung von Attributen von verschiedenen übergeordneten Geräten in einer Regel? Gibt es einen anderen Grund, warum die Verwendung der Attribute von verschiedenen Eltern ein Problem sein könnte?

Die Distribution ist übrigens Arch Linux ARM.

Kassiopeia
quelle
Danke, das erklärt alles. Gibt es eine Problemumgehung, wenn ich eine bestimmte Schnittstelle von einem bestimmten USB-Gerät aus identifizieren möchte?
Kassiopeia
2
Was passiert , wenn Sie ändern ATTRS{bInterfaceNumber}=="00"zu ENV{ID_USB_INTERFACE_NUM}=="00"? Das sollte funktionieren. Wenn nicht, versuchen Sie, alle in env zu ENV{ID_USB_INTERFACE_NUM}=="00", ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}== ...
ändern

Antworten:

6

Um Attribute von mehreren Eltern zu verwenden, müssen Sie mehrere Regeln und GOTO verwenden. Etwas wie das.

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
quelle
1

Sie können zwei Regeln verwenden, wie hier beschrieben (möglicherweise kombiniert mit einem anderen netten Trick in diesem Blog-Beitrag , um ihn allgemeiner / leicht entbehrlich zu machen):

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"

Allerdings hat die erste Regel eindeutig den Knoten enthält die richtige enthält , idVendorund idProductsonst gibt es keine Garantie , dass es setzt USB_IDSauf die richtigen Werte und die zweite Regel in der Lage , entsprechen. Mir ist jedoch kein Attribut bekannt, mit dem USB-Blattknoten generisch übereinstimmen könnten. : /

stefanct
quelle