Skip to contentSkip to conversation

fix apple alu keyboard with numpad

PATCH In review Dag Bakke 4 participants 9 messages Apr 27, 2008 – May 12, 2008

Subsystems (2)
lore
Share & tools
lore

Dag Bakke

author
#0 lore raw

PATCH 1/1 fix apple alu keyboard with numpad

The nice apple alu keyboards with numpads are pretty much unusable in vanilla 2.6.25.
(http://images.apple.com/keyboard/images/gallery/wired_1_20070813.jpg)
Hitting the 'clear' key (=numlock) disables the numpad, and maps multiple alphanumeric keys to numpad symbols in typical laptopkeyboard fashion.

Furthermore, some of the F-keys do double duty as multimedia keys. The vanilla kernel defaults to multimedia keys, requiring the user to hit the 'fn' key to get F-key events. I use F-keys more often than multimedia keys, so I included the patch to change the default to be F-keys.

The following patch is taken from:
https://bugs.launchpad.net/mactel-support/+bug/201887
and appears to have been written by Eric Johney. I have merely lifted the two patches from the webpage above and submitted it, as I couldn't see it upstream after a brief search.

drivers/hid/hid-input.c 2008-04-25 23:07:52.925613698 +0200 renamed from drivers/hid/hid-input.c 2008-04-17 04:49:44.000000000 +0200 +4 -3
@@ -34,7 +34,7 @@
 #include <linux/hid.h>
 #include <linux/hid-debug.h>
 
-static int hid_apple_fnmode = 1;
+static int hid_apple_fnmode = 2;
 module_param_named(pb_fnmode, hid_apple_fnmode, int, 0644);
 MODULE_PARM_DESC(pb_fnmode,
                "Mode of fn key on Apple keyboards (0 = disabled, 1 = fkeyslast, 2 = fkeysfirst)");
@@ -218,8 +218,9 @@
                        }
                }
 
-               if (test_bit(usage->code, hid->pb_pressed_numlock) ||
-                               test_bit(LED_NUML, input->led)) {
+               if ((test_bit(usage->code, hid->pb_pressed_numlock) ||
+                               test_bit(LED_NUML, input->led)) &&
+                               (hid->product < 0x220 ||hid->product >= 0x300)) {
                        trans = find_translation(powerbook_numlock_keys, usage->code);
 
                        if (trans) {

For "completeness" and the benfit of someone finding this in an archive later, the following 4 commands provides correct keys for the multimediakeys in X:

setxkbmap -model macintosh
xmodmap -e "keycode 162 = XF86AudioPlay"
xmodmap -e "keycode 153 = XF86AudioNext"
xmodmap -e "keycode 144 = XF86AudioPrev"

Works with a US layout keyboard, anyway.

Regards,

Dag B.

#1 lore raw
Quoted 50 lines · On Sun, 27 Apr 2008 13:19:11 +0200 Dag Bakke <[email protected]> wrote:

The nice apple alu keyboards with numpads are pretty much unusable in vanilla 2.6.25.
(http://images.apple.com/keyboard/images/gallery/wired_1_20070813.jpg)
Hitting the 'clear' key (=numlock) disables the numpad, and maps multiple alphanumeric keys to numpad symbols in typical laptopkeyboard fashion.

Furthermore, some of the F-keys do double duty as multimedia keys. The vanilla kernel defaults to multimedia keys, requiring the user to hit the 'fn' key to get F-key events. I use F-keys more often than multimedia keys, so I included the patch to change the default to be F-keys.

The following patch is taken from:
https://bugs.launchpad.net/mactel-support/+bug/201887
and appears to have been written by Eric Johney. I have merely lifted the two patches from the webpage above and submitted it, as I couldn't see it upstream after a brief search.

drivers/hid/hid-input.c 2008-04-25 23:07:52.925613698 +0200 renamed from drivers/hid/hid-input.c 2008-04-17 04:49:44.000000000 +0200 +4 -3
@@ -34,7 +34,7 @@
  #include <linux/hid.h>
  #include <linux/hid-debug.h>
 
-static int hid_apple_fnmode = 1;
+static int hid_apple_fnmode = 2;
  module_param_named(pb_fnmode, hid_apple_fnmode, int, 0644);
  MODULE_PARM_DESC(pb_fnmode,
                 "Mode of fn key on Apple keyboards (0 = disabled, 1 = fkeyslast, 2 = fkeysfirst)");
@@ -218,8 +218,9 @@
                         }
                 }
 
-               if (test_bit(usage->code, hid->pb_pressed_numlock) ||
-                               test_bit(LED_NUML, input->led)) {
+               if ((test_bit(usage->code, hid->pb_pressed_numlock) ||
+                               test_bit(LED_NUML, input->led)) &&
+                               (hid->product < 0x220 ||hid->product >= 0x300)) {
                         trans = find_translation(powerbook_numlock_keys, usage->code);
 
                         if (trans) {

For "completeness" and the benfit of someone finding this in an archive later, the following 4 commands provides correct keys for the multimediakeys in X:

Quoted 7 lines

setxkbmap -model macintosh
xmodmap -e "keycode 162 = XF86AudioPlay"
xmodmap -e "keycode 153 = XF86AudioNext"
xmodmap -e "keycode 144 = XF86AudioPrev"

Works with a US layout keyboard, anyway.

This conflicts rather directly with hid-disable-numlock-emulation-for-apple-aluminium-keyboards.patch below (hm, seems we didn't get a changelog for that one).

Jiri, what should we do here?

Thanks

From: "Diego 'Flameeyes' Petteno" <[email protected]>

---

 drivers/hid/hid-input.c         |    5 ++--
 drivers/hid/usbhid/hid-quirks.c |   32 +++++++++++++++---------------
 include/linux/hid.h             |    1 
 3 files changed, 20 insertions(+), 18 deletions(-)
drivers/hid/hid-input.c renamed from drivers/hid/hid-input.c~hid-disable-numlock-emulation-for-apple-aluminium-keyboards +3 -2
diff -puN drivers/hid/hid-input.c~hid-disable-numlock-emulation-for-apple-aluminium-keyboards drivers/hid/hid-input.c
@@ -218,8 +218,9 @@ int hidinput_apple_event(struct hid_devi
 			}
 		}
 
-		if (test_bit(usage->code, hid->pb_pressed_numlock) ||
-				test_bit(LED_NUML, input->led)) {
+		if (hid->quirks & HID_QUIRK_APPLE_NUMLOCK_EMULATION && (
+				test_bit(usage->code, hid->pb_pressed_numlock) ||
+				test_bit(LED_NUML, input->led))) {
 			trans = find_translation(powerbook_numlock_keys, usage->code);
 
 			if (trans) {
drivers/hid/usbhid/hid-quirks.c renamed from drivers/hid/usbhid/hid-quirks.c~hid-disable-numlock-emulation-for-apple-aluminium-keyboards +16 -16
diff -puN drivers/hid/usbhid/hid-quirks.c~hid-disable-numlock-emulation-for-apple-aluminium-keyboards drivers/hid/usbhid/hid-quirks.c
@@ -613,28 +613,28 @@ static const struct hid_blacklist {
 
 	{ USB_VENDOR_ID_WISEGROUP_LTD, USB_DEVICE_ID_SMARTJOY_DUAL_PLUS, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT },
 
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_ISO_KEYBOARD},
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ANSI, HID_QUIRK_APPLE_HAS_FN },
 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_JIS, HID_QUIRK_APPLE_HAS_FN },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI, HID_QUIRK_APPLE_HAS_FN },
 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
 	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS, HID_QUIRK_APPLE_HAS_FN },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
-	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
+	{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_IGNORE_MOUSE },
 
 	{ USB_VENDOR_ID_DELL, USB_DEVICE_ID_DELL_W7658, HID_QUIRK_RESET_LEDS },
 	{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_KBD, HID_QUIRK_RESET_LEDS },
include/linux/hid.h renamed from include/linux/hid.h~hid-disable-numlock-emulation-for-apple-aluminium-keyboards +1 -0
diff -puN include/linux/hid.h~hid-disable-numlock-emulation-for-apple-aluminium-keyboards include/linux/hid.h
@@ -285,6 +285,7 @@ struct hid_item {
 #define HID_QUIRK_HWHEEL_WHEEL_INVERT		0x04000000
 #define HID_QUIRK_MICROSOFT_KEYS		0x08000000
 #define HID_QUIRK_FULLSPEED_INTERVAL		0x10000000
+#define HID_QUIRK_APPLE_NUMLOCK_EMULATION	0x20000000
 
 /*
  * Separate quirks for runtime report descriptor fixup

_

#2 lore raw
Quoted 8 lines · Andrew Morton
Quoted 5 lines

The nice apple alu keyboards with numpads are pretty much unusable in vanilla 2.6.25.
(http://images.apple.com/keyboard/images/gallery/wired_1_20070813.jpg)
Hitting the 'clear' key (=numlock) disables the numpad, and maps multiple alphanumeric keys to numpad symbols in typical laptopkeyboard fashion.

This conflicts rather directly with hid-disable-numlock-emulation-for-apple-aluminium-keyboards.patch below (hm, seems we didn't get a changelog for that one).

Hi,

I have just today applied Diego's patch into my tree [1], he has provided the changelog out of list to me.

Quoted 1 line

Jiri, what should we do here?

Dag, I think Diego's patch should solve the issue you are seeing, right?

[1] http://git.kernel.org/?p=linux/kernel/git/jikos/hid.git;a=commit;h=ffe6f7b799e33f51732520979f9c253a252b9d5e

Thanks,

Signature · 1 line
Jiri Kosina
author
#3 lore raw

Jiri Kosina wrote, On 05/06/2008 10:46 PM:

Quoted 11 lines · Andrew Morton
Quoted 7 lines
Quoted 6 lines

The nice apple alu keyboards with numpads are pretty much unusable in vanilla 2.6.25.
(http://images.apple.com/keyboard/images/gallery/wired_1_20070813.jpg)
Hitting the 'clear' key (=numlock) disables the numpad, and maps multiple alphanumeric keys to numpad symbols in typical laptopkeyboard fashion.

This conflicts rather directly with hid-disable-numlock-emulation-for-apple-aluminium-keyboards.patch below (hm, seems we didn't get a changelog for that one).

Hi,

Quoted 7 lines

I have just today applied Diego's patch into my tree [1], he has provided the changelog out of list to me.

Quoted 1 line

Jiri, what should we do here?

Dag, I think Diego's patch should solve the issue you are seeing, right?

[1] http://git.kernel.org/?p=linux/kernel/git/jikos/hid.git;a=commit;h=ffe6f7b799e33f51732520979f9c253a252b9d5e

I'll give it a shot and let you know.

Dag B

author
#5 lore raw

Jiri Kosina wrote, On 05/12/2008 12:54 AM:

Quoted 6 lines · Dag Bakke
Quoted 5 lines
Quoted 5 lines

Dag, I think Diego's patch should solve the issue you are seeing, right?

[1]
http://git.kernel.org/?p=linux/kernel/git/jikos/hid.git;a=commit;h=ffe6f7b799e33f51732520979f9c253a252b9d5e

Quoted 8 lines
Quoted 1 line

I'll give it a shot and let you know.

Dag,

any update here, please?

Thanks,

The patch works, thank you. Looks like all keys produce what I expect now.

Well. At least in X11 they do.
In the console, I get '~' instead of '=', when hitting the numpad '=' key.

This may have been no different with the patch I used previously.

Dag B

author
#7 lore raw

Matthew Garrett wrote, On 05/07/2008 01:43 AM:

Quoted 7 lines · Andrew Morton
Quoted 3 lines

Review

Quoted 3 lines
(quoted diff) +1 -1
-static int hid_apple_fnmode = 1;
+static int hid_apple_fnmode = 2;

Regardless of anything else, we don't want this hunk.

Was my reasoning for this change off ("F-keys used more often that multimediakeys, ergo make that the default"), or is your resistance to this change due to some kind of policy?

Sorry if the reason is obvious to you. It isn't to me, yet.

Regards,

Dag B

#8 lore raw
Quoted 9 lines · Dag Bakke

Matthew Garrett wrote, On 05/07/2008 01:43 AM:

Quoted 7 lines · Andrew Morton
Quoted 3 lines

Review

Quoted 3 lines
(quoted diff) +1 -1
-static int hid_apple_fnmode = 1;
+static int hid_apple_fnmode = 2;

Regardless of anything else, we don't want this hunk.

Quoted 3 lines

Was my reasoning for this change off ("F-keys used more often that multimediakeys, ergo make that the default"), or is your resistance to this change due to some kind of policy?

It's a change in behaviour of a wide range of keyboards, and it's in a patch that is supposed to be fixing a single keyboard. Personally, I suspect that the people who are going to want the F-keys by default are the people who are easily able to change this behaviour and the ones who aren't are the ones who are going to expect their keyboard to behave like it did under MacOS. But that's a separate argument for a separate patch :)

Signature · 1 line
Matthew Garrett | [email protected]