udev规则(和Medion RC-0617)中的无条件GOTO

时间:2018-07-22 15:00:36

标签: debian hid udev

我一直在对Debian 8.8衍生版本(antix16)下的Medion RC-0617遥控器(带有USB软件狗)进行反向工程。

它注册了3个不同的HID设备(/ dev / hidraw *),我希望将它们与/ dev / mdremote0、1和2进行符号链接,而与关联的hidraw设备的数量(hidraw1、2和3)无关。多数情况下为3次,但根据插入的输入设备而有所不同),以便使用脚本查询它们以执行对远程控制按钮的自定义操作。 (同时将其文件模式设置为666,以便以普通用户身份访问它们)

udevadm info -a / dev / hidraw1的输出看起来像这样(缩短):

// The actual hidraw device (top level)
  looking at device '/devices/pci0000:00/0000:00:1c.4/0000:05:00.0/usb3/3-1/3-1:1.0/0003:04F2:0618.002B/hidraw/hidraw1':
    KERNEL=="hidraw1"
    SUBSYSTEM=="hidraw"
    DRIVER==""
//...

// The last point at which the 3 individual hidraw devices differed from each other
  looking at parent device '/devices/pci0000:00/0000:00:1c.4/0000:05:00.0/usb3/3-1/3-1:1.0':
    KERNELS=="3-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="usbhid"
    //...
    ATTRS{bInterfaceProtocol}=="01"
    // This entry distinguished the 3 individual hidraw devices from each other
    //...

// The dongle itself, parent device of all 3 hidraw devices
  looking at parent device '/devices/pci0000:00/0000:00:1c.4/0000:05:00.0/usb3/3-1':
    KERNELS=="3-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{idVendor}=="04f2"
    ATTRS{idProduct}=="0618"
    ATTRS{product}=="USB Wireless HID Receiver"
    // The dongle can be uniquely identified by idVendor and idProduct
    //...
//...

因此,我需要编写的udev规则需要:

  • 通过idVendor和idProduct标识一个父设备
  • 在另一个父设备中检查bInterfaceProtocol属性
  • 为设备分配正确的符号链接/ dev / mdremote *并设置正确的权限

我的第一次尝试是这样的:

SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="04f2", ATTRS{idProduct}=="0618", ATTRS{bInterfaceProtocol}=="01", SYMLINK="mdremote0", MODE="0666"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="04f2", ATTRS{idProduct}=="0618", ATTRS{bInterfaceProtocol}=="00", SYMLINK="mdremote1", MODE="0666"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="04f2", ATTRS{idProduct}=="0618", ATTRS{bInterfaceProtocol}=="02", SYMLINK="mdremote2", MODE="0666"

(预期bInterfaceProtocol属性的顺序)

简而言之,这行不通,udev联机帮助页说:

  

某些键还与父设备的属性匹配   在sysfs中,不仅是生成事件的设备。如果   在单个中指定与父设备匹配的多个密钥   规则,所有这些密钥必须在同一父设备上匹配。

因此,我开始了另一种方法:首先与加密狗匹配,然后如果此检查不匹配,则跳过各个规则,如下所示:

SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="04f2", ATTRS{idProduct}=="0618", GOTO="match"
GOTO="end"
LABEL="match"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{bInterfaceProtocol}=="01", SYMLINK="mdremote0", MODE="0666"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{bInterfaceProtocol}=="00", SYMLINK="mdremote1", MODE="0666"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{bInterfaceProtocol}=="02", SYMLINK="mdremote2", MODE="0666"
LABEL="end"

这在第一学期看起来很正确。但是,猜想是什么,它也不起作用,mdremote *符号链接仅指向设置了bInterfaceProtocol密钥的任何设备。

2 个答案:

答案 0 :(得分:2)

实际上,第二行(GOTO =“ end”)被忽略了。我花了一些时间弄清楚这一点,但是解决方案实际上很简单:

如果没有要匹配的条件,udev会将规则视为“始终不匹配”,因此根本不执行GOTO。

我正在使用的udev规则文件如下所示:

# Test if the wanted dongle is a parent device
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="04f2", ATTRS{idProduct}=="0618", GOTO="match"
# If not, skip the next 3 rules. The test against SUBSYSTEM=="hidraw" is there to produce a rule match
SUBSYSTEM=="hidraw", GOTO="end"
LABEL="match"
# Those 3 rules actually assign the right symlink depending on the bInterfaceProtocol property.
# Note that ALL of those rules contain the SUBSYSTEM=="hidraw" check, because the GOTO in the second line
# does not get executed for non-hidraw devices and the rules get evaluated for any non-hidraw device.
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{bInterfaceProtocol}=="01", SYMLINK="mdremote0", MODE="0666"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{bInterfaceProtocol}=="00", SYMLINK="mdremote1", MODE="0666"
SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{bInterfaceProtocol}=="02", SYMLINK="mdremote2", MODE="0666"
LABEL="end"

事实证明工作正常。仍然可以通过为GOTO =“ end”语句提供更好的匹配规则来进行改进,但我还是这样。

答案 1 :(得分:0)

@orwell我偶然发现了这个,对为什么对您不起作用有些困惑。我尝试做一些类似的事情,并且在无条件的GOTO和debian扩展以及Arch Linux上都没有问题。检查一下:

pJS <- phantom()