Last active
November 28, 2020 14:26
-
-
Save lo48576/4144f4e536b01db4304f1f7bde451b0a to your computer and use it in GitHub Desktop.
Linux 5.10-rc4 用の、 ELECOM EX-G (M-XGL20DLBK) の Fn1〜Fn3 ボタンを使えるようにするパッチ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 8ddcf4c694ec89bc1ea7a1b48be9786d8b00c928 Mon Sep 17 00:00:00 2001 | |
From: YOSHIOKA Takuma <[email protected]> | |
Date: Sun, 22 Nov 2020 04:36:34 +0900 | |
Subject: [PATCH 1/2] 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 <[email protected]> | |
--- | |
drivers/hid/hid-elecom.c | 40 ++++++++++++++++++++++++++++------------ | |
1 file changed, 28 insertions(+), 12 deletions(-) | |
diff --git a/drivers/hid/hid-elecom.c b/drivers/hid/hid-elecom.c | |
index 8c712d4bc075..e869e97c4605 100644 | |
--- a/drivers/hid/hid-elecom.c | |
+++ b/drivers/hid/hid-elecom.c | |
@@ -11,6 +11,7 @@ | |
* Copyright (c) 2017 Diego Elio Pettenò <[email protected]> | |
* Copyright (c) 2017 Alex Manoussakis <[email protected]> | |
* Copyright (c) 2017 Tomasz Kramkowski <[email protected]> | |
+ * Copyright (c) 2020 YOSHIOKA Takuma <[email protected]> | |
*/ | |
/* | |
@@ -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,27 @@ 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); | |
+ /* | |
+ * 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; | |
-- | |
2.29.2 | |
From 050a80197bc86337a8cfe836fc39f2531e7814d7 Mon Sep 17 00:00:00 2001 | |
From: YOSHIOKA Takuma <[email protected]> | |
Date: Sun, 22 Nov 2020 04:43:06 +0900 | |
Subject: [PATCH 2/2] HID: elecom: add support for EX-G M-XGL20DLBK wireless | |
mouse | |
Enables three buttons (Fn1, Fn2, and Fn3) on the ELECOM M-XGL20DLBK | |
wireless mouse. | |
While this mouse is EX-G brand, report descriptor is a bit different | |
from EX-G trackball mouse. To enable extra buttons, report should be | |
rewritten in a similar way to trackballs, but with different position | |
parameters. | |
Signed-off-by: YOSHIOKA Takuma <[email protected]> | |
--- | |
drivers/hid/hid-elecom.c | 11 +++++++++++ | |
drivers/hid/hid-ids.h | 1 + | |
drivers/hid/hid-quirks.c | 1 + | |
3 files changed, 13 insertions(+) | |
diff --git a/drivers/hid/hid-elecom.c b/drivers/hid/hid-elecom.c | |
index e869e97c4605..e59e9911fc37 100644 | |
--- a/drivers/hid/hid-elecom.c | |
+++ b/drivers/hid/hid-elecom.c | |
@@ -64,6 +64,16 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |
rdesc[47] = 0x00; | |
} | |
break; | |
+ case USB_DEVICE_ID_ELECOM_M_XGL20DLBK: | |
+ /* | |
+ * Report descriptor format: | |
+ * 20: button bit count | |
+ * 28: padding bit count | |
+ * 22: button report size | |
+ * 14: button usage maximum | |
+ */ | |
+ mouse_button_fixup(hdev, rdesc, *rsize, 20, 28, 22, 14, 8); | |
+ break; | |
case USB_DEVICE_ID_ELECOM_M_XT3URBK: | |
case USB_DEVICE_ID_ELECOM_M_XT3DRBK: | |
case USB_DEVICE_ID_ELECOM_M_XT4DRBK: | |
@@ -95,6 +105,7 @@ static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc, | |
static const struct hid_device_id elecom_devices[] = { | |
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, | |
+ { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XGL20DLBK) }, | |
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK) }, | |
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK) }, | |
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT4DRBK) }, | |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | |
index d69842f79fc6..a29f4dacf640 100644 | |
--- a/drivers/hid/hid-ids.h | |
+++ b/drivers/hid/hid-ids.h | |
@@ -388,6 +388,7 @@ | |
#define USB_VENDOR_ID_ELECOM 0x056e | |
#define USB_DEVICE_ID_ELECOM_BM084 0x0061 | |
+#define USB_DEVICE_ID_ELECOM_M_XGL20DLBK 0x00e6 | |
#define USB_DEVICE_ID_ELECOM_M_XT3URBK 0x00fb | |
#define USB_DEVICE_ID_ELECOM_M_XT3DRBK 0x00fc | |
#define USB_DEVICE_ID_ELECOM_M_XT4DRBK 0x00fd | |
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c | |
index 7a2be0205dfd..9355d92c6f14 100644 | |
--- a/drivers/hid/hid-quirks.c | |
+++ b/drivers/hid/hid-quirks.c | |
@@ -361,6 +361,7 @@ static const struct hid_device_id hid_have_special_driver[] = { | |
#endif | |
#if IS_ENABLED(CONFIG_HID_ELECOM) | |
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, | |
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XGL20DLBK) }, | |
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3URBK) }, | |
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT3DRBK) }, | |
{ HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_M_XT4DRBK) }, | |
-- | |
2.29.2 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment