HID: elecom: rewrite report based on model specific parameters
The report descriptor for EX-G wireless mouse (M-XGL20DLBK) is a bit different from that for trackball mice such as DEFT. For such mouse, the current `mouse_button_fixup` cannot be used as is, because it uses hard-coded indices for a report descriptor. Add parameters to `mouse_button_fixup` function, in order to support fixing report descriptors for more models. Signed-off-by: YOSHIOKA Takuma <lo48576@hard-wi.red> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
parent
d5530d82ef
commit
68d09380a6
|
@ -11,6 +11,7 @@
|
|||
* Copyright (c) 2017 Diego Elio Pettenò <flameeyes@flameeyes.eu>
|
||||
* Copyright (c) 2017 Alex Manoussakis <amanou@gnu.org>
|
||||
* Copyright (c) 2017 Tomasz Kramkowski <tk@the-tk.com>
|
||||
* Copyright (c) 2020 YOSHIOKA Takuma <lo48576@hard-wi.red>
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -29,25 +30,26 @@
|
|||
* report descriptor but it does not appear that these enable software to
|
||||
* control what the extra buttons map to. The only simple and straightforward
|
||||
* solution seems to involve fixing up the report descriptor.
|
||||
*
|
||||
* Report descriptor format:
|
||||
* Positions 13, 15, 21 and 31 store the button bit count, button usage minimum,
|
||||
* button usage maximum and padding bit count respectively.
|
||||
*/
|
||||
#define MOUSE_BUTTONS_MAX 8
|
||||
static void mouse_button_fixup(struct hid_device *hdev,
|
||||
__u8 *rdesc, unsigned int rsize,
|
||||
unsigned int button_bit_count,
|
||||
unsigned int padding_bit,
|
||||
unsigned int button_report_size,
|
||||
unsigned int button_usage_maximum,
|
||||
int nbuttons)
|
||||
{
|
||||
if (rsize < 32 || rdesc[12] != 0x95 ||
|
||||
rdesc[14] != 0x75 || rdesc[15] != 0x01 ||
|
||||
rdesc[20] != 0x29 || rdesc[30] != 0x75)
|
||||
if (rsize < 32 || rdesc[button_bit_count] != 0x95 ||
|
||||
rdesc[button_report_size] != 0x75 ||
|
||||
rdesc[button_report_size + 1] != 0x01 ||
|
||||
rdesc[button_usage_maximum] != 0x29 || rdesc[padding_bit] != 0x75)
|
||||
return;
|
||||
hid_info(hdev, "Fixing up Elecom mouse button count\n");
|
||||
nbuttons = clamp(nbuttons, 0, MOUSE_BUTTONS_MAX);
|
||||
rdesc[13] = nbuttons;
|
||||
rdesc[21] = nbuttons;
|
||||
rdesc[31] = MOUSE_BUTTONS_MAX - nbuttons;
|
||||
rdesc[button_bit_count + 1] = nbuttons;
|
||||
rdesc[button_usage_maximum + 1] = nbuttons;
|
||||
rdesc[padding_bit + 1] = MOUSE_BUTTONS_MAX - nbuttons;
|
||||
}
|
||||
|
||||
static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
||||
|
@ -65,13 +67,28 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc,
|
|||
case USB_DEVICE_ID_ELECOM_M_XT3URBK:
|
||||
case USB_DEVICE_ID_ELECOM_M_XT3DRBK:
|
||||
case USB_DEVICE_ID_ELECOM_M_XT4DRBK:
|
||||
mouse_button_fixup(hdev, rdesc, *rsize, 6);
|
||||
/*
|
||||
* Report descriptor format:
|
||||
* 12: button bit count
|
||||
* 30: padding bit count
|
||||
* 14: button report size
|
||||
* 20: button usage maximum
|
||||
*/
|
||||
mouse_button_fixup(hdev, rdesc, *rsize, 12, 30, 14, 20, 6);
|
||||
break;
|
||||
case USB_DEVICE_ID_ELECOM_M_DT1URBK:
|
||||
case USB_DEVICE_ID_ELECOM_M_DT1DRBK:
|
||||
case USB_DEVICE_ID_ELECOM_M_HT1URBK:
|
||||
case USB_DEVICE_ID_ELECOM_M_HT1DRBK:
|
||||
mouse_button_fixup(hdev, rdesc, *rsize, 8);
|
||||
/*mouse_button_fixup(hdev, rdesc, *rsize, 13, 15, 21, 31, 8);*/
|
||||
/*
|
||||
* Report descriptor format:
|
||||
* 12: button bit count
|
||||
* 30: padding bit count
|
||||
* 14: button report size
|
||||
* 20: button usage maximum
|
||||
*/
|
||||
mouse_button_fixup(hdev, rdesc, *rsize, 12, 30, 14, 20, 8);
|
||||
break;
|
||||
}
|
||||
return rdesc;
|
||||
|
|
Loading…
Reference in New Issue