diff options
author | Milan Plzik <milan.plzik@gmail.com> | 2015-02-14 03:48:44 -0500 |
---|---|---|
committer | Jiri Kosina <jkosina@suse.cz> | 2015-02-17 07:13:45 -0500 |
commit | feb6faf1e5d46276c5430e36ffb4a6f62bf8d55b (patch) | |
tree | e30ef73a9eb6fbc3f81456a41c87b8652d41370e | |
parent | 870fd0f5df4e131467612cc46db46fc3b69fd706 (diff) |
HID: kye: Fix report descriptor for Genius PenSketch M912
Genius PenSketch M912 digitizer tablet sends incorrect report descriptor by
default. This patch replaces it with a corrected one.
Signed-off-by: Milan Plzik <milan.plzik@gmail.com>
Reviewed-by: Nikolai Kondrashov <spbnick@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
-rw-r--r-- | drivers/hid/hid-core.c | 1 | ||||
-rw-r--r-- | drivers/hid/hid-ids.h | 1 | ||||
-rw-r--r-- | drivers/hid/hid-kye.c | 140 | ||||
-rw-r--r-- | drivers/hid/usbhid/hid-quirks.c | 1 |
4 files changed, 143 insertions, 0 deletions
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index db4fb6e1cc5b..f9c59665db17 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -1824,6 +1824,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
1824 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, | 1824 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X) }, |
1825 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2) }, | 1825 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2) }, |
1826 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, | 1826 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X) }, |
1827 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912) }, | ||
1827 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1828 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
1828 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, | 1829 | { HID_USB_DEVICE(USB_VENDOR_ID_LCPOWER, USB_DEVICE_ID_LCPOWER_LC1000 ) }, |
1829 | #if IS_ENABLED(CONFIG_HID_LENOVO) | 1830 | #if IS_ENABLED(CONFIG_HID_LENOVO) |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 46edb4d3ed28..b699daf08124 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
@@ -533,6 +533,7 @@ | |||
533 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 | 533 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X 0x5011 |
534 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2 0x501a | 534 | #define USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2 0x501a |
535 | #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 | 535 | #define USB_DEVICE_ID_KYE_EASYPEN_M610X 0x5013 |
536 | #define USB_DEVICE_ID_KYE_PENSKETCH_M912 0x5015 | ||
536 | 537 | ||
537 | #define USB_VENDOR_ID_LABTEC 0x1020 | 538 | #define USB_VENDOR_ID_LABTEC 0x1020 |
538 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 | 539 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 |
diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c index 158fcf577fae..32e6d8d9ded0 100644 --- a/drivers/hid/hid-kye.c +++ b/drivers/hid/hid-kye.c | |||
@@ -268,6 +268,137 @@ static __u8 easypen_m610x_rdesc_fixed[] = { | |||
268 | 0xC0 /* End Collection */ | 268 | 0xC0 /* End Collection */ |
269 | }; | 269 | }; |
270 | 270 | ||
271 | |||
272 | /* Original PenSketch M912 report descriptor size */ | ||
273 | #define PENSKETCH_M912_RDESC_ORIG_SIZE 482 | ||
274 | |||
275 | /* Fixed PenSketch M912 report descriptor */ | ||
276 | static __u8 pensketch_m912_rdesc_fixed[] = { | ||
277 | 0x05, 0x01, /* Usage Page (Desktop), */ | ||
278 | 0x08, /* Usage (00h), */ | ||
279 | 0xA1, 0x01, /* Collection (Application), */ | ||
280 | 0x85, 0x05, /* Report ID (5), */ | ||
281 | 0x06, 0x00, 0xFF, /* Usage Page (FF00h), */ | ||
282 | 0x09, 0x01, /* Usage (01h), */ | ||
283 | 0x15, 0x81, /* Logical Minimum (-127), */ | ||
284 | 0x25, 0x7F, /* Logical Maximum (127), */ | ||
285 | 0x75, 0x08, /* Report Size (8), */ | ||
286 | 0x95, 0x07, /* Report Count (7), */ | ||
287 | 0xB1, 0x02, /* Feature (Variable), */ | ||
288 | 0xC0, /* End Collection, */ | ||
289 | 0x05, 0x0D, /* Usage Page (Digitizer), */ | ||
290 | 0x09, 0x02, /* Usage (Pen), */ | ||
291 | 0xA1, 0x01, /* Collection (Application), */ | ||
292 | 0x85, 0x10, /* Report ID (16), */ | ||
293 | 0x09, 0x20, /* Usage (Stylus), */ | ||
294 | 0xA0, /* Collection (Physical), */ | ||
295 | 0x09, 0x42, /* Usage (Tip Switch), */ | ||
296 | 0x09, 0x44, /* Usage (Barrel Switch), */ | ||
297 | 0x09, 0x46, /* Usage (Tablet Pick), */ | ||
298 | 0x14, /* Logical Minimum (0), */ | ||
299 | 0x25, 0x01, /* Logical Maximum (1), */ | ||
300 | 0x75, 0x01, /* Report Size (1), */ | ||
301 | 0x95, 0x03, /* Report Count (3), */ | ||
302 | 0x81, 0x02, /* Input (Variable), */ | ||
303 | 0x95, 0x04, /* Report Count (4), */ | ||
304 | 0x81, 0x03, /* Input (Constant, Variable), */ | ||
305 | 0x09, 0x32, /* Usage (In Range), */ | ||
306 | 0x95, 0x01, /* Report Count (1), */ | ||
307 | 0x81, 0x02, /* Input (Variable), */ | ||
308 | 0x75, 0x10, /* Report Size (16), */ | ||
309 | 0x95, 0x01, /* Report Count (1), */ | ||
310 | 0xA4, /* Push, */ | ||
311 | 0x05, 0x01, /* Usage Page (Desktop), */ | ||
312 | 0x55, 0xFD, /* Unit Exponent (-3), */ | ||
313 | 0x65, 0x13, /* Unit (Inch), */ | ||
314 | 0x14, /* Logical Minimum (0), */ | ||
315 | 0x34, /* Physical Minimum (0), */ | ||
316 | 0x09, 0x30, /* Usage (X), */ | ||
317 | 0x27, 0x00, 0xF0, 0x00, 0x00, /* Logical Maximum (61440), */ | ||
318 | 0x46, 0xE0, 0x2E, /* Physical Maximum (12000), */ | ||
319 | 0x81, 0x02, /* Input (Variable), */ | ||
320 | 0x09, 0x31, /* Usage (Y), */ | ||
321 | 0x27, 0x00, 0xB4, 0x00, 0x00, /* Logical Maximum (46080), */ | ||
322 | 0x46, 0x28, 0x23, /* Physical Maximum (9000), */ | ||
323 | 0x81, 0x02, /* Input (Variable), */ | ||
324 | 0xB4, /* Pop, */ | ||
325 | 0x09, 0x30, /* Usage (Tip Pressure), */ | ||
326 | 0x14, /* Logical Minimum (0), */ | ||
327 | 0x26, 0xFF, 0x07, /* Logical Maximum (2047), */ | ||
328 | 0x81, 0x02, /* Input (Variable), */ | ||
329 | 0xC0, /* End Collection, */ | ||
330 | 0xC0, /* End Collection, */ | ||
331 | 0x05, 0x0D, /* Usage Page (Digitizer), */ | ||
332 | 0x09, 0x21, /* Usage (Puck), */ | ||
333 | 0xA1, 0x01, /* Collection (Application), */ | ||
334 | 0x85, 0x11, /* Report ID (17), */ | ||
335 | 0x09, 0x21, /* Usage (Puck), */ | ||
336 | 0xA0, /* Collection (Physical), */ | ||
337 | 0x05, 0x09, /* Usage Page (Button), */ | ||
338 | 0x75, 0x01, /* Report Size (1), */ | ||
339 | 0x19, 0x01, /* Usage Minimum (01h), */ | ||
340 | 0x29, 0x03, /* Usage Maximum (03h), */ | ||
341 | 0x14, /* Logical Minimum (0), */ | ||
342 | 0x25, 0x01, /* Logical Maximum (1), */ | ||
343 | 0x95, 0x03, /* Report Count (3), */ | ||
344 | 0x81, 0x02, /* Input (Variable), */ | ||
345 | 0x95, 0x04, /* Report Count (4), */ | ||
346 | 0x81, 0x01, /* Input (Constant), */ | ||
347 | 0x95, 0x01, /* Report Count (1), */ | ||
348 | 0x0B, 0x32, 0x00, 0x0D, 0x00, /* Usage (Digitizer In Range), */ | ||
349 | 0x14, /* Logical Minimum (0), */ | ||
350 | 0x25, 0x01, /* Logical Maximum (1), */ | ||
351 | 0x81, 0x02, /* Input (Variable), */ | ||
352 | 0xA4, /* Push, */ | ||
353 | 0x05, 0x01, /* Usage Page (Desktop), */ | ||
354 | 0x75, 0x10, /* Report Size (16), */ | ||
355 | 0x95, 0x01, /* Report Count (1), */ | ||
356 | 0x55, 0xFD, /* Unit Exponent (-3), */ | ||
357 | 0x65, 0x13, /* Unit (Inch), */ | ||
358 | 0x14, /* Logical Minimum (0), */ | ||
359 | 0x34, /* Physical Minimum (0), */ | ||
360 | 0x09, 0x30, /* Usage (X), */ | ||
361 | 0x27, 0x00, 0xF0, 0x00, 0x00, /* Logical Maximum (61440), */ | ||
362 | 0x46, 0xE0, 0x2E, /* Physical Maximum (12000), */ | ||
363 | 0x81, 0x02, /* Input (Variable), */ | ||
364 | 0x09, 0x31, /* Usage (Y), */ | ||
365 | 0x27, 0x00, 0xB4, 0x00, 0x00, /* Logical Maximum (46080), */ | ||
366 | 0x46, 0x28, 0x23, /* Physical Maximum (9000), */ | ||
367 | 0x81, 0x02, /* Input (Variable), */ | ||
368 | 0x09, 0x38, /* Usage (Wheel), */ | ||
369 | 0x75, 0x08, /* Report Size (8), */ | ||
370 | 0x95, 0x01, /* Report Count (1), */ | ||
371 | 0x15, 0xFF, /* Logical Minimum (-1), */ | ||
372 | 0x25, 0x01, /* Logical Maximum (1), */ | ||
373 | 0x34, /* Physical Minimum (0), */ | ||
374 | 0x44, /* Physical Maximum (0), */ | ||
375 | 0x81, 0x06, /* Input (Variable, Relative), */ | ||
376 | 0xB4, /* Pop, */ | ||
377 | 0xC0, /* End Collection, */ | ||
378 | 0xC0, /* End Collection, */ | ||
379 | 0x05, 0x0C, /* Usage Page (Consumer), */ | ||
380 | 0x09, 0x01, /* Usage (Consumer Control), */ | ||
381 | 0xA1, 0x01, /* Collection (Application), */ | ||
382 | 0x85, 0x12, /* Report ID (18), */ | ||
383 | 0x14, /* Logical Minimum (0), */ | ||
384 | 0x25, 0x01, /* Logical Maximum (1), */ | ||
385 | 0x75, 0x01, /* Report Size (1), */ | ||
386 | 0x95, 0x08, /* Report Count (8), */ | ||
387 | 0x05, 0x0C, /* Usage Page (Consumer), */ | ||
388 | 0x0A, 0x6A, 0x02, /* Usage (AC Delete), */ | ||
389 | 0x0A, 0x1A, 0x02, /* Usage (AC Undo), */ | ||
390 | 0x0A, 0x01, 0x02, /* Usage (AC New), */ | ||
391 | 0x0A, 0x2F, 0x02, /* Usage (AC Zoom), */ | ||
392 | 0x0A, 0x25, 0x02, /* Usage (AC Forward), */ | ||
393 | 0x0A, 0x24, 0x02, /* Usage (AC Back), */ | ||
394 | 0x0A, 0x2D, 0x02, /* Usage (AC Zoom In), */ | ||
395 | 0x0A, 0x2E, 0x02, /* Usage (AC Zoom Out), */ | ||
396 | 0x81, 0x02, /* Input (Variable), */ | ||
397 | 0x95, 0x30, /* Report Count (48), */ | ||
398 | 0x81, 0x03, /* Input (Constant, Variable), */ | ||
399 | 0xC0 /* End Collection */ | ||
400 | }; | ||
401 | |||
271 | static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc, | 402 | static __u8 *kye_consumer_control_fixup(struct hid_device *hdev, __u8 *rdesc, |
272 | unsigned int *rsize, int offset, const char *device_name) { | 403 | unsigned int *rsize, int offset, const char *device_name) { |
273 | /* | 404 | /* |
@@ -335,6 +466,12 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |||
335 | *rsize = sizeof(easypen_m610x_rdesc_fixed); | 466 | *rsize = sizeof(easypen_m610x_rdesc_fixed); |
336 | } | 467 | } |
337 | break; | 468 | break; |
469 | case USB_DEVICE_ID_KYE_PENSKETCH_M912: | ||
470 | if (*rsize == PENSKETCH_M912_RDESC_ORIG_SIZE) { | ||
471 | rdesc = pensketch_m912_rdesc_fixed; | ||
472 | *rsize = sizeof(pensketch_m912_rdesc_fixed); | ||
473 | } | ||
474 | break; | ||
338 | case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE: | 475 | case USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE: |
339 | rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, | 476 | rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, |
340 | "Genius Gila Gaming Mouse"); | 477 | "Genius Gila Gaming Mouse"); |
@@ -418,6 +555,7 @@ static int kye_probe(struct hid_device *hdev, const struct hid_device_id *id) | |||
418 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: | 555 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X: |
419 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2: | 556 | case USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2: |
420 | case USB_DEVICE_ID_KYE_EASYPEN_M610X: | 557 | case USB_DEVICE_ID_KYE_EASYPEN_M610X: |
558 | case USB_DEVICE_ID_KYE_PENSKETCH_M912: | ||
421 | ret = kye_tablet_enable(hdev); | 559 | ret = kye_tablet_enable(hdev); |
422 | if (ret) { | 560 | if (ret) { |
423 | hid_err(hdev, "tablet enabling failed\n"); | 561 | hid_err(hdev, "tablet enabling failed\n"); |
@@ -457,6 +595,8 @@ static const struct hid_device_id kye_devices[] = { | |||
457 | USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, | 595 | USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, |
458 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, | 596 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
459 | USB_DEVICE_ID_GENIUS_MANTICORE) }, | 597 | USB_DEVICE_ID_GENIUS_MANTICORE) }, |
598 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, | ||
599 | USB_DEVICE_ID_KYE_PENSKETCH_M912) }, | ||
460 | { } | 600 | { } |
461 | }; | 601 | }; |
462 | MODULE_DEVICE_TABLE(hid, kye_devices); | 602 | MODULE_DEVICE_TABLE(hid, kye_devices); |
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c index 9be99a67bfe2..989c59a4b5c9 100644 --- a/drivers/hid/usbhid/hid-quirks.c +++ b/drivers/hid/usbhid/hid-quirks.c | |||
@@ -127,6 +127,7 @@ static const struct hid_blacklist { | |||
127 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, | 127 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X, HID_QUIRK_MULTI_INPUT }, |
128 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2, HID_QUIRK_MULTI_INPUT }, | 128 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_MOUSEPEN_I608X_2, HID_QUIRK_MULTI_INPUT }, |
129 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, | 129 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X, HID_QUIRK_MULTI_INPUT }, |
130 | { USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_PENSKETCH_M912, HID_QUIRK_MULTI_INPUT }, | ||
130 | { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, | 131 | { USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_DUOSENSE, HID_QUIRK_NO_INIT_REPORTS }, |
131 | { USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD, HID_QUIRK_NO_INIT_REPORTS }, | 132 | { USB_VENDOR_ID_SEMICO, USB_DEVICE_ID_SEMICO_USB_KEYKOARD, HID_QUIRK_NO_INIT_REPORTS }, |
132 | { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS }, | 133 | { USB_VENDOR_ID_SYNAPTICS, USB_DEVICE_ID_SYNAPTICS_LTS1, HID_QUIRK_NO_INIT_REPORTS }, |