regras udev para PS / 2 e porta de jogo não correspondem em attr, apenas env

1

Quando eu construo regras para um dispositivo conectado PS / 2 ou de porta de jogo, o udev nunca corresponderá aos atributos, mas aos valores do ambiente. A razão pela qual isso é um problema pode ser visto na saída abaixo. Os valores de ambiente fornecidos são bastante inespecíficos, não está claro quais dispositivos estão sendo referenciados nas regras, enquanto os valores dos atributos podem ser muito claros com o nome real do dispositivo. Especialmente no caso do meu Gravis GamePad, que tem valores ENV muito esotéricos, mas um nome ATTR de "Gravis GamePad Pro".

Isso funciona:

ENV{XKBMODEL}=="pc105", RUN+="keymap $name microsoft-internet-keyboard"

Isso não funciona:

ATTR{name}=="AT Translated Set 2 keyboard", RUN+="keymap $name microsoft-internet-keyboard"

Eu obtenho os valores do ambiente executando o seguinte:

udevadm info -q all -n /dev/input/event0
P: /devices/pci0000:00/0000:00:1e.0/0000:02:04.0/gameport0/input/input5/js0
N: input/js0
S: input/by-path/pci-0000:02:04.0-joystick
E: DEVLINKS=/dev/input/by-path/pci-0000:02:04.0-joystick
E: DEVNAME=/dev/input/js0
E: DEVPATH=/devices/pci0000:00/0000:00:1e.0/0000:02:04.0/gameport0/input/input5/js0
E: ID_INPUT=1
E: ID_INPUT_JOYSTICK=1
E: ID_PATH=pci-0000:02:04.0
E: ID_PATH_TAG=pci-0000_02_04_0
E: ID_SERIAL=noserial
E: MAJOR=13
E: MINOR=0
E: SUBSYSTEM=input
E: UDEV_LOG=3
E: USEC_INITIALIZED=3244030793

E os valores de atributo da execução:

udevadm info -n /dev/input/event0 --attribute-walk

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/platform/i8042/serio0/input/input0/event0':
    KERNEL=="event0"
    SUBSYSTEM=="input"
    DRIVER==""

  looking at parent device '/devices/platform/i8042/serio0/input/input0':
    KERNELS=="input0"
    SUBSYSTEMS=="input"
    DRIVERS==""
    ATTRS{name}=="AT Translated Set 2 keyboard"
    ATTRS{phys}=="isa0060/serio0/input0"
    ATTRS{uniq}==""
    ATTRS{properties}=="0"

  looking at parent device '/devices/platform/i8042/serio0':
    KERNELS=="serio0"
    SUBSYSTEMS=="serio"
    DRIVERS=="atkbd"
    ATTRS{description}=="i8042 KBD port"
    ATTRS{bind_mode}=="auto"
    ATTRS{extra}=="0"
    ATTRS{force_release}=="369-370"
    ATTRS{scroll}=="0"
    ATTRS{set}=="2"
    ATTRS{softrepeat}=="0"
    ATTRS{softraw}=="1"
    ATTRS{err_count}=="0"

  looking at parent device '/devices/platform/i8042':
    KERNELS=="i8042"
    SUBSYSTEMS=="platform"
    DRIVERS=="i8042"

  looking at parent device '/devices/platform':
    KERNELS=="platform"
    SUBSYSTEMS==""
    DRIVERS==""

Ao criar minhas regras, estou seguindo principalmente o conselho do site , que pode muito bem estar desatualizado. Em particular, estou prestando atenção na parte que diz:

... it is legal to combine the attributes from the device in question and a single parent device, you cannot mix-and-match attributes from multiple parent devices - your rule will not work.

    
por Steve 07.08.2014 / 03:36

1 resposta

1

De acordo com a página de manual do udev ( man 7 udev ), há duas formas distintas de correspondência de atributos:

   ATTR{filename}
       Match sysfs attribute values of the event device. Trailing
       whitespace in the attribute values is ignored unless the specified
       match value itself contains trailing whitespace.

e

   ATTRS{filename}
       Search the devpath upwards for a device with matching sysfs
       attribute values. If multiple ATTRS matches are specified, all of
       them must match on the same device. Trailing whitespace in the
       attribute values is ignored unless the specified match value itself
       contains trailing whitespace.

Como name é um atributo do nó pai, você precisa usar o segundo formulário, ou seja,

ATTRS{name}=="AT Translated Set 2 keyboard"

em vez de

ATTR{name}=="AT Translated Set 2 keyboard" 
    
por 07.08.2014 / 04:13

Tags