From: Peter Hutterer Date: Thu, 19 Mar 2015 04:19:58 +0000 (+1000) Subject: udev: builtin-keyboard: add support for EVDEV_ABS_* X-Git-Tag: v226.4~1^2~534 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=33928c053afd0e119828fb52a20979da415c425d udev: builtin-keyboard: add support for EVDEV_ABS_* Parse properties in the form EVDEV_ABS_00="::::" and apply them to the kernel device. Future processes that open that device will see the updated EV_ABS range. This is particularly useful for touchpads that don't provide a resolution in the kernel driver but can be fixed up through hwdb entries (e.g. bcm5974). All values in the property are optional, e.g. a string of "::45" is valid to set the resolution to 45. The order intentionally orders resolution before fuzz and flat despite it being the last element in the absinfo struct. The use-case for setting fuzz/flat is almost non-existent, resolution is probably the most common case we'll need. To avoid multiple hwdb invocations for the same device, replace the hwdb "keyboard:" prefix with "evdev:" and drop the separate 60-keyboard.rules file. The new 60-evdev.rules is called for all event nodes anyway, we don't need a separate rules file and second callout to the hwdb builtin. --- diff --git a/hwdb/60-evdev.hwdb b/hwdb/60-evdev.hwdb new file mode 100644 index 000000000..ad2d09e72 --- /dev/null +++ b/hwdb/60-evdev.hwdb @@ -0,0 +1,37 @@ +# This file is part of systemd. +# +# The lookup keys are composed in: +# 60-evdev.rules +# +# Note: The format of the "evdev:" prefix match key is a +# contract between the rules file and the hardware data, it might +# change in later revisions to support more or better matches, it +# is not necessarily expected to be a stable ABI. +# +# Match string formats: +# evdev: +# evdev:name::dmi: +# +# To add local entries, create a new file +# /etc/udev/hwdb.d/61-evdev-local.hwdb +# and add your rules there. To load the new rules execute (as root): +# udevadm hwdb --update +# udevadm trigger /dev/input/eventXX +# where /dev/input/eventXX is the device in question. If in +# doubt, simply use /dev/input/event* to reload all input rules. +# +# If your changes are generally applicable, open a bug report on +# http://bugs.freedesktop.org/enter_bug.cgi?product=systemd +# and include your new rules, a description of the device, and the +# output of +# udevadm info /dev/input/eventXX +# (or /dev/input/event*). +# +# Allowed properties are: +# EVDEV_ABS_=:::: +# +# where is the hexadecimal EV_ABS code as listed in linux/input.h +# and min, max, res, fuzz, flat are the decimal values to the respective +# fields of the struct input_absinfo as listed in linux/input.h. +# If a field is missing the field will be left as-is. Not all fields need to +# be present. e.g. ::45 sets the resolution to 45 units/mm. diff --git a/rules/60-evdev.rules b/rules/60-evdev.rules new file mode 100644 index 000000000..e81966fbe --- /dev/null +++ b/rules/60-evdev.rules @@ -0,0 +1,19 @@ +# do not edit this file, it will be overwritten on update + +ACTION=="remove", GOTO="evdev_end" +KERNEL!="event*", GOTO="evdev_end" + +# skip later rules when we find something for this input device +IMPORT{builtin}="hwdb --subsystem=input --lookup-prefix=evdev:", \ + RUN{builtin}+="keyboard", GOTO="evdev_end" + +# AT keyboard matching by the machine's DMI data +ENV{ID_INPUT_KEY}=="?*", DRIVERS=="atkbd", \ + IMPORT{builtin}="hwdb 'evdev:atkbd:$attr{[dmi/id]modalias}'", \ + RUN{builtin}+="keyboard", GOTO="keyboard_end" + +# device matching the input device name and the machine's DMI data +KERNELS=="input*", IMPORT{builtin}="hwdb 'evdev:name:$attr{name}:$attr{[dmi/id]modalias}'", \ + RUN{builtin}+="keyboard", GOTO="evdev_end" + +LABEL="evdev_end"