aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Kosina <jkosina@suse.cz>2007-04-05 06:23:09 -0400
committerJiri Kosina <jkosina@suse.cz>2007-04-11 04:36:03 -0400
commit85cbea3952135ecad4b47cb6cc57e25279129e2d (patch)
treef7d7561adb058c3d7645f685deb24508c89ae70c
parentbf892e60d0b32989bc55ef64cd6557a49806f0cf (diff)
USB HID: Logitech MX3000 keyboard needs report descriptor quirk
Logitech MX3000 contains report descriptor which doesn't cover usages above 0x28c, but emits such usages. Report descriptor needs fixing in the very same way as with receivers shipped with S510 keyboards. This patch also adds a few mappings for multimedia keys that S510 didn't emit. Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r--drivers/hid/hid-input.c18
-rw-r--r--drivers/hid/usbhid/hid-core.c24
-rw-r--r--include/linux/hid.h2
3 files changed, 31 insertions, 13 deletions
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
index 220e5a8381c4..a19b65ed3119 100644
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -540,10 +540,26 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
540 case 0x302: map_key_clear(KEY_PROG2); break; 540 case 0x302: map_key_clear(KEY_PROG2); break;
541 case 0x303: map_key_clear(KEY_PROG3); break; 541 case 0x303: map_key_clear(KEY_PROG3); break;
542 542
543 /* Reported on Logitech S510 wireless keyboard */ 543 /* Reported on certain Logitech wireless keyboards */
544 case 0x1001: map_key_clear(KEY_MESSENGER); break;
545 case 0x1003: map_key_clear(KEY_SOUND); break;
546 case 0x1004: map_key_clear(KEY_VIDEO); break;
547 case 0x1005: map_key_clear(KEY_AUDIO); break;
548 case 0x100a: map_key_clear(KEY_DOCUMENTS); break;
549 case 0x1011: map_key_clear(KEY_PREVIOUSSONG); break;
550 case 0x1012: map_key_clear(KEY_NEXTSONG); break;
551 case 0x1013: map_key_clear(KEY_CAMERA); break;
552 case 0x1014: map_key_clear(KEY_MESSENGER); break;
553 case 0x1015: map_key_clear(KEY_RECORD); break;
554 case 0x1016: map_key_clear(KEY_PLAYER); break;
555 case 0x1017: map_key_clear(KEY_EJECTCD); break;
556 case 0x1019: map_key_clear(KEY_PROG1); break;
557 case 0x101a: map_key_clear(KEY_PROG2); break;
558 case 0x101b: map_key_clear(KEY_PROG3); break;
544 case 0x101f: map_key_clear(KEY_ZOOMIN); break; 559 case 0x101f: map_key_clear(KEY_ZOOMIN); break;
545 case 0x1020: map_key_clear(KEY_ZOOMOUT); break; 560 case 0x1020: map_key_clear(KEY_ZOOMOUT); break;
546 case 0x1021: map_key_clear(KEY_ZOOMRESET); break; 561 case 0x1021: map_key_clear(KEY_ZOOMRESET); break;
562 case 0x1023: map_key_clear(KEY_CLOSE); break;
547 /* this one is marked as 'Rotate' */ 563 /* this one is marked as 'Rotate' */
548 case 0x1028: map_key_clear(KEY_ANGLE); break; 564 case 0x1028: map_key_clear(KEY_ANGLE); break;
549 case 0x1029: map_key_clear(KEY_SHUFFLE); break; 565 case 0x1029: map_key_clear(KEY_SHUFFLE); break;
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index c94516c05a4e..762cb35e769b 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -225,9 +225,10 @@ MODULE_PARM_DESC(mousepoll, "Polling interval of mice");
225#define USB_DEVICE_ID_LD_MACHINETEST 0x2040 225#define USB_DEVICE_ID_LD_MACHINETEST 0x2040
226 226
227#define USB_VENDOR_ID_LOGITECH 0x046d 227#define USB_VENDOR_ID_LOGITECH 0x046d
228#define USB_DEVICE_ID_LOGITECH_USB_RECEIVER 0xc101 228#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
229#define USB_DEVICE_ID_S510_USB_RECEIVER 0xc50c 229#define USB_DEVICE_ID_S510_RECEIVER 0xc50c
230#define USB_DEVICE_ID_S510_USB_RECEIVER_2 0xc517 230#define USB_DEVICE_ID_S510_RECEIVER_2 0xc517
231#define USB_DEVICE_ID_MX3000_RECEIVER 0xc513
231#define USB_DEVICE_ID_DINOVO_EDGE 0xc714 232#define USB_DEVICE_ID_DINOVO_EDGE 0xc714
232 233
233#define USB_VENDOR_ID_MCC 0x09db 234#define USB_VENDOR_ID_MCC 0x09db
@@ -297,7 +298,7 @@ static const struct hid_blacklist {
297 { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 }, 298 { USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU, HID_QUIRK_2WHEEL_MOUSE_HACK_7 },
298 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 }, 299 { USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_MOUSE, HID_QUIRK_2WHEEL_MOUSE_HACK_5 },
299 300
300 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_USB_RECEIVER, HID_QUIRK_BAD_RELATIVE_KEYS }, 301 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_RECEIVER, HID_QUIRK_BAD_RELATIVE_KEYS },
301 302
302 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD }, 303 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD, HID_QUIRK_BADPAD },
303 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD }, 304 { USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR, HID_QUIRK_BADPAD },
@@ -434,8 +435,9 @@ static const struct hid_blacklist {
434 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE }, 435 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_FLAIR, HID_QUIRK_IGNORE },
435 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE }, 436 { USB_VENDOR_ID_ACECAD, USB_DEVICE_ID_ACECAD_302, HID_QUIRK_IGNORE },
436 437
437 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_USB_RECEIVER, HID_QUIRK_LOGITECH_S510_DESCRIPTOR }, 438 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER, HID_QUIRK_LOGITECH_DESCRIPTOR },
438 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_USB_RECEIVER_2, HID_QUIRK_LOGITECH_S510_DESCRIPTOR }, 439 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER, HID_QUIRK_LOGITECH_DESCRIPTOR },
440 { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_S510_RECEIVER_2, HID_QUIRK_LOGITECH_DESCRIPTOR },
439 441
440 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL }, 442 { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
441 443
@@ -1049,16 +1051,16 @@ static void hid_fixup_sony_ps3_controller(struct usb_device *dev, int ifnum)
1049} 1051}
1050 1052
1051/* 1053/*
1052 * Logitech S510 keyboard sends in report #3 keys which are far 1054 * Certain Logitech keyboards send in report #3 keys which are far
1053 * above the logical maximum described in descriptor. This extends 1055 * above the logical maximum described in descriptor. This extends
1054 * the original value of 0x28c of logical maximum to 0x104d 1056 * the original value of 0x28c of logical maximum to 0x104d
1055 */ 1057 */
1056static void hid_fixup_s510_descriptor(unsigned char *rdesc, int rsize) 1058static void hid_fixup_logitech_descriptor(unsigned char *rdesc, int rsize)
1057{ 1059{
1058 if (rsize >= 90 && rdesc[83] == 0x26 1060 if (rsize >= 90 && rdesc[83] == 0x26
1059 && rdesc[84] == 0x8c 1061 && rdesc[84] == 0x8c
1060 && rdesc[85] == 0x02) { 1062 && rdesc[85] == 0x02) {
1061 info("Fixing up Logitech S510 report descriptor"); 1063 info("Fixing up Logitech keyboard report descriptor");
1062 rdesc[84] = rdesc[89] = 0x4d; 1064 rdesc[84] = rdesc[89] = 0x4d;
1063 rdesc[85] = rdesc[90] = 0x10; 1065 rdesc[85] = rdesc[90] = 0x10;
1064 } 1066 }
@@ -1138,8 +1140,8 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf)
1138 if ((quirks & HID_QUIRK_CYMOTION)) 1140 if ((quirks & HID_QUIRK_CYMOTION))
1139 hid_fixup_cymotion_descriptor(rdesc, rsize); 1141 hid_fixup_cymotion_descriptor(rdesc, rsize);
1140 1142
1141 if (quirks & HID_QUIRK_LOGITECH_S510_DESCRIPTOR) 1143 if (quirks & HID_QUIRK_LOGITECH_DESCRIPTOR)
1142 hid_fixup_s510_descriptor(rdesc, rsize); 1144 hid_fixup_logitech_descriptor(rdesc, rsize);
1143 1145
1144#ifdef CONFIG_HID_DEBUG 1146#ifdef CONFIG_HID_DEBUG
1145 printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n); 1147 printk(KERN_DEBUG __FILE__ ": report descriptor (size %u, read %d) = ", rsize, n);
diff --git a/include/linux/hid.h b/include/linux/hid.h
index 8c97d4d3fdb0..55184415fd6b 100644
--- a/include/linux/hid.h
+++ b/include/linux/hid.h
@@ -267,7 +267,7 @@ struct hid_item {
267#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00020000 267#define HID_QUIRK_SKIP_OUTPUT_REPORTS 0x00020000
268#define HID_QUIRK_IGNORE_MOUSE 0x00040000 268#define HID_QUIRK_IGNORE_MOUSE 0x00040000
269#define HID_QUIRK_SONY_PS3_CONTROLLER 0x00080000 269#define HID_QUIRK_SONY_PS3_CONTROLLER 0x00080000
270#define HID_QUIRK_LOGITECH_S510_DESCRIPTOR 0x00100000 270#define HID_QUIRK_LOGITECH_DESCRIPTOR 0x00100000
271#define HID_QUIRK_DUPLICATE_USAGES 0x00200000 271#define HID_QUIRK_DUPLICATE_USAGES 0x00200000
272 272
273/* 273/*