| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: Oscar Campos <oscar.campos@member.fsf.org> |
| Date: Mon, 6 Mar 2017 21:02:39 +0000 |
| Subject: HID: corsair: Add driver Scimitar Pro RGB gaming mouse 1b1c:1b3e support to hid-corsair |
| |
| From: Oscar Campos <oscar.campos@member.fsf.org> |
| |
| |
| [ Upstream commit 01adc47e885f1127b29d76d0dfb21d8262f9d6b4 ] |
| |
| This mouse sold by Corsair as Scimitar PRO RGB defines two consecutive |
| Logical Minimum items in its Application (Consumer.0001) report making |
| it non parseable. This patch fixes the report descriptor overriding |
| byte 77 in rdesc from 0x16 (Logical Minimum with 16 bits value) to 0x26 |
| (Logical Maximum with 16 bits value). |
| |
| Signed-off-by: Oscar Campos <oscar.campos@member.fsf.org> |
| Signed-off-by: Jiri Kosina <jkosina@suse.cz> |
| Signed-off-by: Sasha Levin <alexander.levin@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/hid/Kconfig | 1 |
| drivers/hid/hid-core.c | 1 |
| drivers/hid/hid-corsair.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ |
| 3 files changed, 49 insertions(+) |
| |
| --- a/drivers/hid/Kconfig |
| +++ b/drivers/hid/Kconfig |
| @@ -190,6 +190,7 @@ config HID_CORSAIR |
| |
| Supported devices: |
| - Vengeance K90 |
| + - Scimitar PRO RGB |
| |
| config HID_PRODIKEYS |
| tristate "Prodikeys PC-MIDI Keyboard support" |
| --- a/drivers/hid/hid-core.c |
| +++ b/drivers/hid/hid-core.c |
| @@ -1872,6 +1872,7 @@ static const struct hid_device_id hid_ha |
| { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) }, |
| { HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_ACER_SWITCH12) }, |
| { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90) }, |
| + { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB) }, |
| { HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) }, |
| { HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) }, |
| { HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) }, |
| --- a/drivers/hid/hid-corsair.c |
| +++ b/drivers/hid/hid-corsair.c |
| @@ -3,8 +3,10 @@ |
| * |
| * Supported devices: |
| * - Vengeance K90 Keyboard |
| + * - Scimitar PRO RGB Gaming Mouse |
| * |
| * Copyright (c) 2015 Clement Vuchener |
| + * Copyright (c) 2017 Oscar Campos |
| */ |
| |
| /* |
| @@ -670,10 +672,51 @@ static int corsair_input_mapping(struct |
| return 0; |
| } |
| |
| +/* |
| + * The report descriptor of Corsair Scimitar RGB Pro gaming mouse is |
| + * non parseable as they define two consecutive Logical Minimum for |
| + * the Usage Page (Consumer) in rdescs bytes 75 and 77 being 77 0x16 |
| + * that should be obviousy 0x26 for Logical Magimum of 16 bits. This |
| + * prevents poper parsing of the report descriptor due Logical |
| + * Minimum being larger than Logical Maximum. |
| + * |
| + * This driver fixes the report descriptor for: |
| + * - USB ID b1c:1b3e, sold as Scimitar RGB Pro Gaming mouse |
| + */ |
| + |
| +static __u8 *corsair_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
| + unsigned int *rsize) |
| +{ |
| + struct usb_interface *intf = to_usb_interface(hdev->dev.parent); |
| + |
| + if (intf->cur_altsetting->desc.bInterfaceNumber == 1) { |
| + /* |
| + * Corsair Scimitar RGB Pro report descriptor is broken and |
| + * defines two different Logical Minimum for the Consumer |
| + * Application. The byte 77 should be a 0x26 defining a 16 |
| + * bits integer for the Logical Maximum but it is a 0x16 |
| + * instead (Logical Minimum) |
| + */ |
| + switch (hdev->product) { |
| + case USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB: |
| + if (*rsize >= 172 && rdesc[75] == 0x15 && rdesc[77] == 0x16 |
| + && rdesc[78] == 0xff && rdesc[79] == 0x0f) { |
| + hid_info(hdev, "Fixing up report descriptor\n"); |
| + rdesc[77] = 0x26; |
| + } |
| + break; |
| + } |
| + |
| + } |
| + return rdesc; |
| +} |
| + |
| static const struct hid_device_id corsair_devices[] = { |
| { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90), |
| .driver_data = CORSAIR_USE_K90_MACRO | |
| CORSAIR_USE_K90_BACKLIGHT }, |
| + { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, |
| + USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB) }, |
| {} |
| }; |
| |
| @@ -686,10 +729,14 @@ static struct hid_driver corsair_driver |
| .event = corsair_event, |
| .remove = corsair_remove, |
| .input_mapping = corsair_input_mapping, |
| + .report_fixup = corsair_mouse_report_fixup, |
| }; |
| |
| module_hid_driver(corsair_driver); |
| |
| MODULE_LICENSE("GPL"); |
| +/* Original K90 driver author */ |
| MODULE_AUTHOR("Clement Vuchener"); |
| +/* Scimitar PRO RGB driver author */ |
| +MODULE_AUTHOR("Oscar Campos"); |
| MODULE_DESCRIPTION("HID driver for Corsair devices"); |