Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 290294 Details for
Bug 426576
[PATCH] macbook 3.1 and apple aluminum keyboards fn key does not work
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Test kernel patch for 2.6.23 x86_64
cnolan-macbook-patch.patch (text/plain), 105.60 KB, created by
Chris Nolan
on 2007-12-22 17:51:52 UTC
(
hide
)
Description:
Test kernel patch for 2.6.23 x86_64
Filename:
MIME Type:
Creator:
Chris Nolan
Created:
2007-12-22 17:51:52 UTC
Size:
105.60 KB
patch
obsolete
>diff -uNrp kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/hid/hid-input.c kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/hid/hid-input.c >--- kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/hid/hid-input.c 2007-12-22 15:37:48.000000000 +0000 >+++ kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/hid/hid-input.c 2007-12-22 15:53:22.000000000 +0000 >@@ -115,6 +115,30 @@ static struct hidinput_key_translation p > { } > }; > >+static struct hidinput_key_translation apple_keyboard_fn_keys[] = { >+ { KEY_BACKSPACE, KEY_DELETE }, >+ { KEY_F1, KEY_BRIGHTNESSDOWN, POWERBOOK_FLAG_FKEY }, >+ { KEY_F2, KEY_BRIGHTNESSUP, POWERBOOK_FLAG_FKEY }, >+ { KEY_F3, KEY_CYCLEWINDOWS, POWERBOOK_FLAG_FKEY }, >+ { KEY_F4, KEY_CONFIG, POWERBOOK_FLAG_FKEY }, >+ { KEY_F7, KEY_PREVIOUSSONG, POWERBOOK_FLAG_FKEY }, >+ { KEY_F8, KEY_PLAYPAUSE, POWERBOOK_FLAG_FKEY }, >+ { KEY_F9, KEY_NEXTSONG, POWERBOOK_FLAG_FKEY }, >+ { KEY_F10, KEY_MUTE, POWERBOOK_FLAG_FKEY }, >+ { KEY_F11, KEY_VOLUMEDOWN, POWERBOOK_FLAG_FKEY }, >+ { KEY_F12, KEY_VOLUMEUP, POWERBOOK_FLAG_FKEY }, >+ { KEY_UP, KEY_PAGEUP }, >+ { KEY_DOWN, KEY_PAGEDOWN }, >+ { KEY_LEFT, KEY_HOME }, >+ { KEY_RIGHT, KEY_END }, >+ { } >+}; >+ >+static struct hidinput_key_translation apple_keyboard[] = { >+ { KEY_VOLUMEUP, KEY_EJECTCD }, >+ { } >+}; >+ > static struct hidinput_key_translation powerbook_numlock_keys[] = { > { KEY_J, KEY_KP1 }, > { KEY_K, KEY_KP2 }, >@@ -172,8 +196,10 @@ static int hidinput_pb_event(struct hid_ > > if (hid_pb_fnmode) { > int do_translate; >- >- trans = find_translation(powerbook_fn_keys, usage->code); >+ if (hid->quirks & HID_QUIRK_APPLE_KEYBOARD) >+ trans = find_translation(apple_keyboard_fn_keys, usage->code); >+ else >+ trans = find_translation(powerbook_fn_keys, usage->code); > if (trans) { > if (test_bit(usage->code, hid->pb_pressed_fn)) > do_translate = 1; >@@ -196,8 +222,8 @@ static int hidinput_pb_event(struct hid_ > } > } > >- if (test_bit(usage->code, hid->pb_pressed_numlock) || >- test_bit(LED_NUML, input->led)) { >+ if (!(hid->quirks & HID_QUIRK_APPLE_KEYBOARD) && (test_bit(usage->code, hid->pb_pressed_numlock) || >+ test_bit(LED_NUML, input->led))) { > trans = find_translation(powerbook_numlock_keys, usage->code); > > if (trans) { >@@ -213,6 +239,14 @@ static int hidinput_pb_event(struct hid_ > } > } > >+ if (hid->quirks & HID_QUIRK_APPLE_KEYBOARD) { >+ trans = find_translation(apple_keyboard, usage->code); >+ if (trans) { >+ input_event(input, usage->type, trans->to, value); >+ return 1; >+ } >+ } >+ > if (hid->quirks & HID_QUIRK_POWERBOOK_ISO_KEYBOARD) { > trans = find_translation(powerbook_iso_keyboard, usage->code); > if (trans) { >@@ -237,6 +271,12 @@ static void hidinput_pb_setup(struct inp > for (trans = powerbook_numlock_keys; trans->from; trans++) > set_bit(trans->to, input->keybit); > >+ for (trans = apple_keyboard_fn_keys; trans->from; trans++) >+ set_bit(trans->to, input->keybit); >+ >+ for (trans = apple_keyboard; trans->from; trans++) >+ set_bit(trans->to, input->keybit); >+ > for (trans = powerbook_iso_keyboard; trans->from; trans++) > set_bit(trans->to, input->keybit); > >diff -uNrp kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/hid/hid-input.c.orig kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/hid/hid-input.c.orig >--- kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/hid/hid-input.c.orig 1970-01-01 01:00:00.000000000 +0100 >+++ kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/hid/hid-input.c.orig 2007-12-22 15:37:48.000000000 +0000 >@@ -0,0 +1,1138 @@ >+/* >+ * $Id: hid-input.c,v 1.2 2002/04/23 00:59:25 rdamazio Exp $ >+ * >+ * Copyright (c) 2000-2001 Vojtech Pavlik >+ * Copyright (c) 2006-2007 Jiri Kosina >+ * >+ * HID to Linux Input mapping >+ */ >+ >+/* >+ * This program is free software; you can redistribute it and/or modify >+ * it under the terms of the GNU General Public License as published by >+ * the Free Software Foundation; either version 2 of the License, or >+ * (at your option) any later version. >+ * >+ * This program is distributed in the hope that it will be useful, >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >+ * GNU General Public License for more details. >+ * >+ * You should have received a copy of the GNU General Public License >+ * along with this program; if not, write to the Free Software >+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA >+ * >+ * Should you need to contact me, the author, you can do so either by >+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail: >+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic >+ */ >+ >+#include <linux/module.h> >+#include <linux/slab.h> >+#include <linux/kernel.h> >+ >+#include <linux/hid.h> >+#include <linux/hid-debug.h> >+ >+static int hid_pb_fnmode = 1; >+module_param_named(pb_fnmode, hid_pb_fnmode, int, 0644); >+MODULE_PARM_DESC(pb_fnmode, >+ "Mode of fn key on PowerBooks (0 = disabled, 1 = fkeyslast, 2 = fkeysfirst)"); >+ >+#define unk KEY_UNKNOWN >+ >+static const unsigned char hid_keyboard[256] = { >+ 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, >+ 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3, >+ 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26, >+ 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64, >+ 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106, >+ 105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71, >+ 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190, >+ 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113, >+ 115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk, >+ 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, >+ unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, >+ unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, >+ unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, >+ unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, >+ 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113, >+ 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk >+}; >+ >+/* extended mapping for certain Logitech hardware (Logitech cordless desktop LX500) */ >+#define LOGITECH_EXPANDED_KEYMAP_SIZE 80 >+static int logitech_expanded_keymap[LOGITECH_EXPANDED_KEYMAP_SIZE] = { >+ 0,216, 0,213,175,156, 0, 0, 0, 0, >+ 144, 0, 0, 0, 0, 0, 0, 0, 0,212, >+ 174,167,152,161,112, 0, 0, 0,154, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >+ 0, 0, 0, 0, 0,183,184,185,186,187, >+ 188,189,190,191,192,193,194, 0, 0, 0 >+}; >+ >+static const struct { >+ __s32 x; >+ __s32 y; >+} hid_hat_to_axis[] = {{ 0, 0}, { 0,-1}, { 1,-1}, { 1, 0}, { 1, 1}, { 0, 1}, {-1, 1}, {-1, 0}, {-1,-1}}; >+ >+#define map_abs(c) do { usage->code = c; usage->type = EV_ABS; bit = input->absbit; max = ABS_MAX; } while (0) >+#define map_rel(c) do { usage->code = c; usage->type = EV_REL; bit = input->relbit; max = REL_MAX; } while (0) >+#define map_key(c) do { usage->code = c; usage->type = EV_KEY; bit = input->keybit; max = KEY_MAX; } while (0) >+#define map_led(c) do { usage->code = c; usage->type = EV_LED; bit = input->ledbit; max = LED_MAX; } while (0) >+ >+#define map_abs_clear(c) do { map_abs(c); clear_bit(c, bit); } while (0) >+#define map_key_clear(c) do { map_key(c); clear_bit(c, bit); } while (0) >+ >+#ifdef CONFIG_USB_HIDINPUT_POWERBOOK >+ >+struct hidinput_key_translation { >+ u16 from; >+ u16 to; >+ u8 flags; >+}; >+ >+#define POWERBOOK_FLAG_FKEY 0x01 >+ >+static struct hidinput_key_translation powerbook_fn_keys[] = { >+ { KEY_BACKSPACE, KEY_DELETE }, >+ { KEY_F1, KEY_BRIGHTNESSDOWN, POWERBOOK_FLAG_FKEY }, >+ { KEY_F2, KEY_BRIGHTNESSUP, POWERBOOK_FLAG_FKEY }, >+ { KEY_F3, KEY_MUTE, POWERBOOK_FLAG_FKEY }, >+ { KEY_F4, KEY_VOLUMEDOWN, POWERBOOK_FLAG_FKEY }, >+ { KEY_F5, KEY_VOLUMEUP, POWERBOOK_FLAG_FKEY }, >+ { KEY_F6, KEY_NUMLOCK, POWERBOOK_FLAG_FKEY }, >+ { KEY_F7, KEY_SWITCHVIDEOMODE, POWERBOOK_FLAG_FKEY }, >+ { KEY_F8, KEY_KBDILLUMTOGGLE, POWERBOOK_FLAG_FKEY }, >+ { KEY_F9, KEY_KBDILLUMDOWN, POWERBOOK_FLAG_FKEY }, >+ { KEY_F10, KEY_KBDILLUMUP, POWERBOOK_FLAG_FKEY }, >+ { KEY_UP, KEY_PAGEUP }, >+ { KEY_DOWN, KEY_PAGEDOWN }, >+ { KEY_LEFT, KEY_HOME }, >+ { KEY_RIGHT, KEY_END }, >+ { } >+}; >+ >+static struct hidinput_key_translation powerbook_numlock_keys[] = { >+ { KEY_J, KEY_KP1 }, >+ { KEY_K, KEY_KP2 }, >+ { KEY_L, KEY_KP3 }, >+ { KEY_U, KEY_KP4 }, >+ { KEY_I, KEY_KP5 }, >+ { KEY_O, KEY_KP6 }, >+ { KEY_7, KEY_KP7 }, >+ { KEY_8, KEY_KP8 }, >+ { KEY_9, KEY_KP9 }, >+ { KEY_M, KEY_KP0 }, >+ { KEY_DOT, KEY_KPDOT }, >+ { KEY_SLASH, KEY_KPPLUS }, >+ { KEY_SEMICOLON, KEY_KPMINUS }, >+ { KEY_P, KEY_KPASTERISK }, >+ { KEY_MINUS, KEY_KPEQUAL }, >+ { KEY_0, KEY_KPSLASH }, >+ { KEY_F6, KEY_NUMLOCK }, >+ { KEY_KPENTER, KEY_KPENTER }, >+ { KEY_BACKSPACE, KEY_BACKSPACE }, >+ { } >+}; >+ >+static struct hidinput_key_translation powerbook_iso_keyboard[] = { >+ { KEY_GRAVE, KEY_102ND }, >+ { KEY_102ND, KEY_GRAVE }, >+ { } >+}; >+ >+static struct hidinput_key_translation *find_translation(struct hidinput_key_translation *table, u16 from) >+{ >+ struct hidinput_key_translation *trans; >+ >+ /* Look for the translation */ >+ for (trans = table; trans->from; trans++) >+ if (trans->from == from) >+ return trans; >+ >+ return NULL; >+} >+ >+static int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, >+ struct hid_usage *usage, __s32 value) >+{ >+ struct hidinput_key_translation *trans; >+ >+ if (usage->code == KEY_FN) { >+ if (value) hid->quirks |= HID_QUIRK_POWERBOOK_FN_ON; >+ else hid->quirks &= ~HID_QUIRK_POWERBOOK_FN_ON; >+ >+ input_event(input, usage->type, usage->code, value); >+ >+ return 1; >+ } >+ >+ if (hid_pb_fnmode) { >+ int do_translate; >+ >+ trans = find_translation(powerbook_fn_keys, usage->code); >+ if (trans) { >+ if (test_bit(usage->code, hid->pb_pressed_fn)) >+ do_translate = 1; >+ else if (trans->flags & POWERBOOK_FLAG_FKEY) >+ do_translate = >+ (hid_pb_fnmode == 2 && (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON)) || >+ (hid_pb_fnmode == 1 && !(hid->quirks & HID_QUIRK_POWERBOOK_FN_ON)); >+ else >+ do_translate = (hid->quirks & HID_QUIRK_POWERBOOK_FN_ON); >+ >+ if (do_translate) { >+ if (value) >+ set_bit(usage->code, hid->pb_pressed_fn); >+ else >+ clear_bit(usage->code, hid->pb_pressed_fn); >+ >+ input_event(input, usage->type, trans->to, value); >+ >+ return 1; >+ } >+ } >+ >+ if (test_bit(usage->code, hid->pb_pressed_numlock) || >+ test_bit(LED_NUML, input->led)) { >+ trans = find_translation(powerbook_numlock_keys, usage->code); >+ >+ if (trans) { >+ if (value) >+ set_bit(usage->code, hid->pb_pressed_numlock); >+ else >+ clear_bit(usage->code, hid->pb_pressed_numlock); >+ >+ input_event(input, usage->type, trans->to, value); >+ } >+ >+ return 1; >+ } >+ } >+ >+ if (hid->quirks & HID_QUIRK_POWERBOOK_ISO_KEYBOARD) { >+ trans = find_translation(powerbook_iso_keyboard, usage->code); >+ if (trans) { >+ input_event(input, usage->type, trans->to, value); >+ return 1; >+ } >+ } >+ >+ return 0; >+} >+ >+static void hidinput_pb_setup(struct input_dev *input) >+{ >+ struct hidinput_key_translation *trans; >+ >+ set_bit(KEY_NUMLOCK, input->keybit); >+ >+ /* Enable all needed keys */ >+ for (trans = powerbook_fn_keys; trans->from; trans++) >+ set_bit(trans->to, input->keybit); >+ >+ for (trans = powerbook_numlock_keys; trans->from; trans++) >+ set_bit(trans->to, input->keybit); >+ >+ for (trans = powerbook_iso_keyboard; trans->from; trans++) >+ set_bit(trans->to, input->keybit); >+ >+} >+#else >+static inline int hidinput_pb_event(struct hid_device *hid, struct input_dev *input, >+ struct hid_usage *usage, __s32 value) >+{ >+ return 0; >+} >+ >+static inline void hidinput_pb_setup(struct input_dev *input) >+{ >+} >+#endif >+ >+static inline int match_scancode(int code, int scancode) >+{ >+ if (scancode == 0) >+ return 1; >+ return ((code & (HID_USAGE_PAGE | HID_USAGE)) == scancode); >+} >+ >+static inline int match_keycode(int code, int keycode) >+{ >+ if (keycode == 0) >+ return 1; >+ return (code == keycode); >+} >+ >+static struct hid_usage *hidinput_find_key(struct hid_device *hid, >+ int scancode, int keycode) >+{ >+ int i, j, k; >+ struct hid_report *report; >+ struct hid_usage *usage; >+ >+ for (k = HID_INPUT_REPORT; k <= HID_OUTPUT_REPORT; k++) { >+ list_for_each_entry(report, &hid->report_enum[k].report_list, list) { >+ for (i = 0; i < report->maxfield; i++) { >+ for ( j = 0; j < report->field[i]->maxusage; j++) { >+ usage = report->field[i]->usage + j; >+ if (usage->type == EV_KEY && >+ match_scancode(usage->hid, scancode) && >+ match_keycode(usage->code, keycode)) >+ return usage; >+ } >+ } >+ } >+ } >+ return NULL; >+} >+ >+static int hidinput_getkeycode(struct input_dev *dev, int scancode, >+ int *keycode) >+{ >+ struct hid_device *hid = dev->private; >+ struct hid_usage *usage; >+ >+ usage = hidinput_find_key(hid, scancode, 0); >+ if (usage) { >+ *keycode = usage->code; >+ return 0; >+ } >+ return -EINVAL; >+} >+ >+static int hidinput_setkeycode(struct input_dev *dev, int scancode, >+ int keycode) >+{ >+ struct hid_device *hid = dev->private; >+ struct hid_usage *usage; >+ int old_keycode; >+ >+ if (keycode < 0 || keycode > KEY_MAX) >+ return -EINVAL; >+ >+ usage = hidinput_find_key(hid, scancode, 0); >+ if (usage) { >+ old_keycode = usage->code; >+ usage->code = keycode; >+ >+ clear_bit(old_keycode, dev->keybit); >+ set_bit(usage->code, dev->keybit); >+ dbg_hid(KERN_DEBUG "Assigned keycode %d to HID usage code %x\n", keycode, scancode); >+ /* Set the keybit for the old keycode if the old keycode is used >+ * by another key */ >+ if (hidinput_find_key (hid, 0, old_keycode)) >+ set_bit(old_keycode, dev->keybit); >+ >+ return 0; >+ } >+ >+ return -EINVAL; >+} >+ >+ >+static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field, >+ struct hid_usage *usage) >+{ >+ struct input_dev *input = hidinput->input; >+ struct hid_device *device = input_get_drvdata(input); >+ int max = 0, code; >+ unsigned long *bit = NULL; >+ >+ field->hidinput = hidinput; >+ >+ dbg_hid("Mapping: "); >+ hid_resolv_usage(usage->hid); >+ dbg_hid_line(" ---> "); >+ >+ if (field->flags & HID_MAIN_ITEM_CONSTANT) >+ goto ignore; >+ >+ switch (usage->hid & HID_USAGE_PAGE) { >+ >+ case HID_UP_UNDEFINED: >+ goto ignore; >+ >+ case HID_UP_KEYBOARD: >+ >+ set_bit(EV_REP, input->evbit); >+ >+ if ((usage->hid & HID_USAGE) < 256) { >+ if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore; >+ map_key_clear(hid_keyboard[usage->hid & HID_USAGE]); >+ } else >+ map_key(KEY_UNKNOWN); >+ >+ break; >+ >+ case HID_UP_BUTTON: >+ >+ code = ((usage->hid - 1) & 0xf); >+ >+ switch (field->application) { >+ case HID_GD_MOUSE: >+ case HID_GD_POINTER: code += 0x110; break; >+ case HID_GD_JOYSTICK: code += 0x120; break; >+ case HID_GD_GAMEPAD: code += 0x130; break; >+ default: >+ switch (field->physical) { >+ case HID_GD_MOUSE: >+ case HID_GD_POINTER: code += 0x110; break; >+ case HID_GD_JOYSTICK: code += 0x120; break; >+ case HID_GD_GAMEPAD: code += 0x130; break; >+ default: code += 0x100; >+ } >+ } >+ >+ /* Special handling for Logitech Cordless Desktop */ >+ if (field->application != HID_GD_MOUSE) { >+ if (device->quirks & HID_QUIRK_LOGITECH_EXPANDED_KEYMAP) { >+ int hid = usage->hid & HID_USAGE; >+ if (hid < LOGITECH_EXPANDED_KEYMAP_SIZE && logitech_expanded_keymap[hid] != 0) >+ code = logitech_expanded_keymap[hid]; >+ } >+ } else { >+ if (device->quirks & HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL) { >+ int hid = usage->hid & HID_USAGE; >+ if (hid == 7 || hid == 8) >+ goto ignore; >+ } >+ } >+ >+ map_key(code); >+ break; >+ >+ >+ case HID_UP_SIMULATION: >+ >+ switch (usage->hid & 0xffff) { >+ case 0xba: map_abs(ABS_RUDDER); break; >+ case 0xbb: map_abs(ABS_THROTTLE); break; >+ case 0xc4: map_abs(ABS_GAS); break; >+ case 0xc5: map_abs(ABS_BRAKE); break; >+ case 0xc8: map_abs(ABS_WHEEL); break; >+ default: goto ignore; >+ } >+ break; >+ >+ case HID_UP_GENDESK: >+ >+ if ((usage->hid & 0xf0) == 0x80) { /* SystemControl */ >+ switch (usage->hid & 0xf) { >+ case 0x1: map_key_clear(KEY_POWER); break; >+ case 0x2: map_key_clear(KEY_SLEEP); break; >+ case 0x3: map_key_clear(KEY_WAKEUP); break; >+ default: goto unknown; >+ } >+ break; >+ } >+ >+ if ((usage->hid & 0xf0) == 0x90) { /* D-pad */ >+ switch (usage->hid) { >+ case HID_GD_UP: usage->hat_dir = 1; break; >+ case HID_GD_DOWN: usage->hat_dir = 5; break; >+ case HID_GD_RIGHT: usage->hat_dir = 3; break; >+ case HID_GD_LEFT: usage->hat_dir = 7; break; >+ default: goto unknown; >+ } >+ if (field->dpad) { >+ map_abs(field->dpad); >+ goto ignore; >+ } >+ map_abs(ABS_HAT0X); >+ break; >+ } >+ >+ switch (usage->hid) { >+ >+ /* These usage IDs map directly to the usage codes. */ >+ case HID_GD_X: case HID_GD_Y: case HID_GD_Z: >+ case HID_GD_RX: case HID_GD_RY: case HID_GD_RZ: >+ case HID_GD_SLIDER: case HID_GD_DIAL: case HID_GD_WHEEL: >+ if (field->flags & HID_MAIN_ITEM_RELATIVE) >+ map_rel(usage->hid & 0xf); >+ else >+ map_abs(usage->hid & 0xf); >+ break; >+ >+ case HID_GD_HATSWITCH: >+ usage->hat_min = field->logical_minimum; >+ usage->hat_max = field->logical_maximum; >+ map_abs(ABS_HAT0X); >+ break; >+ >+ case HID_GD_START: map_key_clear(BTN_START); break; >+ case HID_GD_SELECT: map_key_clear(BTN_SELECT); break; >+ >+ default: goto unknown; >+ } >+ >+ break; >+ >+ case HID_UP_LED: >+ >+ switch (usage->hid & 0xffff) { /* HID-Value: */ >+ case 0x01: map_led (LED_NUML); break; /* "Num Lock" */ >+ case 0x02: map_led (LED_CAPSL); break; /* "Caps Lock" */ >+ case 0x03: map_led (LED_SCROLLL); break; /* "Scroll Lock" */ >+ case 0x04: map_led (LED_COMPOSE); break; /* "Compose" */ >+ case 0x05: map_led (LED_KANA); break; /* "Kana" */ >+ case 0x27: map_led (LED_SLEEP); break; /* "Stand-By" */ >+ case 0x4c: map_led (LED_SUSPEND); break; /* "System Suspend" */ >+ case 0x09: map_led (LED_MUTE); break; /* "Mute" */ >+ case 0x4b: map_led (LED_MISC); break; /* "Generic Indicator" */ >+ case 0x19: map_led (LED_MAIL); break; /* "Message Waiting" */ >+ case 0x4d: map_led (LED_CHARGING); break; /* "External Power Connected" */ >+ >+ default: goto ignore; >+ } >+ break; >+ >+ case HID_UP_DIGITIZER: >+ >+ switch (usage->hid & 0xff) { >+ >+ case 0x30: /* TipPressure */ >+ if (!test_bit(BTN_TOUCH, input->keybit)) { >+ device->quirks |= HID_QUIRK_NOTOUCH; >+ set_bit(EV_KEY, input->evbit); >+ set_bit(BTN_TOUCH, input->keybit); >+ } >+ >+ map_abs_clear(ABS_PRESSURE); >+ break; >+ >+ case 0x32: /* InRange */ >+ switch (field->physical & 0xff) { >+ case 0x21: map_key(BTN_TOOL_MOUSE); break; >+ case 0x22: map_key(BTN_TOOL_FINGER); break; >+ default: map_key(BTN_TOOL_PEN); break; >+ } >+ break; >+ >+ case 0x3c: /* Invert */ >+ map_key_clear(BTN_TOOL_RUBBER); >+ break; >+ >+ case 0x33: /* Touch */ >+ case 0x42: /* TipSwitch */ >+ case 0x43: /* TipSwitch2 */ >+ device->quirks &= ~HID_QUIRK_NOTOUCH; >+ map_key_clear(BTN_TOUCH); >+ break; >+ >+ case 0x44: /* BarrelSwitch */ >+ map_key_clear(BTN_STYLUS); >+ break; >+ >+ default: goto unknown; >+ } >+ break; >+ >+ case HID_UP_CONSUMER: /* USB HUT v1.1, pages 56-62 */ >+ >+ switch (usage->hid & HID_USAGE) { >+ case 0x000: goto ignore; >+ case 0x034: map_key_clear(KEY_SLEEP); break; >+ case 0x036: map_key_clear(BTN_MISC); break; >+ /* >+ * The next three are reported by Belkin wireless >+ * keyboard (1020:0006). These values are "reserved" >+ * in HUT 1.12. >+ */ >+ case 0x03a: map_key_clear(KEY_SOUND); break; >+ case 0x03b: map_key_clear(KEY_CAMERA); break; >+ case 0x03c: map_key_clear(KEY_DOCUMENTS); break; >+ >+ case 0x040: map_key_clear(KEY_MENU); break; >+ case 0x045: map_key_clear(KEY_RADIO); break; >+ >+ case 0x083: map_key_clear(KEY_LAST); break; >+ case 0x088: map_key_clear(KEY_PC); break; >+ case 0x089: map_key_clear(KEY_TV); break; >+ case 0x08a: map_key_clear(KEY_WWW); break; >+ case 0x08b: map_key_clear(KEY_DVD); break; >+ case 0x08c: map_key_clear(KEY_PHONE); break; >+ case 0x08d: map_key_clear(KEY_PROGRAM); break; >+ case 0x08e: map_key_clear(KEY_VIDEOPHONE); break; >+ case 0x08f: map_key_clear(KEY_GAMES); break; >+ case 0x090: map_key_clear(KEY_MEMO); break; >+ case 0x091: map_key_clear(KEY_CD); break; >+ case 0x092: map_key_clear(KEY_VCR); break; >+ case 0x093: map_key_clear(KEY_TUNER); break; >+ case 0x094: map_key_clear(KEY_EXIT); break; >+ case 0x095: map_key_clear(KEY_HELP); break; >+ case 0x096: map_key_clear(KEY_TAPE); break; >+ case 0x097: map_key_clear(KEY_TV2); break; >+ case 0x098: map_key_clear(KEY_SAT); break; >+ case 0x09a: map_key_clear(KEY_PVR); break; >+ >+ case 0x09c: map_key_clear(KEY_CHANNELUP); break; >+ case 0x09d: map_key_clear(KEY_CHANNELDOWN); break; >+ case 0x0a0: map_key_clear(KEY_VCR2); break; >+ >+ case 0x0b0: map_key_clear(KEY_PLAY); break; >+ case 0x0b1: map_key_clear(KEY_PAUSE); break; >+ case 0x0b2: map_key_clear(KEY_RECORD); break; >+ case 0x0b3: map_key_clear(KEY_FASTFORWARD); break; >+ case 0x0b4: map_key_clear(KEY_REWIND); break; >+ case 0x0b5: map_key_clear(KEY_NEXTSONG); break; >+ case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break; >+ case 0x0b7: map_key_clear(KEY_STOPCD); break; >+ case 0x0b8: map_key_clear(KEY_EJECTCD); break; >+ >+ case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break; >+ case 0x0e0: map_abs_clear(ABS_VOLUME); break; >+ case 0x0e2: map_key_clear(KEY_MUTE); break; >+ case 0x0e5: map_key_clear(KEY_BASSBOOST); break; >+ case 0x0e9: map_key_clear(KEY_VOLUMEUP); break; >+ case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break; >+ >+ /* reserved in HUT 1.12. Reported on Petalynx remote */ >+ case 0x0f6: map_key_clear(KEY_NEXT); break; >+ case 0x0fa: map_key_clear(KEY_BACK); break; >+ >+ case 0x183: map_key_clear(KEY_CONFIG); break; >+ case 0x184: map_key_clear(KEY_WORDPROCESSOR); break; >+ case 0x185: map_key_clear(KEY_EDITOR); break; >+ case 0x186: map_key_clear(KEY_SPREADSHEET); break; >+ case 0x187: map_key_clear(KEY_GRAPHICSEDITOR); break; >+ case 0x188: map_key_clear(KEY_PRESENTATION); break; >+ case 0x189: map_key_clear(KEY_DATABASE); break; >+ case 0x18a: map_key_clear(KEY_MAIL); break; >+ case 0x18b: map_key_clear(KEY_NEWS); break; >+ case 0x18c: map_key_clear(KEY_VOICEMAIL); break; >+ case 0x18d: map_key_clear(KEY_ADDRESSBOOK); break; >+ case 0x18e: map_key_clear(KEY_CALENDAR); break; >+ case 0x191: map_key_clear(KEY_FINANCE); break; >+ case 0x192: map_key_clear(KEY_CALC); break; >+ case 0x194: map_key_clear(KEY_FILE); break; >+ case 0x196: map_key_clear(KEY_WWW); break; >+ case 0x19e: map_key_clear(KEY_COFFEE); break; >+ case 0x1a6: map_key_clear(KEY_HELP); break; >+ case 0x1a7: map_key_clear(KEY_DOCUMENTS); break; >+ case 0x1bc: map_key_clear(KEY_MESSENGER); break; >+ case 0x1bd: map_key_clear(KEY_INFO); break; >+ case 0x201: map_key_clear(KEY_NEW); break; >+ case 0x202: map_key_clear(KEY_OPEN); break; >+ case 0x203: map_key_clear(KEY_CLOSE); break; >+ case 0x204: map_key_clear(KEY_EXIT); break; >+ case 0x207: map_key_clear(KEY_SAVE); break; >+ case 0x208: map_key_clear(KEY_PRINT); break; >+ case 0x209: map_key_clear(KEY_PROPS); break; >+ case 0x21a: map_key_clear(KEY_UNDO); break; >+ case 0x21b: map_key_clear(KEY_COPY); break; >+ case 0x21c: map_key_clear(KEY_CUT); break; >+ case 0x21d: map_key_clear(KEY_PASTE); break; >+ case 0x21f: map_key_clear(KEY_FIND); break; >+ case 0x221: map_key_clear(KEY_SEARCH); break; >+ case 0x222: map_key_clear(KEY_GOTO); break; >+ case 0x223: map_key_clear(KEY_HOMEPAGE); break; >+ case 0x224: map_key_clear(KEY_BACK); break; >+ case 0x225: map_key_clear(KEY_FORWARD); break; >+ case 0x226: map_key_clear(KEY_STOP); break; >+ case 0x227: map_key_clear(KEY_REFRESH); break; >+ case 0x22a: map_key_clear(KEY_BOOKMARKS); break; >+ case 0x22d: map_key_clear(KEY_ZOOMIN); break; >+ case 0x22e: map_key_clear(KEY_ZOOMOUT); break; >+ case 0x22f: map_key_clear(KEY_ZOOMRESET); break; >+ case 0x233: map_key_clear(KEY_SCROLLUP); break; >+ case 0x234: map_key_clear(KEY_SCROLLDOWN); break; >+ case 0x238: map_rel(REL_HWHEEL); break; >+ case 0x25f: map_key_clear(KEY_CANCEL); break; >+ case 0x279: map_key_clear(KEY_REDO); break; >+ >+ case 0x289: map_key_clear(KEY_REPLY); break; >+ case 0x28b: map_key_clear(KEY_FORWARDMAIL); break; >+ case 0x28c: map_key_clear(KEY_SEND); break; >+ >+ /* Reported on a Cherry Cymotion keyboard */ >+ case 0x301: map_key_clear(KEY_PROG1); break; >+ case 0x302: map_key_clear(KEY_PROG2); break; >+ case 0x303: map_key_clear(KEY_PROG3); break; >+ >+ /* Reported on certain Logitech wireless keyboards */ >+ case 0x1001: map_key_clear(KEY_MESSENGER); break; >+ case 0x1003: map_key_clear(KEY_SOUND); break; >+ case 0x1004: map_key_clear(KEY_VIDEO); break; >+ case 0x1005: map_key_clear(KEY_AUDIO); break; >+ case 0x100a: map_key_clear(KEY_DOCUMENTS); break; >+ case 0x1011: map_key_clear(KEY_PREVIOUSSONG); break; >+ case 0x1012: map_key_clear(KEY_NEXTSONG); break; >+ case 0x1013: map_key_clear(KEY_CAMERA); break; >+ case 0x1014: map_key_clear(KEY_MESSENGER); break; >+ case 0x1015: map_key_clear(KEY_RECORD); break; >+ case 0x1016: map_key_clear(KEY_PLAYER); break; >+ case 0x1017: map_key_clear(KEY_EJECTCD); break; >+ case 0x1018: map_key_clear(KEY_MEDIA); break; >+ case 0x1019: map_key_clear(KEY_PROG1); break; >+ case 0x101a: map_key_clear(KEY_PROG2); break; >+ case 0x101b: map_key_clear(KEY_PROG3); break; >+ case 0x101f: map_key_clear(KEY_ZOOMIN); break; >+ case 0x1020: map_key_clear(KEY_ZOOMOUT); break; >+ case 0x1021: map_key_clear(KEY_ZOOMRESET); break; >+ case 0x1023: map_key_clear(KEY_CLOSE); break; >+ case 0x1027: map_key_clear(KEY_MENU); break; >+ /* this one is marked as 'Rotate' */ >+ case 0x1028: map_key_clear(KEY_ANGLE); break; >+ case 0x1029: map_key_clear(KEY_SHUFFLE); break; >+ case 0x102a: map_key_clear(KEY_BACK); break; >+ case 0x102b: map_key_clear(KEY_CYCLEWINDOWS); break; >+ case 0x1041: map_key_clear(KEY_BATTERY); break; >+ case 0x1042: map_key_clear(KEY_WORDPROCESSOR); break; >+ case 0x1043: map_key_clear(KEY_SPREADSHEET); break; >+ case 0x1044: map_key_clear(KEY_PRESENTATION); break; >+ case 0x1045: map_key_clear(KEY_UNDO); break; >+ case 0x1046: map_key_clear(KEY_REDO); break; >+ case 0x1047: map_key_clear(KEY_PRINT); break; >+ case 0x1048: map_key_clear(KEY_SAVE); break; >+ case 0x1049: map_key_clear(KEY_PROG1); break; >+ case 0x104a: map_key_clear(KEY_PROG2); break; >+ case 0x104b: map_key_clear(KEY_PROG3); break; >+ case 0x104c: map_key_clear(KEY_PROG4); break; >+ >+ default: goto ignore; >+ } >+ break; >+ >+ case HID_UP_HPVENDOR: /* Reported on a Dutch layout HP5308 */ >+ >+ set_bit(EV_REP, input->evbit); >+ switch (usage->hid & HID_USAGE) { >+ case 0x021: map_key_clear(KEY_PRINT); break; >+ case 0x070: map_key_clear(KEY_HP); break; >+ case 0x071: map_key_clear(KEY_CAMERA); break; >+ case 0x072: map_key_clear(KEY_SOUND); break; >+ case 0x073: map_key_clear(KEY_QUESTION); break; >+ case 0x080: map_key_clear(KEY_EMAIL); break; >+ case 0x081: map_key_clear(KEY_CHAT); break; >+ case 0x082: map_key_clear(KEY_SEARCH); break; >+ case 0x083: map_key_clear(KEY_CONNECT); break; >+ case 0x084: map_key_clear(KEY_FINANCE); break; >+ case 0x085: map_key_clear(KEY_SPORT); break; >+ case 0x086: map_key_clear(KEY_SHOP); break; >+ default: goto ignore; >+ } >+ break; >+ >+ case HID_UP_MSVENDOR: >+ >+ /* special case - Chicony Chicony KU-0418 tactical pad */ >+ if (device->vendor == 0x04f2 && device->product == 0x0418) { >+ set_bit(EV_REP, input->evbit); >+ switch(usage->hid & HID_USAGE) { >+ case 0xff01: map_key_clear(BTN_1); break; >+ case 0xff02: map_key_clear(BTN_2); break; >+ case 0xff03: map_key_clear(BTN_3); break; >+ case 0xff04: map_key_clear(BTN_4); break; >+ case 0xff05: map_key_clear(BTN_5); break; >+ case 0xff06: map_key_clear(BTN_6); break; >+ case 0xff07: map_key_clear(BTN_7); break; >+ case 0xff08: map_key_clear(BTN_8); break; >+ case 0xff09: map_key_clear(BTN_9); break; >+ case 0xff0a: map_key_clear(BTN_A); break; >+ case 0xff0b: map_key_clear(BTN_B); break; >+ default: goto ignore; >+ } >+ } else { >+ goto ignore; >+ } >+ break; >+ >+ case HID_UP_CUSTOM: /* Reported on Logitech and Powerbook USB keyboards */ >+ >+ set_bit(EV_REP, input->evbit); >+ switch(usage->hid & HID_USAGE) { >+ case 0x003: >+ /* The fn key on Apple PowerBooks */ >+ map_key_clear(KEY_FN); >+ hidinput_pb_setup(input); >+ break; >+ >+ default: goto ignore; >+ } >+ break; >+ >+ case HID_UP_LOGIVENDOR: >+ set_bit(EV_REP, input->evbit); >+ switch(usage->hid & HID_USAGE) { >+ /* Reported on Logitech Ultra X Media Remote */ >+ case 0x004: map_key_clear(KEY_AGAIN); break; >+ case 0x00d: map_key_clear(KEY_HOME); break; >+ case 0x024: map_key_clear(KEY_SHUFFLE); break; >+ case 0x025: map_key_clear(KEY_TV); break; >+ case 0x026: map_key_clear(KEY_MENU); break; >+ case 0x031: map_key_clear(KEY_AUDIO); break; >+ case 0x032: map_key_clear(KEY_TEXT); break; >+ case 0x033: map_key_clear(KEY_LAST); break; >+ case 0x047: map_key_clear(KEY_MP3); break; >+ case 0x048: map_key_clear(KEY_DVD); break; >+ case 0x049: map_key_clear(KEY_MEDIA); break; >+ case 0x04a: map_key_clear(KEY_VIDEO); break; >+ case 0x04b: map_key_clear(KEY_ANGLE); break; >+ case 0x04c: map_key_clear(KEY_LANGUAGE); break; >+ case 0x04d: map_key_clear(KEY_SUBTITLE); break; >+ case 0x051: map_key_clear(KEY_RED); break; >+ case 0x052: map_key_clear(KEY_CLOSE); break; >+ >+ /* Reported on Petalynx Maxter remote */ >+ case 0x05a: map_key_clear(KEY_TEXT); break; >+ case 0x05b: map_key_clear(KEY_RED); break; >+ case 0x05c: map_key_clear(KEY_GREEN); break; >+ case 0x05d: map_key_clear(KEY_YELLOW); break; >+ case 0x05e: map_key_clear(KEY_BLUE); break; >+ >+ default: goto ignore; >+ } >+ break; >+ >+ case HID_UP_PID: >+ >+ switch(usage->hid & HID_USAGE) { >+ case 0xa4: map_key_clear(BTN_DEAD); break; >+ default: goto ignore; >+ } >+ break; >+ >+ default: >+ unknown: >+ if (field->report_size == 1) { >+ if (field->report->type == HID_OUTPUT_REPORT) { >+ map_led(LED_MISC); >+ break; >+ } >+ map_key(BTN_MISC); >+ break; >+ } >+ if (field->flags & HID_MAIN_ITEM_RELATIVE) { >+ map_rel(REL_MISC); >+ break; >+ } >+ map_abs(ABS_MISC); >+ break; >+ } >+ >+ if (device->quirks & HID_QUIRK_MIGHTYMOUSE) { >+ if (usage->hid == HID_GD_Z) >+ map_rel(REL_HWHEEL); >+ else if (usage->code == BTN_1) >+ map_key(BTN_2); >+ else if (usage->code == BTN_2) >+ map_key(BTN_1); >+ } >+ >+ if ((device->quirks & (HID_QUIRK_2WHEEL_MOUSE_HACK_7 | HID_QUIRK_2WHEEL_MOUSE_HACK_5)) && >+ (usage->type == EV_REL) && (usage->code == REL_WHEEL)) >+ set_bit(REL_HWHEEL, bit); >+ >+ if (((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005)) >+ || ((device->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) >+ goto ignore; >+ >+ if ((device->quirks & HID_QUIRK_BAD_RELATIVE_KEYS) && >+ usage->type == EV_KEY && (field->flags & HID_MAIN_ITEM_RELATIVE)) >+ field->flags &= ~HID_MAIN_ITEM_RELATIVE; >+ >+ set_bit(usage->type, input->evbit); >+ >+ if (device->quirks & HID_QUIRK_DUPLICATE_USAGES && >+ (usage->type == EV_KEY || >+ usage->type == EV_REL || >+ usage->type == EV_ABS)) >+ clear_bit(usage->code, bit); >+ >+ while (usage->code <= max && test_and_set_bit(usage->code, bit)) >+ usage->code = find_next_zero_bit(bit, max + 1, usage->code); >+ >+ if (usage->code > max) >+ goto ignore; >+ >+ >+ if (usage->type == EV_ABS) { >+ >+ int a = field->logical_minimum; >+ int b = field->logical_maximum; >+ >+ if ((device->quirks & HID_QUIRK_BADPAD) && (usage->code == ABS_X || usage->code == ABS_Y)) { >+ a = field->logical_minimum = 0; >+ b = field->logical_maximum = 255; >+ } >+ >+ if (field->application == HID_GD_GAMEPAD || field->application == HID_GD_JOYSTICK) >+ input_set_abs_params(input, usage->code, a, b, (b - a) >> 8, (b - a) >> 4); >+ else input_set_abs_params(input, usage->code, a, b, 0, 0); >+ >+ } >+ >+ if (usage->type == EV_ABS && >+ (usage->hat_min < usage->hat_max || usage->hat_dir)) { >+ int i; >+ for (i = usage->code; i < usage->code + 2 && i <= max; i++) { >+ input_set_abs_params(input, i, -1, 1, 0, 0); >+ set_bit(i, input->absbit); >+ } >+ if (usage->hat_dir && !field->dpad) >+ field->dpad = usage->code; >+ } >+ >+ /* for those devices which produce Consumer volume usage as relative, >+ * we emulate pressing volumeup/volumedown appropriate number of times >+ * in hidinput_hid_event() >+ */ >+ if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) && >+ (usage->code == ABS_VOLUME)) { >+ set_bit(KEY_VOLUMEUP, input->keybit); >+ set_bit(KEY_VOLUMEDOWN, input->keybit); >+ } >+ >+ hid_resolv_event(usage->type, usage->code); >+ >+ dbg_hid_line("\n"); >+ >+ return; >+ >+ignore: >+ dbg_hid_line("IGNORED\n"); >+ return; >+} >+ >+void hidinput_hid_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) >+{ >+ struct input_dev *input; >+ int *quirks = &hid->quirks; >+ >+ if (!field->hidinput) >+ return; >+ >+ input = field->hidinput->input; >+ >+ if (!usage->type) >+ return; >+ >+ if (((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_5) && (usage->hid == 0x00090005)) >+ || ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_7) && (usage->hid == 0x00090007))) { >+ if (value) hid->quirks |= HID_QUIRK_2WHEEL_MOUSE_HACK_ON; >+ else hid->quirks &= ~HID_QUIRK_2WHEEL_MOUSE_HACK_ON; >+ return; >+ } >+ >+ if ((hid->quirks & HID_QUIRK_INVERT_HWHEEL) && (usage->code == REL_HWHEEL)) { >+ input_event(input, usage->type, usage->code, -value); >+ return; >+ } >+ >+ if ((hid->quirks & HID_QUIRK_2WHEEL_MOUSE_HACK_ON) && (usage->code == REL_WHEEL)) { >+ input_event(input, usage->type, REL_HWHEEL, value); >+ return; >+ } >+ >+ if ((hid->quirks & HID_QUIRK_POWERBOOK_HAS_FN) && hidinput_pb_event(hid, input, usage, value)) >+ return; >+ >+ if (usage->hat_min < usage->hat_max || usage->hat_dir) { >+ int hat_dir = usage->hat_dir; >+ if (!hat_dir) >+ hat_dir = (value - usage->hat_min) * 8 / (usage->hat_max - usage->hat_min + 1) + 1; >+ if (hat_dir < 0 || hat_dir > 8) hat_dir = 0; >+ input_event(input, usage->type, usage->code , hid_hat_to_axis[hat_dir].x); >+ input_event(input, usage->type, usage->code + 1, hid_hat_to_axis[hat_dir].y); >+ return; >+ } >+ >+ if (usage->hid == (HID_UP_DIGITIZER | 0x003c)) { /* Invert */ >+ *quirks = value ? (*quirks | HID_QUIRK_INVERT) : (*quirks & ~HID_QUIRK_INVERT); >+ return; >+ } >+ >+ if (usage->hid == (HID_UP_DIGITIZER | 0x0032)) { /* InRange */ >+ if (value) { >+ input_event(input, usage->type, (*quirks & HID_QUIRK_INVERT) ? BTN_TOOL_RUBBER : usage->code, 1); >+ return; >+ } >+ input_event(input, usage->type, usage->code, 0); >+ input_event(input, usage->type, BTN_TOOL_RUBBER, 0); >+ return; >+ } >+ >+ if (usage->hid == (HID_UP_DIGITIZER | 0x0030) && (*quirks & HID_QUIRK_NOTOUCH)) { /* Pressure */ >+ int a = field->logical_minimum; >+ int b = field->logical_maximum; >+ input_event(input, EV_KEY, BTN_TOUCH, value > a + ((b - a) >> 3)); >+ } >+ >+ if (usage->hid == (HID_UP_PID | 0x83UL)) { /* Simultaneous Effects Max */ >+ dbg_hid("Maximum Effects - %d\n",value); >+ return; >+ } >+ >+ if (usage->hid == (HID_UP_PID | 0x7fUL)) { >+ dbg_hid("PID Pool Report\n"); >+ return; >+ } >+ >+ if ((usage->type == EV_KEY) && (usage->code == 0)) /* Key 0 is "unassigned", not KEY_UNKNOWN */ >+ return; >+ >+ if ((usage->type == EV_ABS) && (field->flags & HID_MAIN_ITEM_RELATIVE) && >+ (usage->code == ABS_VOLUME)) { >+ int count = abs(value); >+ int direction = value > 0 ? KEY_VOLUMEUP : KEY_VOLUMEDOWN; >+ int i; >+ >+ for (i = 0; i < count; i++) { >+ input_event(input, EV_KEY, direction, 1); >+ input_sync(input); >+ input_event(input, EV_KEY, direction, 0); >+ input_sync(input); >+ } >+ return; >+ } >+ >+ input_event(input, usage->type, usage->code, value); >+ >+ if ((field->flags & HID_MAIN_ITEM_RELATIVE) && (usage->type == EV_KEY)) >+ input_event(input, usage->type, usage->code, 0); >+} >+ >+void hidinput_report_event(struct hid_device *hid, struct hid_report *report) >+{ >+ struct hid_input *hidinput; >+ >+ list_for_each_entry(hidinput, &hid->inputs, list) >+ input_sync(hidinput->input); >+} >+EXPORT_SYMBOL_GPL(hidinput_report_event); >+ >+int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field) >+{ >+ struct hid_report *report; >+ int i, j; >+ >+ list_for_each_entry(report, &hid->report_enum[HID_OUTPUT_REPORT].report_list, list) { >+ for (i = 0; i < report->maxfield; i++) { >+ *field = report->field[i]; >+ for (j = 0; j < (*field)->maxusage; j++) >+ if ((*field)->usage[j].type == type && (*field)->usage[j].code == code) >+ return j; >+ } >+ } >+ return -1; >+} >+EXPORT_SYMBOL_GPL(hidinput_find_field); >+ >+static int hidinput_open(struct input_dev *dev) >+{ >+ struct hid_device *hid = input_get_drvdata(dev); >+ >+ return hid->hid_open(hid); >+} >+ >+static void hidinput_close(struct input_dev *dev) >+{ >+ struct hid_device *hid = input_get_drvdata(dev); >+ >+ hid->hid_close(hid); >+} >+ >+/* >+ * Register the input device; print a message. >+ * Configure the input layer interface >+ * Read all reports and initialize the absolute field values. >+ */ >+ >+int hidinput_connect(struct hid_device *hid) >+{ >+ struct hid_report *report; >+ struct hid_input *hidinput = NULL; >+ struct input_dev *input_dev; >+ int i, j, k; >+ int max_report_type = HID_OUTPUT_REPORT; >+ >+ INIT_LIST_HEAD(&hid->inputs); >+ >+ for (i = 0; i < hid->maxcollection; i++) >+ if (hid->collection[i].type == HID_COLLECTION_APPLICATION || >+ hid->collection[i].type == HID_COLLECTION_PHYSICAL) >+ if (IS_INPUT_APPLICATION(hid->collection[i].usage)) >+ break; >+ >+ if (i == hid->maxcollection && (hid->quirks & HID_QUIRK_HIDINPUT) == 0) >+ return -1; >+ >+ if (hid->quirks & HID_QUIRK_SKIP_OUTPUT_REPORTS) >+ max_report_type = HID_INPUT_REPORT; >+ >+ for (k = HID_INPUT_REPORT; k <= max_report_type; k++) >+ list_for_each_entry(report, &hid->report_enum[k].report_list, list) { >+ >+ if (!report->maxfield) >+ continue; >+ >+ if (!hidinput) { >+ hidinput = kzalloc(sizeof(*hidinput), GFP_KERNEL); >+ input_dev = input_allocate_device(); >+ if (!hidinput || !input_dev) { >+ kfree(hidinput); >+ input_free_device(input_dev); >+ err_hid("Out of memory during hid input probe"); >+ return -1; >+ } >+ >+ input_set_drvdata(input_dev, hid); >+ input_dev->event = hid->hidinput_input_event; >+ input_dev->open = hidinput_open; >+ input_dev->close = hidinput_close; >+ input_dev->setkeycode = hidinput_setkeycode; >+ input_dev->getkeycode = hidinput_getkeycode; >+ >+ input_dev->name = hid->name; >+ input_dev->phys = hid->phys; >+ input_dev->uniq = hid->uniq; >+ input_dev->id.bustype = hid->bus; >+ input_dev->id.vendor = hid->vendor; >+ input_dev->id.product = hid->product; >+ input_dev->id.version = hid->version; >+ input_dev->dev.parent = hid->dev; >+ hidinput->input = input_dev; >+ list_add_tail(&hidinput->list, &hid->inputs); >+ } >+ >+ for (i = 0; i < report->maxfield; i++) >+ for (j = 0; j < report->field[i]->maxusage; j++) >+ hidinput_configure_usage(hidinput, report->field[i], >+ report->field[i]->usage + j); >+ >+ if (hid->quirks & HID_QUIRK_MULTI_INPUT) { >+ /* This will leave hidinput NULL, so that it >+ * allocates another one if we have more inputs on >+ * the same interface. Some devices (e.g. Happ's >+ * UGCI) cram a lot of unrelated inputs into the >+ * same interface. */ >+ hidinput->report = report; >+ input_register_device(hidinput->input); >+ hidinput = NULL; >+ } >+ } >+ >+ if (hidinput) >+ input_register_device(hidinput->input); >+ >+ return 0; >+} >+EXPORT_SYMBOL_GPL(hidinput_connect); >+ >+void hidinput_disconnect(struct hid_device *hid) >+{ >+ struct hid_input *hidinput, *next; >+ >+ list_for_each_entry_safe(hidinput, next, &hid->inputs, list) { >+ list_del(&hidinput->list); >+ input_unregister_device(hidinput->input); >+ kfree(hidinput); >+ } >+} >+EXPORT_SYMBOL_GPL(hidinput_disconnect); >+ >diff -uNrp kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/hid/usbhid/hid-quirks.c kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/hid/usbhid/hid-quirks.c >--- kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/hid/usbhid/hid-quirks.c 2007-12-22 15:37:48.000000000 +0000 >+++ kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/hid/usbhid/hid-quirks.c 2007-12-22 15:53:22.000000000 +0000 >@@ -59,6 +59,22 @@ > #define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a > #define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b > #define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c >+ >+/* Apple 2007 Wired keyboards */ >+#define USB_DEVICE_ID_APPLE_KEYBOARD_ANSI 0x0220 >+#define USB_DEVICE_ID_APPLE_KEYBOARD_ISO 0x0221 >+#define USB_DEVICE_ID_APPLE_KEYBOARD_JIS 0x0222 >+ >+/* macbook3,1 keyboards */ >+#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI 0x0229 >+#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO 0x022a >+#define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS 0x022b >+ >+/* Apple 2007 Wireless keyboards */ >+#define USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_ANSI 0x022c >+#define USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_ISO 0x022d >+#define USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_JIS 0x022e >+ > #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a > #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b > >@@ -527,6 +543,22 @@ static const struct hid_blacklist { > { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, > { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, > { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ >+ /* Apple 2007 Wired keyboards */ >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_KEYBOARD_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_KEYBOARD_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_KEYBOARD_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, >+ >+ /* macbook3,1 keyboards */ >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, >+ >+ /* Apple 2007 Wireless keyboards */ >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_WIRELESS_KEYBOARD_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_APPLE_KEYBOARD}, >+ > { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, > { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, > >diff -uNrp kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/hid/usbhid/hid-quirks.c.orig kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/hid/usbhid/hid-quirks.c.orig >--- kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/hid/usbhid/hid-quirks.c.orig 1970-01-01 01:00:00.000000000 +0100 >+++ kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/hid/usbhid/hid-quirks.c.orig 2007-12-22 15:37:48.000000000 +0000 >@@ -0,0 +1,983 @@ >+/* >+ * USB HID quirks support for Linux >+ * >+ * Copyright (c) 1999 Andreas Gal >+ * Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@suse.cz> >+ * Copyright (c) 2005 Michael Haboustak <mike-@cinci.rr.com> for Concept2, Inc >+ * Copyright (c) 2006-2007 Jiri Kosina >+ * Copyright (c) 2007 Paul Walmsley >+ */ >+ >+/* >+ * This program is free software; you can redistribute it and/or modify it >+ * under the terms of the GNU General Public License as published by the Free >+ * Software Foundation; either version 2 of the License, or (at your option) >+ * any later version. >+ */ >+ >+#include <linux/hid.h> >+ >+#define USB_VENDOR_ID_A4TECH 0x09da >+#define USB_DEVICE_ID_A4TECH_WCP32PU 0x0006 >+ >+#define USB_VENDOR_ID_AASHIMA 0x06d6 >+#define USB_DEVICE_ID_AASHIMA_GAMEPAD 0x0025 >+#define USB_DEVICE_ID_AASHIMA_PREDATOR 0x0026 >+ >+#define USB_VENDOR_ID_ACECAD 0x0460 >+#define USB_DEVICE_ID_ACECAD_FLAIR 0x0004 >+#define USB_DEVICE_ID_ACECAD_302 0x0008 >+ >+#define USB_VENDOR_ID_AIPTEK 0x08ca >+#define USB_DEVICE_ID_AIPTEK_01 0x0001 >+#define USB_DEVICE_ID_AIPTEK_10 0x0010 >+#define USB_DEVICE_ID_AIPTEK_20 0x0020 >+#define USB_DEVICE_ID_AIPTEK_21 0x0021 >+#define USB_DEVICE_ID_AIPTEK_22 0x0022 >+#define USB_DEVICE_ID_AIPTEK_23 0x0023 >+#define USB_DEVICE_ID_AIPTEK_24 0x0024 >+ >+#define USB_VENDOR_ID_AIRCABLE 0x16CA >+#define USB_DEVICE_ID_AIRCABLE1 0x1502 >+ >+#define USB_VENDOR_ID_ALCOR 0x058f >+#define USB_DEVICE_ID_ALCOR_USBRS232 0x9720 >+ >+#define USB_VENDOR_ID_ALPS 0x0433 >+#define USB_DEVICE_ID_IBM_GAMEPAD 0x1101 >+ >+#define USB_VENDOR_ID_APPLE 0x05ac >+#define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 >+#define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e >+#define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f >+#define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214 >+#define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215 >+#define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216 >+#define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217 >+#define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218 >+#define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219 >+#define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a >+#define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b >+#define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c >+#define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a >+#define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b >+ >+#define USB_VENDOR_ID_ASUS 0x0b05 >+#define USB_DEVICE_ID_ASUS_LCM 0x1726 >+ >+#define USB_VENDOR_ID_ATEN 0x0557 >+#define USB_DEVICE_ID_ATEN_UC100KM 0x2004 >+#define USB_DEVICE_ID_ATEN_CS124U 0x2202 >+#define USB_DEVICE_ID_ATEN_2PORTKVM 0x2204 >+#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205 >+#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208 >+ >+#define USB_VENDOR_ID_BELKIN 0x050d >+#define USB_DEVICE_ID_FLIP_KVM 0x3201 >+ >+#define USB_VENDOR_ID_BERKSHIRE 0x0c98 >+#define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140 >+ >+#define USB_VENDOR_ID_CHERRY 0x046a >+#define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 >+ >+#define USB_VENDOR_ID_CHIC 0x05fe >+#define USB_DEVICE_ID_CHIC_GAMEPAD 0x0014 >+ >+#define USB_VENDOR_ID_CIDC 0x1677 >+ >+#define USB_VENDOR_ID_CODEMERCS 0x07c0 >+#define USB_DEVICE_ID_CODEMERCS_IOW_FIRST 0x1500 >+#define USB_DEVICE_ID_CODEMERCS_IOW_LAST 0x15ff >+ >+#define USB_VENDOR_ID_CYPRESS 0x04b4 >+#define USB_DEVICE_ID_CYPRESS_MOUSE 0x0001 >+#define USB_DEVICE_ID_CYPRESS_HIDCOM 0x5500 >+#define USB_DEVICE_ID_CYPRESS_ULTRAMOUSE 0x7417 >+#define USB_DEVICE_ID_CYPRESS_BARCODE_1 0xde61 >+#define USB_DEVICE_ID_CYPRESS_BARCODE_2 0xde64 >+ >+#define USB_VENDOR_ID_DELL 0x413c >+#define USB_DEVICE_ID_DELL_W7658 0x2005 >+ >+#define USB_VENDOR_ID_DELORME 0x1163 >+#define USB_DEVICE_ID_DELORME_EARTHMATE 0x0100 >+#define USB_DEVICE_ID_DELORME_EM_LT20 0x0200 >+ >+#define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f >+#define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100 >+ >+#define USB_VENDOR_ID_GAMERON 0x0810 >+#define USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR 0x0001 >+ >+#define USB_VENDOR_ID_GLAB 0x06c2 >+#define USB_DEVICE_ID_4_PHIDGETSERVO_30 0x0038 >+#define USB_DEVICE_ID_1_PHIDGETSERVO_30 0x0039 >+#define USB_DEVICE_ID_0_0_4_IF_KIT 0x0040 >+#define USB_DEVICE_ID_0_16_16_IF_KIT 0x0044 >+#define USB_DEVICE_ID_8_8_8_IF_KIT 0x0045 >+#define USB_DEVICE_ID_0_8_7_IF_KIT 0x0051 >+#define USB_DEVICE_ID_0_8_8_IF_KIT 0x0053 >+#define USB_DEVICE_ID_PHIDGET_MOTORCONTROL 0x0058 >+ >+#define USB_VENDOR_ID_GRIFFIN 0x077d >+#define USB_DEVICE_ID_POWERMATE 0x0410 >+#define USB_DEVICE_ID_SOUNDKNOB 0x04AA >+ >+#define USB_VENDOR_ID_GTCO 0x078c >+#define USB_DEVICE_ID_GTCO_90 0x0090 >+#define USB_DEVICE_ID_GTCO_100 0x0100 >+#define USB_DEVICE_ID_GTCO_101 0x0101 >+#define USB_DEVICE_ID_GTCO_103 0x0103 >+#define USB_DEVICE_ID_GTCO_104 0x0104 >+#define USB_DEVICE_ID_GTCO_105 0x0105 >+#define USB_DEVICE_ID_GTCO_106 0x0106 >+#define USB_DEVICE_ID_GTCO_107 0x0107 >+#define USB_DEVICE_ID_GTCO_108 0x0108 >+#define USB_DEVICE_ID_GTCO_200 0x0200 >+#define USB_DEVICE_ID_GTCO_201 0x0201 >+#define USB_DEVICE_ID_GTCO_202 0x0202 >+#define USB_DEVICE_ID_GTCO_203 0x0203 >+#define USB_DEVICE_ID_GTCO_204 0x0204 >+#define USB_DEVICE_ID_GTCO_205 0x0205 >+#define USB_DEVICE_ID_GTCO_206 0x0206 >+#define USB_DEVICE_ID_GTCO_207 0x0207 >+#define USB_DEVICE_ID_GTCO_300 0x0300 >+#define USB_DEVICE_ID_GTCO_301 0x0301 >+#define USB_DEVICE_ID_GTCO_302 0x0302 >+#define USB_DEVICE_ID_GTCO_303 0x0303 >+#define USB_DEVICE_ID_GTCO_304 0x0304 >+#define USB_DEVICE_ID_GTCO_305 0x0305 >+#define USB_DEVICE_ID_GTCO_306 0x0306 >+#define USB_DEVICE_ID_GTCO_307 0x0307 >+#define USB_DEVICE_ID_GTCO_308 0x0308 >+#define USB_DEVICE_ID_GTCO_309 0x0309 >+#define USB_DEVICE_ID_GTCO_400 0x0400 >+#define USB_DEVICE_ID_GTCO_401 0x0401 >+#define USB_DEVICE_ID_GTCO_402 0x0402 >+#define USB_DEVICE_ID_GTCO_403 0x0403 >+#define USB_DEVICE_ID_GTCO_404 0x0404 >+#define USB_DEVICE_ID_GTCO_405 0x0405 >+#define USB_DEVICE_ID_GTCO_500 0x0500 >+#define USB_DEVICE_ID_GTCO_501 0x0501 >+#define USB_DEVICE_ID_GTCO_502 0x0502 >+#define USB_DEVICE_ID_GTCO_503 0x0503 >+#define USB_DEVICE_ID_GTCO_504 0x0504 >+#define USB_DEVICE_ID_GTCO_1000 0x1000 >+#define USB_DEVICE_ID_GTCO_1001 0x1001 >+#define USB_DEVICE_ID_GTCO_1002 0x1002 >+#define USB_DEVICE_ID_GTCO_1003 0x1003 >+#define USB_DEVICE_ID_GTCO_1004 0x1004 >+#define USB_DEVICE_ID_GTCO_1005 0x1005 >+#define USB_DEVICE_ID_GTCO_1006 0x1006 >+ >+#define USB_VENDOR_ID_HAPP 0x078b >+#define USB_DEVICE_ID_UGCI_DRIVING 0x0010 >+#define USB_DEVICE_ID_UGCI_FLYING 0x0020 >+#define USB_DEVICE_ID_UGCI_FIGHTING 0x0030 >+ >+#define USB_VENDOR_ID_IMATION 0x0718 >+#define USB_DEVICE_ID_DISC_STAKKA 0xd000 >+ >+#define USB_VENDOR_ID_KBGEAR 0x084e >+#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 >+ >+#define USB_VENDOR_ID_LD 0x0f11 >+#define USB_DEVICE_ID_LD_CASSY 0x1000 >+#define USB_DEVICE_ID_LD_POCKETCASSY 0x1010 >+#define USB_DEVICE_ID_LD_MOBILECASSY 0x1020 >+#define USB_DEVICE_ID_LD_JWM 0x1080 >+#define USB_DEVICE_ID_LD_DMMP 0x1081 >+#define USB_DEVICE_ID_LD_UMIP 0x1090 >+#define USB_DEVICE_ID_LD_XRAY1 0x1100 >+#define USB_DEVICE_ID_LD_XRAY2 0x1101 >+#define USB_DEVICE_ID_LD_VIDEOCOM 0x1200 >+#define USB_DEVICE_ID_LD_COM3LAB 0x2000 >+#define USB_DEVICE_ID_LD_TELEPORT 0x2010 >+#define USB_DEVICE_ID_LD_NETWORKANALYSER 0x2020 >+#define USB_DEVICE_ID_LD_POWERCONTROL 0x2030 >+#define USB_DEVICE_ID_LD_MACHINETEST 0x2040 >+ >+#define USB_VENDOR_ID_LOGITECH 0x046d >+#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101 >+#define USB_DEVICE_ID_LOGITECH_HARMONY 0xc110 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_2 0xc111 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_3 0xc112 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_4 0xc113 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_5 0xc114 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_6 0xc115 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_7 0xc116 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_8 0xc117 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_9 0xc118 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_10 0xc119 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_11 0xc11a >+#define USB_DEVICE_ID_LOGITECH_HARMONY_12 0xc11b >+#define USB_DEVICE_ID_LOGITECH_HARMONY_13 0xc11c >+#define USB_DEVICE_ID_LOGITECH_HARMONY_14 0xc11d >+#define USB_DEVICE_ID_LOGITECH_HARMONY_15 0xc11e >+#define USB_DEVICE_ID_LOGITECH_HARMONY_16 0xc11f >+#define USB_DEVICE_ID_LOGITECH_HARMONY_17 0xc120 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_18 0xc121 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_19 0xc122 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_20 0xc123 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_21 0xc124 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_22 0xc125 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_23 0xc126 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_24 0xc127 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_25 0xc128 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_26 0xc129 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_27 0xc12a >+#define USB_DEVICE_ID_LOGITECH_HARMONY_28 0xc12b >+#define USB_DEVICE_ID_LOGITECH_HARMONY_29 0xc12c >+#define USB_DEVICE_ID_LOGITECH_HARMONY_30 0xc12d >+#define USB_DEVICE_ID_LOGITECH_HARMONY_31 0xc12e >+#define USB_DEVICE_ID_LOGITECH_HARMONY_32 0xc12f >+#define USB_DEVICE_ID_LOGITECH_HARMONY_33 0xc130 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_34 0xc131 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_35 0xc132 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_36 0xc133 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_37 0xc134 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_38 0xc135 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_39 0xc136 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_40 0xc137 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_41 0xc138 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_42 0xc139 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_43 0xc13a >+#define USB_DEVICE_ID_LOGITECH_HARMONY_44 0xc13b >+#define USB_DEVICE_ID_LOGITECH_HARMONY_45 0xc13c >+#define USB_DEVICE_ID_LOGITECH_HARMONY_46 0xc13d >+#define USB_DEVICE_ID_LOGITECH_HARMONY_47 0xc13e >+#define USB_DEVICE_ID_LOGITECH_HARMONY_48 0xc13f >+#define USB_DEVICE_ID_LOGITECH_HARMONY_49 0xc140 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_50 0xc141 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_51 0xc142 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_52 0xc143 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_53 0xc144 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_54 0xc145 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_55 0xc146 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_56 0xc147 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_57 0xc148 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_58 0xc149 >+#define USB_DEVICE_ID_LOGITECH_HARMONY_59 0xc14a >+#define USB_DEVICE_ID_LOGITECH_HARMONY_60 0xc14b >+#define USB_DEVICE_ID_LOGITECH_HARMONY_61 0xc14c >+#define USB_DEVICE_ID_LOGITECH_HARMONY_62 0xc14d >+#define USB_DEVICE_ID_LOGITECH_HARMONY_63 0xc14e >+#define USB_DEVICE_ID_LOGITECH_HARMONY_64 0xc14f >+#define USB_DEVICE_ID_LOGITECH_WHEEL 0xc294 >+#define USB_DEVICE_ID_LOGITECH_KBD 0xc311 >+#define USB_DEVICE_ID_S510_RECEIVER 0xc50c >+#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517 >+#define USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500 0xc512 >+#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513 >+#define USB_DEVICE_ID_DINOVO_EDGE 0xc714 >+ >+#define USB_VENDOR_ID_MCC 0x09db >+#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076 >+#define USB_DEVICE_ID_MCC_PMD1208LS 0x007a >+ >+#define USB_VENDOR_ID_MGE 0x0463 >+#define USB_DEVICE_ID_MGE_UPS 0xffff >+#define USB_DEVICE_ID_MGE_UPS1 0x0001 >+ >+#define USB_VENDOR_ID_MICROSOFT 0x045e >+#define USB_DEVICE_ID_SIDEWINDER_GV 0x003b >+ >+#define USB_VENDOR_ID_NCR 0x0404 >+#define USB_DEVICE_ID_NCR_FIRST 0x0300 >+#define USB_DEVICE_ID_NCR_LAST 0x03ff >+ >+#define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400 >+#define USB_DEVICE_ID_N_S_HARMONY 0xc359 >+ >+#define USB_VENDOR_ID_NEC 0x073e >+#define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301 >+ >+#define USB_VENDOR_ID_ONTRAK 0x0a07 >+#define USB_DEVICE_ID_ONTRAK_ADU100 0x0064 >+ >+#define USB_VENDOR_ID_PANJIT 0x134c >+ >+#define USB_VENDOR_ID_PANTHERLORD 0x0810 >+#define USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK 0x0001 >+ >+#define USB_VENDOR_ID_PETALYNX 0x18b1 >+#define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037 >+ >+#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43 >+#define USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII 0x0003 >+ >+#define USB_VENDOR_ID_SAITEK 0x06a3 >+#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17 >+ >+#define USB_VENDOR_ID_SONY 0x054c >+#define USB_DEVICE_ID_SONY_PS3_CONTROLLER 0x0268 >+ >+#define USB_VENDOR_ID_SUN 0x0430 >+#define USB_DEVICE_ID_RARITAN_KVM_DONGLE 0xcdab >+ >+#define USB_VENDOR_ID_TOPMAX 0x0663 >+#define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103 >+ >+#define USB_VENDOR_ID_TURBOX 0x062a >+#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201 >+ >+#define USB_VENDOR_ID_VERNIER 0x08f7 >+#define USB_DEVICE_ID_VERNIER_LABPRO 0x0001 >+#define USB_DEVICE_ID_VERNIER_GOTEMP 0x0002 >+#define USB_DEVICE_ID_VERNIER_SKIP 0x0003 >+#define USB_DEVICE_ID_VERNIER_CYCLOPS 0x0004 >+ >+#define USB_VENDOR_ID_WACOM 0x056a >+ >+#define USB_VENDOR_ID_WISEGROUP 0x0925 >+#define USB_DEVICE_ID_1_PHIDGETSERVO_20 0x8101 >+#define USB_DEVICE_ID_4_PHIDGETSERVO_20 0x8104 >+#define USB_DEVICE_ID_8_8_4_IF_KIT 0x8201 >+#define USB_DEVICE_ID_QUAD_USB_JOYPAD 0x8800 >+#define USB_DEVICE_ID_DUAL_USB_JOYPAD 0x8866 >+ >+#define USB_VENDOR_ID_WISEGROUP_LTD 0x6677 >+#define USB_DEVICE_ID_SMARTJOY_DUAL_PLUS 0x8802 >+ >+#define USB_VENDOR_ID_YEALINK 0x6993 >+#define USB_DEVICE_ID_YEALINK_P1K_P4K_B2K 0xb001 >+ >+/* >+ * Alphabetically sorted blacklist by quirk type. >+ */ >+ >+static const struct hid_blacklist { >+ __u16 idVendor; >+ __u16 idProduct; >+ __u32 quirks; >+} hid_blacklist[] = { >+ >+ { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, >+ { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 }, >+ >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER, HID_QUIRK_BAD_RELATIVE_KEYS }, >+ >+ { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD }, >+ { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD }, >+ { USB_VENDOR_ID_ALPS, USB_DEVICE_ID_IBM_GAMEPAD, HID_QUIRK_BADPAD }, >+ { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD }, >+ { USB_VENDOR_ID_GAMERON, USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR, HID_QUIRK_MULTI_INPUT }, >+ { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, >+ { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, >+ { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, >+ { USB_VENDOR_ID_NEC, USB_DEVICE_ID_NEC_USB_GAME_PAD, HID_QUIRK_BADPAD }, >+ { USB_VENDOR_ID_SAITEK, USB_DEVICE_ID_SAITEK_RUMBLEPAD, HID_QUIRK_BADPAD }, >+ { USB_VENDOR_ID_TOPMAX, USB_DEVICE_ID_TOPMAX_COBRAPAD, HID_QUIRK_BADPAD }, >+ >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_DINOVO_EDGE, HID_QUIRK_DUPLICATE_USAGES }, >+ >+ { USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV }, >+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT }, >+ >+ { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_01, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_10, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_20, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_21, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_22, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_23, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_AIPTEK, USB_DEVICE_ID_AIPTEK_24, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_AIRCABLE, USB_DEVICE_ID_AIRCABLE1, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_USBRS232, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_LCM, HID_QUIRK_IGNORE}, >+ { USB_VENDOR_ID_BERKSHIRE, USB_DEVICE_ID_BERKSHIRE_PCWD, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_CIDC, 0x0103, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_HIDCOM, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_ULTRAMOUSE, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EARTHMATE, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_DELORME, USB_DEVICE_ID_DELORME_EM_LT20, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ESSENTIAL_REALITY, USB_DEVICE_ID_ESSENTIAL_REALITY_P5, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_4_PHIDGETSERVO_30, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_1_PHIDGETSERVO_30, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_0_4_IF_KIT, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_16_16_IF_KIT, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_8_8_8_IF_KIT, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_7_IF_KIT, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_0_8_8_IF_KIT, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GLAB, USB_DEVICE_ID_PHIDGET_MOTORCONTROL, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_POWERMATE, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GRIFFIN, USB_DEVICE_ID_SOUNDKNOB, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_90, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_100, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_101, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_103, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_104, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_105, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_106, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_107, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_108, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_200, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_201, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_202, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_203, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_204, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_205, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_206, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_207, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_300, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_301, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_302, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_303, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_304, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_305, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_306, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_307, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_308, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_309, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_400, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_401, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_402, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_403, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_404, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_405, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_500, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_501, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_502, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_503, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_504, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1000, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1001, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1002, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1003, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1004, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MOBILECASSY, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_JWM, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_DMMP, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_UMIP, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY1, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_XRAY2, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_VIDEOCOM, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_COM3LAB, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_TELEPORT, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_NETWORKANALYSER, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POWERCONTROL, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_MACHINETEST, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1024LS, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_MCC, USB_DEVICE_ID_MCC_PMD1208LS, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS1, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 20, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 30, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 100, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 108, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 118, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 200, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 300, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 400, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ONTRAK, USB_DEVICE_ID_ONTRAK_ADU100 + 500, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_PANJIT, 0x0003, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_PANJIT, 0x0004, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_LABPRO, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_GOTEMP, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_SKIP, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_VERNIER, USB_DEVICE_ID_VERNIER_CYCLOPS, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_4_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_1_PHIDGETSERVO_20, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_8_8_4_IF_KIT, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_YEALINK, USB_DEVICE_ID_YEALINK_P1K_P4K_B2K, HID_QUIRK_IGNORE }, >+ >+ { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE }, >+ >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP }, >+ >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, >+ >+ { USB_VENDOR_ID_PANTHERLORD, USB_DEVICE_ID_PANTHERLORD_TWIN_USB_JOYSTICK, HID_QUIRK_MULTI_INPUT | HID_QUIRK_SKIP_OUTPUT_REPORTS }, >+ { USB_VENDOR_ID_PLAYDOTCOM, USB_DEVICE_ID_PLAYDOTCOM_EMS_USBII, HID_QUIRK_MULTI_INPUT }, >+ >+ { USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER, HID_QUIRK_SONY_PS3_CONTROLLER }, >+ >+ { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_UC100KM, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS124U, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_2PORTKVM, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_WHEEL, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_SUN, USB_DEVICE_ID_RARITAN_KVM_DONGLE, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_KEYBOARD, HID_QUIRK_NOGET }, >+ { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_DUAL_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, >+ { USB_VENDOR_ID_WISEGROUP, USB_DEVICE_ID_QUAD_USB_JOYPAD, HID_QUIRK_NOGET | HID_QUIRK_MULTI_INPUT }, >+ >+ { 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_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, >+ { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_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 }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_2, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_3, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_4, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_5, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_6, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_7, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_8, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_9, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_10, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_11, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_12, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_13, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_14, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_15, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_16, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_17, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_18, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_19, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_20, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_21, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_22, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_23, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_24, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_25, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_26, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_27, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_28, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_29, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_30, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_31, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_32, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_33, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_34, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_35, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_36, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_37, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_38, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_39, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_40, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_41, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_42, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_43, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_44, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_45, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_46, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_47, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_48, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_49, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_50, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_51, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_52, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_53, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_54, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_55, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_56, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_57, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_58, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_59, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_60, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_61, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_62, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_63, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_HARMONY_64, HID_QUIRK_IGNORE }, >+ { USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR, USB_DEVICE_ID_N_S_HARMONY, HID_QUIRK_IGNORE }, >+ >+ { 0, 0 } >+}; >+ >+/* Quirks for devices which require report descriptor fixup go here */ >+static const struct hid_rdesc_blacklist { >+ __u16 idVendor; >+ __u16 idProduct; >+ __u32 quirks; >+} hid_rdesc_blacklist[] = { >+ >+ { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_RDESC_CYMOTION }, >+ >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER, HID_QUIRK_RDESC_LOGITECH }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER, HID_QUIRK_RDESC_LOGITECH }, >+ { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2, HID_QUIRK_RDESC_LOGITECH }, >+ >+ { USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE, HID_QUIRK_RDESC_PETALYNX }, >+ >+ { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1, HID_QUIRK_RDESC_SWAPPED_MIN_MAX }, >+ { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_2, HID_QUIRK_RDESC_SWAPPED_MIN_MAX }, >+ >+ { 0, 0 } >+}; >+ >+/* Dynamic HID quirks list - specified at runtime */ >+struct quirks_list_struct { >+ struct hid_blacklist hid_bl_item; >+ struct list_head node; >+}; >+ >+static LIST_HEAD(dquirks_list); >+static DECLARE_RWSEM(dquirks_rwsem); >+ >+/* Runtime ("dynamic") quirks manipulation functions */ >+ >+/** >+ * usbhid_exists_dquirk: find any dynamic quirks for a USB HID device >+ * @idVendor: the 16-bit USB vendor ID, in native byteorder >+ * @idProduct: the 16-bit USB product ID, in native byteorder >+ * >+ * Description: >+ * Scans dquirks_list for a matching dynamic quirk and returns >+ * the pointer to the relevant struct hid_blacklist if found. >+ * Must be called with a read lock held on dquirks_rwsem. >+ * >+ * Returns: NULL if no quirk found, struct hid_blacklist * if found. >+ */ >+static struct hid_blacklist *usbhid_exists_dquirk(const u16 idVendor, >+ const u16 idProduct) >+{ >+ struct quirks_list_struct *q; >+ struct hid_blacklist *bl_entry = NULL; >+ >+ list_for_each_entry(q, &dquirks_list, node) { >+ if (q->hid_bl_item.idVendor == idVendor && >+ q->hid_bl_item.idProduct == idProduct) { >+ bl_entry = &q->hid_bl_item; >+ break; >+ } >+ } >+ >+ if (bl_entry != NULL) >+ dbg_hid("Found dynamic quirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n", >+ bl_entry->quirks, bl_entry->idVendor, >+ bl_entry->idProduct); >+ >+ return bl_entry; >+} >+ >+ >+/** >+ * usbhid_modify_dquirk: add/replace a HID quirk >+ * @idVendor: the 16-bit USB vendor ID, in native byteorder >+ * @idProduct: the 16-bit USB product ID, in native byteorder >+ * @quirks: the u32 quirks value to add/replace >+ * >+ * Description: >+ * If an dynamic quirk exists in memory for this (idVendor, >+ * idProduct) pair, replace its quirks value with what was >+ * provided. Otherwise, add the quirk to the dynamic quirks list. >+ * >+ * Returns: 0 OK, -error on failure. >+ */ >+int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct, >+ const u32 quirks) >+{ >+ struct quirks_list_struct *q_new, *q; >+ int list_edited = 0; >+ >+ if (!idVendor) { >+ dbg_hid("Cannot add a quirk with idVendor = 0\n"); >+ return -EINVAL; >+ } >+ >+ q_new = kmalloc(sizeof(struct quirks_list_struct), GFP_KERNEL); >+ if (!q_new) { >+ dbg_hid("Could not allocate quirks_list_struct\n"); >+ return -ENOMEM; >+ } >+ >+ q_new->hid_bl_item.idVendor = idVendor; >+ q_new->hid_bl_item.idProduct = idProduct; >+ q_new->hid_bl_item.quirks = quirks; >+ >+ down_write(&dquirks_rwsem); >+ >+ list_for_each_entry(q, &dquirks_list, node) { >+ >+ if (q->hid_bl_item.idVendor == idVendor && >+ q->hid_bl_item.idProduct == idProduct) { >+ >+ list_replace(&q->node, &q_new->node); >+ kfree(q); >+ list_edited = 1; >+ break; >+ >+ } >+ >+ } >+ >+ if (!list_edited) >+ list_add_tail(&q_new->node, &dquirks_list); >+ >+ up_write(&dquirks_rwsem); >+ >+ return 0; >+} >+ >+/** >+ * usbhid_remove_all_dquirks: remove all runtime HID quirks from memory >+ * >+ * Description: >+ * Free all memory associated with dynamic quirks - called before >+ * module unload. >+ * >+ */ >+static void usbhid_remove_all_dquirks(void) >+{ >+ struct quirks_list_struct *q, *temp; >+ >+ down_write(&dquirks_rwsem); >+ list_for_each_entry_safe(q, temp, &dquirks_list, node) { >+ list_del(&q->node); >+ kfree(q); >+ } >+ up_write(&dquirks_rwsem); >+ >+} >+ >+/** >+ * usbhid_quirks_init: apply USB HID quirks specified at module load time >+ */ >+int usbhid_quirks_init(char **quirks_param) >+{ >+ u16 idVendor, idProduct; >+ u32 quirks; >+ int n = 0, m; >+ >+ for (; quirks_param[n] && n < MAX_USBHID_BOOT_QUIRKS; n++) { >+ >+ m = sscanf(quirks_param[n], "0x%hx:0x%hx:0x%x", >+ &idVendor, &idProduct, &quirks); >+ >+ if (m != 3 || >+ usbhid_modify_dquirk(idVendor, idProduct, quirks) != 0) { >+ printk(KERN_WARNING >+ "Could not parse HID quirk module param %s\n", >+ quirks_param[n]); >+ } >+ } >+ >+ return 0; >+} >+ >+/** >+ * usbhid_quirks_exit: release memory associated with dynamic_quirks >+ * >+ * Description: >+ * Release all memory associated with dynamic quirks. Called upon >+ * module unload. >+ * >+ * Returns: nothing >+ */ >+void usbhid_quirks_exit(void) >+{ >+ usbhid_remove_all_dquirks(); >+} >+ >+/** >+ * usbhid_exists_squirk: return any static quirks for a USB HID device >+ * @idVendor: the 16-bit USB vendor ID, in native byteorder >+ * @idProduct: the 16-bit USB product ID, in native byteorder >+ * >+ * Description: >+ * Given a USB vendor ID and product ID, return a pointer to >+ * the hid_blacklist entry associated with that device. >+ * >+ * Returns: pointer if quirk found, or NULL if no quirks found. >+ */ >+static const struct hid_blacklist *usbhid_exists_squirk(const u16 idVendor, >+ const u16 idProduct) >+{ >+ const struct hid_blacklist *bl_entry = NULL; >+ int n = 0; >+ >+ for (; hid_blacklist[n].idVendor; n++) >+ if (hid_blacklist[n].idVendor == idVendor && >+ hid_blacklist[n].idProduct == idProduct) >+ bl_entry = &hid_blacklist[n]; >+ >+ if (bl_entry != NULL) >+ dbg_hid("Found squirk 0x%x for USB HID vendor 0x%hx prod 0x%hx\n", >+ bl_entry->quirks, bl_entry->idVendor, >+ bl_entry->idProduct); >+ return bl_entry; >+} >+ >+/** >+ * usbhid_lookup_quirk: return any quirks associated with a USB HID device >+ * @idVendor: the 16-bit USB vendor ID, in native byteorder >+ * @idProduct: the 16-bit USB product ID, in native byteorder >+ * >+ * Description: >+ * Given a USB vendor ID and product ID, return any quirks associated >+ * with that device. >+ * >+ * Returns: a u32 quirks value. >+ */ >+u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct) >+{ >+ u32 quirks = 0; >+ const struct hid_blacklist *bl_entry = NULL; >+ >+ /* Ignore all Wacom devices */ >+ if (idVendor == USB_VENDOR_ID_WACOM) >+ return HID_QUIRK_IGNORE; >+ >+ /* ignore all Code Mercenaries IOWarrior devices */ >+ if (idVendor == USB_VENDOR_ID_CODEMERCS) >+ if (idProduct >= USB_DEVICE_ID_CODEMERCS_IOW_FIRST && >+ idProduct <= USB_DEVICE_ID_CODEMERCS_IOW_LAST) >+ return HID_QUIRK_IGNORE; >+ >+ /* NCR devices must not be queried for reports */ >+ if (idVendor == USB_VENDOR_ID_NCR && >+ idProduct >= USB_DEVICE_ID_NCR_FIRST && >+ idProduct <= USB_DEVICE_ID_NCR_LAST) >+ return HID_QUIRK_NOGET; >+ >+ down_read(&dquirks_rwsem); >+ bl_entry = usbhid_exists_dquirk(idVendor, idProduct); >+ if (!bl_entry) >+ bl_entry = usbhid_exists_squirk(idVendor, idProduct); >+ if (bl_entry) >+ quirks = bl_entry->quirks; >+ up_read(&dquirks_rwsem); >+ >+ return quirks; >+} >+ >+/* >+ * Cherry Cymotion keyboard have an invalid HID report descriptor, >+ * that needs fixing before we can parse it. >+ */ >+static void usbhid_fixup_cymotion_descriptor(char *rdesc, int rsize) >+{ >+ if (rsize >= 17 && rdesc[11] == 0x3c && rdesc[12] == 0x02) { >+ printk(KERN_INFO "Fixing up Cherry Cymotion report descriptor\n"); >+ rdesc[11] = rdesc[16] = 0xff; >+ rdesc[12] = rdesc[17] = 0x03; >+ } >+} >+ >+ >+/* >+ * Certain Logitech keyboards send in report #3 keys which are far >+ * above the logical maximum described in descriptor. This extends >+ * the original value of 0x28c of logical maximum to 0x104d >+ */ >+static void usbhid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize) >+{ >+ if (rsize >= 90 && rdesc[83] == 0x26 >+ && rdesc[84] == 0x8c >+ && rdesc[85] == 0x02) { >+ printk(KERN_INFO "Fixing up Logitech keyboard report descriptor\n"); >+ rdesc[84] = rdesc[89] = 0x4d; >+ rdesc[85] = rdesc[90] = 0x10; >+ } >+} >+ >+/* Petalynx Maxter Remote has maximum for consumer page set too low */ >+static void usbhid_fixup_petalynx_descriptor(unsigned char *rdesc, int rsize) >+{ >+ if (rsize >= 60 && rdesc[39] == 0x2a >+ && rdesc[40] == 0xf5 >+ && rdesc[41] == 0x00 >+ && rdesc[59] == 0x26 >+ && rdesc[60] == 0xf9 >+ && rdesc[61] == 0x00) { >+ printk(KERN_INFO "Fixing up Petalynx Maxter Remote report descriptor\n"); >+ rdesc[60] = 0xfa; >+ rdesc[40] = 0xfa; >+ } >+} >+ >+/* >+ * Some USB barcode readers from cypress have usage min and usage max in >+ * the wrong order >+ */ >+static void usbhid_fixup_cypress_descriptor(unsigned char *rdesc, int rsize) >+{ >+ short fixed = 0; >+ int i; >+ >+ for (i = 0; i < rsize - 4; i++) { >+ if (rdesc[i] == 0x29 && rdesc [i+2] == 0x19) { >+ unsigned char tmp; >+ >+ rdesc[i] = 0x19; rdesc[i+2] = 0x29; >+ tmp = rdesc[i+3]; >+ rdesc[i+3] = rdesc[i+1]; >+ rdesc[i+1] = tmp; >+ } >+ } >+ >+ if (fixed) >+ printk(KERN_INFO "Fixing up Cypress report descriptor\n"); >+} >+ >+ >+static void __usbhid_fixup_report_descriptor(__u32 quirks, char *rdesc, unsigned rsize) >+{ >+ if ((quirks & HID_QUIRK_RDESC_CYMOTION)) >+ usbhid_fixup_cymotion_descriptor(rdesc, rsize); >+ >+ if (quirks & HID_QUIRK_RDESC_LOGITECH) >+ usbhid_fixup_logitech_descriptor(rdesc, rsize); >+ >+ if (quirks & HID_QUIRK_RDESC_SWAPPED_MIN_MAX) >+ usbhid_fixup_cypress_descriptor(rdesc, rsize); >+ >+ if (quirks & HID_QUIRK_RDESC_PETALYNX) >+ usbhid_fixup_petalynx_descriptor(rdesc, rsize); >+} >+ >+/** >+ * usbhid_fixup_report_descriptor: check if report descriptor needs fixup >+ * >+ * Description: >+ * Walks the hid_rdesc_blacklist[] array and checks whether the device >+ * is known to have broken report descriptor that needs to be fixed up >+ * prior to entering the HID parser >+ * >+ * Returns: nothing >+ */ >+void usbhid_fixup_report_descriptor(const u16 idVendor, const u16 idProduct, >+ char *rdesc, unsigned rsize, char **quirks_param) >+{ >+ int n, m; >+ u16 paramVendor, paramProduct; >+ u32 quirks; >+ >+ /* static rdesc quirk entries */ >+ for (n = 0; hid_rdesc_blacklist[n].idVendor; n++) >+ if (hid_rdesc_blacklist[n].idVendor == idVendor && >+ hid_rdesc_blacklist[n].idProduct == idProduct) >+ __usbhid_fixup_report_descriptor(hid_rdesc_blacklist[n].quirks, >+ rdesc, rsize); >+ >+ /* runtime rdesc quirk entries handling */ >+ for (n = 0; quirks_param[n] && n < MAX_USBHID_BOOT_QUIRKS; n++) { >+ m = sscanf(quirks_param[n], "0x%hx:0x%hx:0x%x", >+ ¶mVendor, ¶mProduct, &quirks); >+ >+ if (m != 3) >+ printk(KERN_WARNING >+ "Could not parse HID quirk module param %s\n", >+ quirks_param[n]); >+ else if (paramVendor == idVendor && paramProduct == idProduct) >+ __usbhid_fixup_report_descriptor(quirks, rdesc, rsize); >+ } >+ >+} >diff -uNrp kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/input/mouse/appletouch.c kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/input/mouse/appletouch.c >--- kernel-2.6.23.orig/linux-2.6.23.x86_64/drivers/input/mouse/appletouch.c 2007-12-22 15:37:50.000000000 +0000 >+++ kernel-2.6.23.new/linux-2.6.23.x86_64/drivers/input/mouse/appletouch.c 2007-12-22 15:56:45.000000000 +0000 >@@ -62,6 +62,11 @@ > #define GEYSER4_ISO_PRODUCT_ID 0x021B > #define GEYSER4_JIS_PRODUCT_ID 0x021C > >+/* Codes in updated driver for macbook3,1 support (and others?) */ >+#define GEYSER4_HF_ANSI_PRODUCT_ID 0x0229 >+#define GEYSER4_HF_ISO_PRODUCT_ID 0x022a >+#define GEYSER4_HF_JIS_PRODUCT_ID 0x021b >+ > #define ATP_DEVICE(prod) \ > .match_flags = USB_DEVICE_ID_MATCH_DEVICE | \ > USB_DEVICE_ID_MATCH_INT_CLASS | \ >@@ -93,6 +98,11 @@ static struct usb_device_id atp_table [] > { ATP_DEVICE(GEYSER4_ISO_PRODUCT_ID) }, > { ATP_DEVICE(GEYSER4_JIS_PRODUCT_ID) }, > >+ /* Core2 Duo MacBook3,1 */ >+ { ATP_DEVICE(GEYSER4_HF_ANSI_PRODUCT_ID) }, >+ { ATP_DEVICE(GEYSER4_HF_ISO_PRODUCT_ID) }, >+ { ATP_DEVICE(GEYSER4_HF_JIS_PRODUCT_ID) }, >+ > /* Terminating entry */ > { } > }; >@@ -207,7 +217,10 @@ static inline int atp_is_geyser_3(struct > (productId == GEYSER3_JIS_PRODUCT_ID) || > (productId == GEYSER4_ANSI_PRODUCT_ID) || > (productId == GEYSER4_ISO_PRODUCT_ID) || >- (productId == GEYSER4_JIS_PRODUCT_ID); >+ (productId == GEYSER4_JIS_PRODUCT_ID) || >+ (productId == GEYSER4_HF_ANSI_PRODUCT_ID) || >+ (productId == GEYSER4_HF_ISO_PRODUCT_ID) || >+ (productId == GEYSER4_HF_JIS_PRODUCT_ID); > } > > /* >diff -uNrp kernel-2.6.23.orig/linux-2.6.23.x86_64/include/linux/hid.h kernel-2.6.23.new/linux-2.6.23.x86_64/include/linux/hid.h >--- kernel-2.6.23.orig/linux-2.6.23.x86_64/include/linux/hid.h 2007-12-22 15:37:15.000000000 +0000 >+++ kernel-2.6.23.new/linux-2.6.23.x86_64/include/linux/hid.h 2007-12-22 15:55:38.000000000 +0000 >@@ -276,6 +276,7 @@ struct hid_item { > #define HID_QUIRK_HIDINPUT 0x00200000 > #define HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL 0x00400000 > #define HID_QUIRK_LOGITECH_EXPANDED_KEYMAP 0x00800000 >+#define HID_QUIRK_APPLE_KEYBOARD 0x01000000 > > /* > * Separate quirks for runtime report descriptor fixup >diff -uNrp kernel-2.6.23.orig/linux-2.6.23.x86_64/include/linux/hid.h.orig kernel-2.6.23.new/linux-2.6.23.x86_64/include/linux/hid.h.orig >--- kernel-2.6.23.orig/linux-2.6.23.x86_64/include/linux/hid.h.orig 1970-01-01 01:00:00.000000000 +0100 >+++ kernel-2.6.23.new/linux-2.6.23.x86_64/include/linux/hid.h.orig 2007-12-22 15:37:15.000000000 +0000 >@@ -0,0 +1,556 @@ >+#ifndef __HID_H >+#define __HID_H >+ >+/* >+ * $Id: hid.h,v 1.24 2001/12/27 10:37:41 vojtech Exp $ >+ * >+ * Copyright (c) 1999 Andreas Gal >+ * Copyright (c) 2000-2001 Vojtech Pavlik >+ * Copyright (c) 2006-2007 Jiri Kosina >+ */ >+ >+/* >+ * This program is free software; you can redistribute it and/or modify >+ * it under the terms of the GNU General Public License as published by >+ * the Free Software Foundation; either version 2 of the License, or >+ * (at your option) any later version. >+ * >+ * This program is distributed in the hope that it will be useful, >+ * but WITHOUT ANY WARRANTY; without even the implied warranty of >+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >+ * GNU General Public License for more details. >+ * >+ * You should have received a copy of the GNU General Public License >+ * along with this program; if not, write to the Free Software >+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA >+ * >+ * Should you need to contact me, the author, you can do so either by >+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail: >+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic >+ */ >+ >+#include <linux/types.h> >+#include <linux/slab.h> >+#include <linux/list.h> >+#include <linux/timer.h> >+#include <linux/workqueue.h> >+#include <linux/input.h> >+ >+/* >+ * USB HID (Human Interface Device) interface class code >+ */ >+ >+#define USB_INTERFACE_CLASS_HID 3 >+ >+/* >+ * USB HID interface subclass and protocol codes >+ */ >+ >+#define USB_INTERFACE_SUBCLASS_BOOT 1 >+#define USB_INTERFACE_PROTOCOL_KEYBOARD 1 >+#define USB_INTERFACE_PROTOCOL_MOUSE 2 >+ >+/* >+ * HID class requests >+ */ >+ >+#define HID_REQ_GET_REPORT 0x01 >+#define HID_REQ_GET_IDLE 0x02 >+#define HID_REQ_GET_PROTOCOL 0x03 >+#define HID_REQ_SET_REPORT 0x09 >+#define HID_REQ_SET_IDLE 0x0A >+#define HID_REQ_SET_PROTOCOL 0x0B >+ >+/* >+ * HID class descriptor types >+ */ >+ >+#define HID_DT_HID (USB_TYPE_CLASS | 0x01) >+#define HID_DT_REPORT (USB_TYPE_CLASS | 0x02) >+#define HID_DT_PHYSICAL (USB_TYPE_CLASS | 0x03) >+ >+/* >+ * We parse each description item into this structure. Short items data >+ * values are expanded to 32-bit signed int, long items contain a pointer >+ * into the data area. >+ */ >+ >+struct hid_item { >+ unsigned format; >+ __u8 size; >+ __u8 type; >+ __u8 tag; >+ union { >+ __u8 u8; >+ __s8 s8; >+ __u16 u16; >+ __s16 s16; >+ __u32 u32; >+ __s32 s32; >+ __u8 *longdata; >+ } data; >+}; >+ >+/* >+ * HID report item format >+ */ >+ >+#define HID_ITEM_FORMAT_SHORT 0 >+#define HID_ITEM_FORMAT_LONG 1 >+ >+/* >+ * Special tag indicating long items >+ */ >+ >+#define HID_ITEM_TAG_LONG 15 >+ >+/* >+ * HID report descriptor item type (prefix bit 2,3) >+ */ >+ >+#define HID_ITEM_TYPE_MAIN 0 >+#define HID_ITEM_TYPE_GLOBAL 1 >+#define HID_ITEM_TYPE_LOCAL 2 >+#define HID_ITEM_TYPE_RESERVED 3 >+ >+/* >+ * HID report descriptor main item tags >+ */ >+ >+#define HID_MAIN_ITEM_TAG_INPUT 8 >+#define HID_MAIN_ITEM_TAG_OUTPUT 9 >+#define HID_MAIN_ITEM_TAG_FEATURE 11 >+#define HID_MAIN_ITEM_TAG_BEGIN_COLLECTION 10 >+#define HID_MAIN_ITEM_TAG_END_COLLECTION 12 >+ >+/* >+ * HID report descriptor main item contents >+ */ >+ >+#define HID_MAIN_ITEM_CONSTANT 0x001 >+#define HID_MAIN_ITEM_VARIABLE 0x002 >+#define HID_MAIN_ITEM_RELATIVE 0x004 >+#define HID_MAIN_ITEM_WRAP 0x008 >+#define HID_MAIN_ITEM_NONLINEAR 0x010 >+#define HID_MAIN_ITEM_NO_PREFERRED 0x020 >+#define HID_MAIN_ITEM_NULL_STATE 0x040 >+#define HID_MAIN_ITEM_VOLATILE 0x080 >+#define HID_MAIN_ITEM_BUFFERED_BYTE 0x100 >+ >+/* >+ * HID report descriptor collection item types >+ */ >+ >+#define HID_COLLECTION_PHYSICAL 0 >+#define HID_COLLECTION_APPLICATION 1 >+#define HID_COLLECTION_LOGICAL 2 >+ >+/* >+ * HID report descriptor global item tags >+ */ >+ >+#define HID_GLOBAL_ITEM_TAG_USAGE_PAGE 0 >+#define HID_GLOBAL_ITEM_TAG_LOGICAL_MINIMUM 1 >+#define HID_GLOBAL_ITEM_TAG_LOGICAL_MAXIMUM 2 >+#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MINIMUM 3 >+#define HID_GLOBAL_ITEM_TAG_PHYSICAL_MAXIMUM 4 >+#define HID_GLOBAL_ITEM_TAG_UNIT_EXPONENT 5 >+#define HID_GLOBAL_ITEM_TAG_UNIT 6 >+#define HID_GLOBAL_ITEM_TAG_REPORT_SIZE 7 >+#define HID_GLOBAL_ITEM_TAG_REPORT_ID 8 >+#define HID_GLOBAL_ITEM_TAG_REPORT_COUNT 9 >+#define HID_GLOBAL_ITEM_TAG_PUSH 10 >+#define HID_GLOBAL_ITEM_TAG_POP 11 >+ >+/* >+ * HID report descriptor local item tags >+ */ >+ >+#define HID_LOCAL_ITEM_TAG_USAGE 0 >+#define HID_LOCAL_ITEM_TAG_USAGE_MINIMUM 1 >+#define HID_LOCAL_ITEM_TAG_USAGE_MAXIMUM 2 >+#define HID_LOCAL_ITEM_TAG_DESIGNATOR_INDEX 3 >+#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MINIMUM 4 >+#define HID_LOCAL_ITEM_TAG_DESIGNATOR_MAXIMUM 5 >+#define HID_LOCAL_ITEM_TAG_STRING_INDEX 7 >+#define HID_LOCAL_ITEM_TAG_STRING_MINIMUM 8 >+#define HID_LOCAL_ITEM_TAG_STRING_MAXIMUM 9 >+#define HID_LOCAL_ITEM_TAG_DELIMITER 10 >+ >+/* >+ * HID usage tables >+ */ >+ >+#define HID_USAGE_PAGE 0xffff0000 >+ >+#define HID_UP_UNDEFINED 0x00000000 >+#define HID_UP_GENDESK 0x00010000 >+#define HID_UP_SIMULATION 0x00020000 >+#define HID_UP_KEYBOARD 0x00070000 >+#define HID_UP_LED 0x00080000 >+#define HID_UP_BUTTON 0x00090000 >+#define HID_UP_ORDINAL 0x000a0000 >+#define HID_UP_CONSUMER 0x000c0000 >+#define HID_UP_DIGITIZER 0x000d0000 >+#define HID_UP_PID 0x000f0000 >+#define HID_UP_HPVENDOR 0xff7f0000 >+#define HID_UP_MSVENDOR 0xff000000 >+#define HID_UP_CUSTOM 0x00ff0000 >+#define HID_UP_LOGIVENDOR 0xffbc0000 >+ >+#define HID_USAGE 0x0000ffff >+ >+#define HID_GD_POINTER 0x00010001 >+#define HID_GD_MOUSE 0x00010002 >+#define HID_GD_JOYSTICK 0x00010004 >+#define HID_GD_GAMEPAD 0x00010005 >+#define HID_GD_KEYBOARD 0x00010006 >+#define HID_GD_KEYPAD 0x00010007 >+#define HID_GD_MULTIAXIS 0x00010008 >+#define HID_GD_X 0x00010030 >+#define HID_GD_Y 0x00010031 >+#define HID_GD_Z 0x00010032 >+#define HID_GD_RX 0x00010033 >+#define HID_GD_RY 0x00010034 >+#define HID_GD_RZ 0x00010035 >+#define HID_GD_SLIDER 0x00010036 >+#define HID_GD_DIAL 0x00010037 >+#define HID_GD_WHEEL 0x00010038 >+#define HID_GD_HATSWITCH 0x00010039 >+#define HID_GD_BUFFER 0x0001003a >+#define HID_GD_BYTECOUNT 0x0001003b >+#define HID_GD_MOTION 0x0001003c >+#define HID_GD_START 0x0001003d >+#define HID_GD_SELECT 0x0001003e >+#define HID_GD_VX 0x00010040 >+#define HID_GD_VY 0x00010041 >+#define HID_GD_VZ 0x00010042 >+#define HID_GD_VBRX 0x00010043 >+#define HID_GD_VBRY 0x00010044 >+#define HID_GD_VBRZ 0x00010045 >+#define HID_GD_VNO 0x00010046 >+#define HID_GD_FEATURE 0x00010047 >+#define HID_GD_UP 0x00010090 >+#define HID_GD_DOWN 0x00010091 >+#define HID_GD_RIGHT 0x00010092 >+#define HID_GD_LEFT 0x00010093 >+ >+/* >+ * HID report types --- Ouch! HID spec says 1 2 3! >+ */ >+ >+#define HID_INPUT_REPORT 0 >+#define HID_OUTPUT_REPORT 1 >+#define HID_FEATURE_REPORT 2 >+ >+/* >+ * HID device quirks. >+ */ >+ >+/* >+ * Increase this if you need to configure more HID quirks at module load time >+ */ >+#define MAX_USBHID_BOOT_QUIRKS 4 >+ >+#define HID_QUIRK_INVERT 0x00000001 >+#define HID_QUIRK_NOTOUCH 0x00000002 >+#define HID_QUIRK_IGNORE 0x00000004 >+#define HID_QUIRK_NOGET 0x00000008 >+#define HID_QUIRK_HIDDEV 0x00000010 >+#define HID_QUIRK_BADPAD 0x00000020 >+#define HID_QUIRK_MULTI_INPUT 0x00000040 >+#define HID_QUIRK_2WHEEL_MOUSE_HACK_7 0x00000080 >+#define HID_QUIRK_2WHEEL_MOUSE_HACK_5 0x00000100 >+#define HID_QUIRK_2WHEEL_MOUSE_HACK_ON 0x00000200 >+#define HID_QUIRK_MIGHTYMOUSE 0x00000400 >+#define HID_QUIRK_POWERBOOK_HAS_FN 0x00000800 >+#define HID_QUIRK_POWERBOOK_FN_ON 0x00001000 >+#define HID_QUIRK_INVERT_HWHEEL 0x00002000 >+#define HID_QUIRK_POWERBOOK_ISO_KEYBOARD 0x00004000 >+#define HID_QUIRK_BAD_RELATIVE_KEYS 0x00008000 >+#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00010000 >+#define HID_QUIRK_IGNORE_MOUSE 0x00020000 >+#define HID_QUIRK_SONY_PS3_CONTROLLER 0x00040000 >+#define HID_QUIRK_DUPLICATE_USAGES 0x00080000 >+#define HID_QUIRK_RESET_LEDS 0x00100000 >+#define HID_QUIRK_HIDINPUT 0x00200000 >+#define HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL 0x00400000 >+#define HID_QUIRK_LOGITECH_EXPANDED_KEYMAP 0x00800000 >+ >+/* >+ * Separate quirks for runtime report descriptor fixup >+ */ >+ >+#define HID_QUIRK_RDESC_CYMOTION 0x00000001 >+#define HID_QUIRK_RDESC_LOGITECH 0x00000002 >+#define HID_QUIRK_RDESC_SWAPPED_MIN_MAX 0x00000004 >+#define HID_QUIRK_RDESC_PETALYNX 0x00000008 >+ >+/* >+ * This is the global environment of the parser. This information is >+ * persistent for main-items. The global environment can be saved and >+ * restored with PUSH/POP statements. >+ */ >+ >+struct hid_global { >+ unsigned usage_page; >+ __s32 logical_minimum; >+ __s32 logical_maximum; >+ __s32 physical_minimum; >+ __s32 physical_maximum; >+ __s32 unit_exponent; >+ unsigned unit; >+ unsigned report_id; >+ unsigned report_size; >+ unsigned report_count; >+}; >+ >+/* >+ * This is the local environment. It is persistent up the next main-item. >+ */ >+ >+#define HID_MAX_DESCRIPTOR_SIZE 4096 >+#define HID_MAX_USAGES 8192 >+#define HID_DEFAULT_NUM_COLLECTIONS 16 >+ >+struct hid_local { >+ unsigned usage[HID_MAX_USAGES]; /* usage array */ >+ unsigned collection_index[HID_MAX_USAGES]; /* collection index array */ >+ unsigned usage_index; >+ unsigned usage_minimum; >+ unsigned delimiter_depth; >+ unsigned delimiter_branch; >+}; >+ >+/* >+ * This is the collection stack. We climb up the stack to determine >+ * application and function of each field. >+ */ >+ >+struct hid_collection { >+ unsigned type; >+ unsigned usage; >+ unsigned level; >+}; >+ >+struct hid_usage { >+ unsigned hid; /* hid usage code */ >+ unsigned collection_index; /* index into collection array */ >+ /* hidinput data */ >+ __u16 code; /* input driver code */ >+ __u8 type; /* input driver type */ >+ __s8 hat_min; /* hat switch fun */ >+ __s8 hat_max; /* ditto */ >+ __s8 hat_dir; /* ditto */ >+}; >+ >+struct hid_input; >+ >+struct hid_field { >+ unsigned physical; /* physical usage for this field */ >+ unsigned logical; /* logical usage for this field */ >+ unsigned application; /* application usage for this field */ >+ struct hid_usage *usage; /* usage table for this function */ >+ unsigned maxusage; /* maximum usage index */ >+ unsigned flags; /* main-item flags (i.e. volatile,array,constant) */ >+ unsigned report_offset; /* bit offset in the report */ >+ unsigned report_size; /* size of this field in the report */ >+ unsigned report_count; /* number of this field in the report */ >+ unsigned report_type; /* (input,output,feature) */ >+ __s32 *value; /* last known value(s) */ >+ __s32 logical_minimum; >+ __s32 logical_maximum; >+ __s32 physical_minimum; >+ __s32 physical_maximum; >+ __s32 unit_exponent; >+ unsigned unit; >+ struct hid_report *report; /* associated report */ >+ unsigned index; /* index into report->field[] */ >+ /* hidinput data */ >+ struct hid_input *hidinput; /* associated input structure */ >+ __u16 dpad; /* dpad input code */ >+}; >+ >+#define HID_MAX_FIELDS 64 >+ >+struct hid_report { >+ struct list_head list; >+ unsigned id; /* id of this report */ >+ unsigned type; /* report type */ >+ struct hid_field *field[HID_MAX_FIELDS]; /* fields of the report */ >+ unsigned maxfield; /* maximum valid field index */ >+ unsigned size; /* size of the report (bits) */ >+ struct hid_device *device; /* associated device */ >+}; >+ >+struct hid_report_enum { >+ unsigned numbered; >+ struct list_head report_list; >+ struct hid_report *report_id_hash[256]; >+}; >+ >+#define HID_REPORT_TYPES 3 >+ >+#define HID_MIN_BUFFER_SIZE 64 /* make sure there is at least a packet size of space */ >+#define HID_MAX_BUFFER_SIZE 4096 /* 4kb */ >+#define HID_CONTROL_FIFO_SIZE 256 /* to init devices with >100 reports */ >+#define HID_OUTPUT_FIFO_SIZE 64 >+ >+struct hid_control_fifo { >+ unsigned char dir; >+ struct hid_report *report; >+}; >+ >+#define HID_CLAIMED_INPUT 1 >+#define HID_CLAIMED_HIDDEV 2 >+ >+#define HID_CTRL_RUNNING 1 >+#define HID_OUT_RUNNING 2 >+#define HID_IN_RUNNING 3 >+#define HID_RESET_PENDING 4 >+#define HID_SUSPENDED 5 >+#define HID_CLEAR_HALT 6 >+ >+struct hid_input { >+ struct list_head list; >+ struct hid_report *report; >+ struct input_dev *input; >+}; >+ >+struct hid_device { /* device report descriptor */ >+ __u8 *rdesc; >+ unsigned rsize; >+ struct hid_collection *collection; /* List of HID collections */ >+ unsigned collection_size; /* Number of allocated hid_collections */ >+ unsigned maxcollection; /* Number of parsed collections */ >+ unsigned maxapplication; /* Number of applications */ >+ unsigned short bus; /* BUS ID */ >+ unsigned short vendor; /* Vendor ID */ >+ unsigned short product; /* Product ID */ >+ unsigned version; /* HID version */ >+ unsigned country; /* HID country */ >+ struct hid_report_enum report_enum[HID_REPORT_TYPES]; >+ >+ struct device *dev; /* device */ >+ >+ unsigned claimed; /* Claimed by hidinput, hiddev? */ >+ unsigned quirks; /* Various quirks the device can pull on us */ >+ >+ struct list_head inputs; /* The list of inputs */ >+ void *hiddev; /* The hiddev structure */ >+ int minor; /* Hiddev minor number */ >+ >+ wait_queue_head_t wait; /* For sleeping */ >+ >+ int open; /* is the device open by anyone? */ >+ char name[128]; /* Device name */ >+ char phys[64]; /* Device physical location */ >+ char uniq[64]; /* Device unique identifier (serial #) */ >+ >+ void *driver_data; >+ >+ /* device-specific function pointers */ >+ int (*hidinput_input_event) (struct input_dev *, unsigned int, unsigned int, int); >+ int (*hid_open) (struct hid_device *); >+ void (*hid_close) (struct hid_device *); >+ >+ /* hiddev event handler */ >+ void (*hiddev_hid_event) (struct hid_device *, struct hid_field *field, >+ struct hid_usage *, __s32); >+ void (*hiddev_report_event) (struct hid_device *, struct hid_report *); >+#ifdef CONFIG_USB_HIDINPUT_POWERBOOK >+ unsigned long pb_pressed_fn[NBITS(KEY_MAX)]; >+ unsigned long pb_pressed_numlock[NBITS(KEY_MAX)]; >+#endif >+}; >+ >+#define HID_GLOBAL_STACK_SIZE 4 >+#define HID_COLLECTION_STACK_SIZE 4 >+ >+struct hid_parser { >+ struct hid_global global; >+ struct hid_global global_stack[HID_GLOBAL_STACK_SIZE]; >+ unsigned global_stack_ptr; >+ struct hid_local local; >+ unsigned collection_stack[HID_COLLECTION_STACK_SIZE]; >+ unsigned collection_stack_ptr; >+ struct hid_device *device; >+}; >+ >+struct hid_class_descriptor { >+ __u8 bDescriptorType; >+ __u16 wDescriptorLength; >+} __attribute__ ((packed)); >+ >+struct hid_descriptor { >+ __u8 bLength; >+ __u8 bDescriptorType; >+ __u16 bcdHID; >+ __u8 bCountryCode; >+ __u8 bNumDescriptors; >+ >+ struct hid_class_descriptor desc[1]; >+} __attribute__ ((packed)); >+ >+/* Applications from HID Usage Tables 4/8/99 Version 1.1 */ >+/* We ignore a few input applications that are not widely used */ >+#define IS_INPUT_APPLICATION(a) (((a >= 0x00010000) && (a <= 0x00010008)) || (a == 0x00010080) || (a == 0x000c0001)) >+ >+/* HID core API */ >+ >+#ifdef CONFIG_HID_DEBUG >+extern int hid_debug; >+#endif >+ >+extern void hidinput_hid_event(struct hid_device *, struct hid_field *, struct hid_usage *, __s32); >+extern void hidinput_report_event(struct hid_device *hid, struct hid_report *report); >+extern int hidinput_connect(struct hid_device *); >+extern void hidinput_disconnect(struct hid_device *); >+ >+int hid_set_field(struct hid_field *, unsigned, __s32); >+int hid_input_report(struct hid_device *, int type, u8 *, int, int); >+int hidinput_find_field(struct hid_device *hid, unsigned int type, unsigned int code, struct hid_field **field); >+void hid_input_field(struct hid_device *hid, struct hid_field *field, __u8 *data, int interrupt); >+void hid_output_report(struct hid_report *report, __u8 *data); >+void hid_free_device(struct hid_device *device); >+struct hid_device *hid_parse_report(__u8 *start, unsigned size); >+ >+/* HID quirks API */ >+u32 usbhid_lookup_quirk(const u16 idVendor, const u16 idProduct); >+int usbhid_modify_dquirk(const u16 idVendor, const u16 idProduct, const u32 quirks); >+int usbhid_quirks_init(char **quirks_param); >+void usbhid_quirks_exit(void); >+void usbhid_fixup_report_descriptor(const u16, const u16, char *, unsigned, char **); >+ >+#ifdef CONFIG_HID_FF >+int hid_ff_init(struct hid_device *hid); >+ >+int hid_lgff_init(struct hid_device *hid); >+int hid_plff_init(struct hid_device *hid); >+int hid_tmff_init(struct hid_device *hid); >+int hid_zpff_init(struct hid_device *hid); >+#ifdef CONFIG_HID_PID >+int hid_pidff_init(struct hid_device *hid); >+#else >+static inline int hid_pidff_init(struct hid_device *hid) { return -ENODEV; } >+#endif >+ >+#else >+static inline int hid_ff_init(struct hid_device *hid) { return -1; } >+#endif >+ >+#ifdef CONFIG_HID_DEBUG >+#define dbg_hid(format, arg...) if (hid_debug) \ >+ printk(KERN_DEBUG "%s: " format ,\ >+ __FILE__ , ## arg) >+#define dbg_hid_line(format, arg...) if (hid_debug) \ >+ printk(format, ## arg) >+#else >+#define dbg_hid(format, arg...) do {} while (0) >+#define dbg_hid_line dbg_hid >+#endif >+ >+#define err_hid(format, arg...) printk(KERN_ERR "%s: " format "\n" , \ >+ __FILE__ , ## arg) >+#endif >+ >diff -uNrp kernel-2.6.23.orig/linux-2.6.23.x86_64/include/linux/hid.h.rej kernel-2.6.23.new/linux-2.6.23.x86_64/include/linux/hid.h.rej >--- kernel-2.6.23.orig/linux-2.6.23.x86_64/include/linux/hid.h.rej 1970-01-01 01:00:00.000000000 +0100 >+++ kernel-2.6.23.new/linux-2.6.23.x86_64/include/linux/hid.h.rej 2007-12-22 15:53:22.000000000 +0000 >@@ -0,0 +1,16 @@ >+*************** >+*** 276,281 **** >+ #define HID_QUIRK_DUPLICATE_USAGES 0x00200000 >+ #define HID_QUIRK_RESET_LEDS 0x00400000 >+ #define HID_QUIRK_SWAPPED_MIN_MAX 0x00800000 >+ >+ /* >+ * This is the global environment of the parser. This information is >+--- 276,282 ---- >+ #define HID_QUIRK_DUPLICATE_USAGES 0x00200000 >+ #define HID_QUIRK_RESET_LEDS 0x00400000 >+ #define HID_QUIRK_SWAPPED_MIN_MAX 0x00800000 >++ #define HID_QUIRK_APPLE_KEYBOARD 0x01000000 >+ >+ /* >+ * This is the global environment of the parser. This information is
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 426576
:
290294
|
292293
|
294650
|
298060
|
298521