HID: corsair: Add driver Scimitar Pro RGB gaming mouse 1b1c:1b3e support to hid-corsair
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>
This commit is contained in:
parent
deaba63699
commit
01adc47e88
|
@ -190,6 +190,7 @@ config HID_CORSAIR
|
||||||
|
|
||||||
Supported devices:
|
Supported devices:
|
||||||
- Vengeance K90
|
- Vengeance K90
|
||||||
|
- Scimitar PRO RGB
|
||||||
|
|
||||||
config HID_PRODIKEYS
|
config HID_PRODIKEYS
|
||||||
tristate "Prodikeys PC-MIDI Keyboard support"
|
tristate "Prodikeys PC-MIDI Keyboard support"
|
||||||
|
|
|
@ -1870,6 +1870,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
|
{ 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_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_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_CREATIVELABS, USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) },
|
{ 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) },
|
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, USB_DEVICE_ID_CYPRESS_BARCODE_1) },
|
||||||
|
|
|
@ -3,8 +3,10 @@
|
||||||
*
|
*
|
||||||
* Supported devices:
|
* Supported devices:
|
||||||
* - Vengeance K90 Keyboard
|
* - Vengeance K90 Keyboard
|
||||||
|
* - Scimitar PRO RGB Gaming Mouse
|
||||||
*
|
*
|
||||||
* Copyright (c) 2015 Clement Vuchener
|
* Copyright (c) 2015 Clement Vuchener
|
||||||
|
* Copyright (c) 2017 Oscar Campos
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -670,10 +672,51 @@ static int corsair_input_mapping(struct hid_device *dev,
|
||||||
return 0;
|
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[] = {
|
static const struct hid_device_id corsair_devices[] = {
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90),
|
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90),
|
||||||
.driver_data = CORSAIR_USE_K90_MACRO |
|
.driver_data = CORSAIR_USE_K90_MACRO |
|
||||||
CORSAIR_USE_K90_BACKLIGHT },
|
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,
|
.event = corsair_event,
|
||||||
.remove = corsair_remove,
|
.remove = corsair_remove,
|
||||||
.input_mapping = corsair_input_mapping,
|
.input_mapping = corsair_input_mapping,
|
||||||
|
.report_fixup = corsair_mouse_report_fixup,
|
||||||
};
|
};
|
||||||
|
|
||||||
module_hid_driver(corsair_driver);
|
module_hid_driver(corsair_driver);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
/* Original K90 driver author */
|
||||||
MODULE_AUTHOR("Clement Vuchener");
|
MODULE_AUTHOR("Clement Vuchener");
|
||||||
|
/* Scimitar PRO RGB driver author */
|
||||||
|
MODULE_AUTHOR("Oscar Campos");
|
||||||
MODULE_DESCRIPTION("HID driver for Corsair devices");
|
MODULE_DESCRIPTION("HID driver for Corsair devices");
|
||||||
|
|
Loading…
Reference in New Issue