udev规则中来自各种父设备的属性


11

我很难理解如何在规则中评估来自不同父设备的udev设备属性。我想为特定的串行USB设备(HUAWEI调制解调器)编写一条规则,属性遍历如下:

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

为了识别此设备,我尝试使用以下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"

但是很遗憾,我不能同时使用ATTRS{bInterfaceNumber}=="00"接口设备的属性ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1506"和物理设备的属性。使用它们中的任何一个都可以正常工作,但是当一起使用它们时,该规则将不再起作用。

我是否在一条规则中缺少关于不同父设备的属性使用的任何信息?还有其他原因为什么使用来自不同父级的属性可能会有问题?

顺便说一下,发行版是Arch Linux ARM。



谢谢,这解释了一切。但是,如果我想从特定的USB设备识别特定的接口,是否有解决方法?
卡西奥佩亚2015年

2
如果更改ATTRS{bInterfaceNumber}=="00"为该ENV{ID_USB_INTERFACE_NUM}=="00"怎么办?那应该工作。如果不尝试将它们全部更改为env:ENV{ID_USB_INTERFACE_NUM}=="00", ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}== ...
don_crissti

Answers:


6

要使用来自多个父项的属性,您需要使用多个规则和GOTO。这样的东西。

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"

1

您可以使用此处描述的两个规则(可能与本博文中发现的另一个巧妙技巧结合在一起,使其更通用/更容易消耗):

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"

但是,第一条规则必须唯一地匹配包含该权限的节点idVendoridProduct否则无法保证它设置USB_IDS为正确的值,第二条规则能够匹配。我不知道任何能够与USB叶子节点进行一般匹配的属性。:/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.