Attributs de divers périphériques parents dans une règle udev

11

J'ai du mal à comprendre comment les attributs de périphérique udev de différents périphériques parents sont évalués dans une règle. Je veux écrire une règle pour un périphérique USB série spécifique (modem HUAWEI), avec une promenade d'attribut comme suit:

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

Afin d'identifier cet appareil, j'ai essayé d'utiliser la règle udev suivante:

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

mais malheureusement, je ne peux pas utiliser l'attribut ATTRS{bInterfaceNumber}=="00"du périphérique d'interface et les attributs ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506"du périphérique physique ensemble. L'utilisation de l'un d'eux fonctionne bien, mais lorsque vous les utilisez ensemble, la règle ne fonctionne plus.

Suis-je en train de manquer quoi que ce soit concernant l'utilisation des attributs de différents périphériques parents ensemble dans une seule règle? Y a-t-il une autre raison pour laquelle l'utilisation des attributs de différents parents pourrait être un problème?

À propos, la distribution est Arch Linux ARM.

kassiopeia
la source
5
Vous ne pouvez combiner
don_crissti
Merci, ça explique tout. Existe-t-il une solution de contournement si je veux identifier une interface spécifique à partir d'un périphérique USB spécifique?
kassiopeia
2
Et si vous changez ATTRS{bInterfaceNumber}=="00"pour ENV{ID_USB_INTERFACE_NUM}=="00"? Cela devrait fonctionner. Sinon, essayez de les changer tous en env:ENV{ID_USB_INTERFACE_NUM}=="00", ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}== ...
don_crissti

Réponses:

6

Pour utiliser les attributs de plusieurs parents, vous devez utiliser plusieurs règles et GOTO. Quelque chose comme ça.

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
la source
1

Vous pouvez utiliser deux règles décrites ici (éventuellement combinées avec une autre astuce intéressante trouvée dans ce billet de blog pour la rendre plus générique / facilement utilisable):

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"

Cependant, la première règle doit correspondre de façon unique au nœud contenant le droit idVendoret idProductsinon il n'y a aucune garantie qu'elle définit USB_IDSles valeurs correctes et la deuxième règle peut correspondre. Je ne suis au courant d'aucun attribut qui pourrait correspondre de manière générique aux nœuds terminaux USB. : /

stefanct
la source