diff options
author | Christian Ohm <chr.ohm@gmx.net> | 2013-05-21 03:31:09 +0400 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2013-05-28 14:15:56 +0400 |
commit | d4f5189052c68f5bae3aac62b357577ecb862fee (patch) | |
tree | 2d732da5906ea1cf135b2eb0a3034c326d902177 /drivers/hid/hid-holtek-mouse.c | |
parent | 41de326eafa6eff71c6ca00ae27c6be235c65a6d (diff) | |
download | linux-d4f5189052c68f5bae3aac62b357577ecb862fee.tar.xz |
HID: Add support for Holtek gaming mouse 04d9:a04a
This mouse is sold as Tracer Sniper TRM-503, NOVA Gaming Slider X200 and
Zalman ZM-GM1, and reports too high usage maximum and logical maximum
(like 04d9:a067, but its report descriptor is different). This patch
adds its USB ID and fixes the report descriptor in the same way.
Note: I don't actually have such a mouse to test, I took the report
descriptor posted at https://bugzilla.novell.com/show_bug.cgi?id=774676,
compared it to the one from 04d9:a067 and changed the offsets
accordingly (all numbers minus 9, since it is 9 bytes shorter, and the
difference is before the values that need changing). That Surely Works™.
Signed-off-by: Christian Ohm <chr.ohm@gmx.net>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
Diffstat (limited to 'drivers/hid/hid-holtek-mouse.c')
-rw-r--r-- | drivers/hid/hid-holtek-mouse.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/drivers/hid/hid-holtek-mouse.c b/drivers/hid/hid-holtek-mouse.c index f32e29aea11a..6a23ee678138 100644 --- a/drivers/hid/hid-holtek-mouse.c +++ b/drivers/hid/hid-holtek-mouse.c @@ -23,8 +23,10 @@ * excessively large number of consumer usages (2^15), which is more than * HID_MAX_USAGES. This prevents proper parsing of the report descriptor. * - * This driver fixes the report descriptor for USB ID 04d9:a067, sold as - * Sharkoon Drakonia and Perixx MX-2000. + * This driver fixes the report descriptor for: + * - USB ID 04d9:a067, sold as Sharkoon Drakonia and Perixx MX-2000 + * - USB ID 04d9:a04a, sold as Tracer Sniper TRM-503, NOVA Gaming Slider X200 + * and Zalman ZM-GM1 */ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, @@ -35,11 +37,23 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, if (intf->cur_altsetting->desc.bInterfaceNumber == 1) { /* Change usage maximum and logical maximum from 0x7fff to * 0x2fff, so they don't exceed HID_MAX_USAGES */ - if (*rsize >= 122 && rdesc[115] == 0xff && rdesc[116] == 0x7f - && rdesc[120] == 0xff && rdesc[121] == 0x7f) { - hid_info(hdev, "Fixing up report descriptor\n"); - rdesc[116] = rdesc[121] = 0x2f; + switch (hdev->product) { + case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067: + if (*rsize >= 122 && rdesc[115] == 0xff && rdesc[116] == 0x7f + && rdesc[120] == 0xff && rdesc[121] == 0x7f) { + hid_info(hdev, "Fixing up report descriptor\n"); + rdesc[116] = rdesc[121] = 0x2f; + } + break; + case USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A: + if (*rsize >= 113 && rdesc[106] == 0xff && rdesc[107] == 0x7f + && rdesc[111] == 0xff && rdesc[112] == 0x7f) { + hid_info(hdev, "Fixing up report descriptor\n"); + rdesc[107] = rdesc[112] = 0x2f; + } + break; } + } return rdesc; } @@ -47,6 +61,8 @@ static __u8 *holtek_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, static const struct hid_device_id holtek_mouse_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A067) }, + { HID_USB_DEVICE(USB_VENDOR_ID_HOLTEK_ALT, + USB_DEVICE_ID_HOLTEK_ALT_MOUSE_A04A) }, { } }; MODULE_DEVICE_TABLE(hid, holtek_mouse_devices); |