All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Stezenbach <js@sig21.net>
To: linux-hotplug@vger.kernel.org
Subject: [PATCH v2] keymap: support for force_release quirk
Date: Mon, 14 Dec 2009 13:50:52 +0000	[thread overview]
Message-ID: <20091214135052.GA30414@sig21.net> (raw)

On Mon, Dec 14, 2009 at 02:32:45PM +0100, Martin Pitt wrote:
> Johannes Stezenbach [2009-12-14 13:55 +0100]:
> > Yes, that was my question: Can I just save the original at boot
> > (first "add" event) into a file (like /dev/.udev/force-release/serioX)?
> 
> No, please don't; such external state keeping is very ugly and error
> prone IMHO, and not what udev is designed to do. I rather think we
> should do one of:
> 
> (1) Demand to have complete force-release tables, and completely
>     reset the value with each invocation of the udev rule.
> 
>     Pro: Can remove values
>     Con: Hard to just fix a single key
> 
> (2) Only ever add new values by reading the current value, appending
>     our tables, and writing it back.
> 
>     Pro: Can fix single keys and potentially simplifies rules
>     Con: Needs reboot for bad tables which set quirk erroneously
> 
> I suppose that on computers which need these quirks, all Fn keys are
> affected equally, so the "fix single key" case is probably irrelevant.
> OTOH, I don't think we'll get too many errors like "erroneous quirk",
> so both approaches should work well in practice.
> 
> Personally I tend to prefer (2).

OK, below is an updated patch which does (2).

I think I addressed all your comments, and also changed

-   [ -n "$attr" ] && attr="$attr,$scancode" || attr="$scancode"
+   attr="$attr${attr:+,}$scancode"

I test booted with the changes, it still works.


Thanks,
Johannes


From a90bb0c00d08c3b09ddec9b7d8fe6d5c330fdf80 Mon Sep 17 00:00:00 2001
From: Johannes Stezenbach <js@sig21.net>
Date: Sun, 13 Dec 2009 23:54:05 +0100
Subject: [PATCH] keymap: handle atkbd force_release quirk

Some laptop keyboards don't generate release events
for some hotkeys.  Since linux-2.6.32 the list of scancodes
for which to enable the force_release quirk can be set
via sysfs.
Apply this to Samsung N130.

Signed-off-by: Johannes Stezenbach <js@sig21.net>
---
 Makefile.am                                       |    6 +++++
 extras/keymap/95-keyboard-force-release.rules     |   24 +++++++++++++++++++++
 extras/keymap/keyboard-force-release.sh           |   22 +++++++++++++++++++
 extras/keymap/keymaps/force-release/samsung-other |   10 ++++++++
 4 files changed, 62 insertions(+), 0 deletions(-)
 create mode 100644 extras/keymap/95-keyboard-force-release.rules
 create mode 100644 extras/keymap/keyboard-force-release.sh
 create mode 100644 extras/keymap/keymaps/force-release/samsung-other

diff --git a/Makefile.am b/Makefile.am
index 3e9713f..4435398 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -480,8 +480,10 @@ BUILT_SOURCES += $(nodist_extras_keymap_keymap_SOURCES)
 
 EXTRA_DIST += extras/keymap/check-keymaps.sh
 dist_udevrules_DATA += extras/keymap/95-keymap.rules
+dist_udevrules_DATA += extras/keymap/95-keyboard-force-release.rules
 libexec_PROGRAMS += extras/keymap/keymap
 dist_libexec_SCRIPTS += extras/keymap/findkeyboards
+dist_libexec_SCRIPTS += extras/keymap/keyboard-force-release.sh
 dist_doc_DATA = extras/keymap/README.keymap.txt
 
 CLEANFILES += \
@@ -535,6 +537,10 @@ dist_udevkeymap_DATA = \
 	extras/keymap/keymaps/toshiba-satellite_a110 \
 	extras/keymap/keymaps/zepto-znote
 
+udevkeymapforcereldir = $(libexecdir)/keymaps/force-release
+dist_udevkeymapforcerel_DATA = \
+	extras/keymap/keymaps/force-release/samsung-other
+
 extras/keymap/keys.txt: /usr/include/linux/input.h
 	$(AM_V_GEN)$(AWK) '/^#define.*KEY_[^ ]+[ \t]+[0-9]/ { if ($$2 != "KEY_MAX") { print $$2 } }' < $< | sed 's/^KEY_COFFEE$$/KEY_SCREENLOCK/' > $@
 
diff --git a/extras/keymap/95-keyboard-force-release.rules b/extras/keymap/95-keyboard-force-release.rules
new file mode 100644
index 0000000..4d0a877
--- /dev/null
+++ b/extras/keymap/95-keyboard-force-release.rules
@@ -0,0 +1,24 @@
+# Set model specific atkbd force_release quirk
+#
+# Several laptops have hotkeys which don't generate release events,
+# which can cause problems with software key repeat.
+# The atkbd driver has a quirk handler for generating synthetic
+# release events, which can be configured via sysfs since 2.6.32.
+# Simply add a file with a list of scancodes for your laptop model
+# in /lib/udev/keymaps, and add a rule here.
+# If the hotkeys also need a keymap assignment you can copy the
+# scancodes from the keymap file, otherwise you can run
+# /lib/udev/keymap -i /dev/input/eventX
+# on a Linux vt to find out.
+
+ACTION!="add|change", GOTO="force_release_end"
+SUBSYSTEM!="serio", GOTO="force_release_end"
+KERNEL!="serio*", GOTO="force_release_end"
+DRIVER!="atkbd", GOTO="force_release_end"
+
+ENV{DMI_VENDOR}="$attr{[dmi/id]sys_vendor}"
+
+
+ENV{DMI_VENDOR}="[sS][aA][mM][sS][uU][nN][gG]*", ATTR{[dmi/id]product_name}="*N130*", RUN+="keyboard-force-release.sh $devpath samsung-other"
+
+LABEL="force_release_end"
diff --git a/extras/keymap/keyboard-force-release.sh b/extras/keymap/keyboard-force-release.sh
new file mode 100644
index 0000000..b157ac3
--- /dev/null
+++ b/extras/keymap/keyboard-force-release.sh
@@ -0,0 +1,22 @@
+#!/bin/sh -e
+# read list of scancodes, convert hex to decimal and
+# append to the atkbd force_release sysfs attribute
+# $1 sysfs devpath for serioX
+# $2 file with scancode list (hex or dec)
+
+case "$2" in
+	/*) scf="$2" ;;
+	*)  scf="/lib/udev/keymaps/force-release/$2" ;;
+esac
+
+read attr <"/sys/$1/force_release"
+while read scancode dummy; do
+	case "$scancode" in
+		\#*) ;;
+		*)
+			scancode=$(($scancode))
+			attr="$attr${attr:+,}$scancode"
+			;;
+	esac
+done <"$scf"
+echo "$attr" >"/sys/$1/force_release"
diff --git a/extras/keymap/keymaps/force-release/samsung-other b/extras/keymap/keymaps/force-release/samsung-other
new file mode 100644
index 0000000..c51123a
--- /dev/null
+++ b/extras/keymap/keymaps/force-release/samsung-other
@@ -0,0 +1,10 @@
+# list of scancodes (hex or decimal), optional comment
+0x82 # Fn+F4 CRT/LCD
+0x83 # Fn+F2 battery
+0x84 # Fn+F5 backlight on/off
+0x86 # Fn+F9 WLAN
+0x88 # Fn-Up brightness up
+0x89 # Fn-Down brightness down
+0xB3 # Fn+F8 switch power mode (battery/dynamic/performance)
+0xF7 # Fn+F10 Touchpad on
+0xF9 # Fn+F10 Touchpad off
-- 
1.6.5.4


             reply	other threads:[~2009-12-14 13:50 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-14 13:50 Johannes Stezenbach [this message]
2009-12-14 18:20 ` [PATCH v2] keymap: support for force_release quirk Martin Pitt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20091214135052.GA30414@sig21.net \
    --to=js@sig21.net \
    --cc=linux-hotplug@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.