diff options
| -rw-r--r-- | drivers/hid/Kconfig | 6 | ||||
| -rw-r--r-- | drivers/hid/hid-core.c | 2 | ||||
| -rw-r--r-- | drivers/hid/hid-elecom.c | 62 | ||||
| -rw-r--r-- | drivers/hid/hid-ids.h | 2 |
4 files changed, 61 insertions, 11 deletions
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index fe40e5e499dd..687705c50794 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig | |||
| @@ -275,10 +275,12 @@ config HID_EMS_FF | |||
| 275 | - Trio Linker Plus II | 275 | - Trio Linker Plus II |
| 276 | 276 | ||
| 277 | config HID_ELECOM | 277 | config HID_ELECOM |
| 278 | tristate "ELECOM BM084 bluetooth mouse" | 278 | tristate "ELECOM HID devices" |
| 279 | depends on HID | 279 | depends on HID |
| 280 | ---help--- | 280 | ---help--- |
| 281 | Support for the ELECOM BM084 (bluetooth mouse). | 281 | Support for ELECOM devices: |
| 282 | - BM084 Bluetooth Mouse | ||
| 283 | - DEFT Trackball (Wired and wireless) | ||
| 282 | 284 | ||
| 283 | config HID_ELO | 285 | config HID_ELO |
| 284 | tristate "ELO USB 4000/4500 touchscreen" | 286 | tristate "ELO USB 4000/4500 touchscreen" |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 37084b645785..38d041510e1d 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1891,6 +1891,8 @@ static const struct hid_device_id hid_have_special_driver[] = { | |||
| 1891 | { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, USB_DEVICE_ID_DREAM_CHEEKY_WN) }, | 1891 | { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, USB_DEVICE_ID_DREAM_CHEEKY_WN) }, |
| 1892 | { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, USB_DEVICE_ID_DREAM_CHEEKY_FA) }, | 1892 | { HID_USB_DEVICE(USB_VENDOR_ID_DREAM_CHEEKY, USB_DEVICE_ID_DREAM_CHEEKY_FA) }, |
| 1893 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, | 1893 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, |
| 1894 | { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_DEFT_WIRED) }, | ||
| 1895 | { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_DEFT_WIRELESS) }, | ||
| 1894 | { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) }, | 1896 | { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0009) }, |
| 1895 | { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0030) }, | 1897 | { HID_USB_DEVICE(USB_VENDOR_ID_ELO, 0x0030) }, |
| 1896 | { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_ACCUTOUCH_2216) }, | 1898 | { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_ACCUTOUCH_2216) }, |
diff --git a/drivers/hid/hid-elecom.c b/drivers/hid/hid-elecom.c index 6e3848a8d8dd..e2c7465df69f 100644 --- a/drivers/hid/hid-elecom.c +++ b/drivers/hid/hid-elecom.c | |||
| @@ -1,10 +1,8 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * HID driver for Elecom BM084 (bluetooth mouse). | 2 | * HID driver for ELECOM devices. |
| 3 | * Removes a non-existing horizontal wheel from | ||
| 4 | * the HID descriptor. | ||
| 5 | * (This module is based on "hid-ortek".) | ||
| 6 | * | ||
| 7 | * Copyright (c) 2010 Richard Nauber <Richard.Nauber@gmail.com> | 3 | * Copyright (c) 2010 Richard Nauber <Richard.Nauber@gmail.com> |
| 4 | * Copyright (c) 2016 Yuxuan Shui <yshuiv7@gmail.com> | ||
| 5 | * Copyright (c) 2017 Diego Elio Pettenò <flameeyes@flameeyes.eu> | ||
| 8 | */ | 6 | */ |
| 9 | 7 | ||
| 10 | /* | 8 | /* |
| @@ -23,15 +21,61 @@ | |||
| 23 | static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc, | 21 | static __u8 *elecom_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
| 24 | unsigned int *rsize) | 22 | unsigned int *rsize) |
| 25 | { | 23 | { |
| 26 | if (*rsize >= 48 && rdesc[46] == 0x05 && rdesc[47] == 0x0c) { | 24 | switch (hdev->product) { |
| 27 | hid_info(hdev, "Fixing up Elecom BM084 report descriptor\n"); | 25 | case USB_DEVICE_ID_ELECOM_BM084: |
| 28 | rdesc[47] = 0x00; | 26 | /* The BM084 Bluetooth mouse includes a non-existing horizontal |
| 27 | * wheel in the HID descriptor. */ | ||
| 28 | if (*rsize >= 48 && rdesc[46] == 0x05 && rdesc[47] == 0x0c) { | ||
| 29 | hid_info(hdev, "Fixing up Elecom BM084 report descriptor\n"); | ||
| 30 | rdesc[47] = 0x00; | ||
| 31 | } | ||
| 32 | break; | ||
| 33 | case USB_DEVICE_ID_ELECOM_DEFT_WIRED: | ||
| 34 | case USB_DEVICE_ID_ELECOM_DEFT_WIRELESS: | ||
| 35 | /* The DEFT trackball has eight buttons, but its descriptor only | ||
| 36 | * reports five, disabling the three Fn buttons on the top of | ||
| 37 | * the mouse. | ||
| 38 | * | ||
| 39 | * Apply the following diff to the descriptor: | ||
| 40 | * | ||
| 41 | * Collection (Physical), Collection (Physical), | ||
| 42 | * Report ID (1), Report ID (1), | ||
| 43 | * Report Count (5), -> Report Count (8), | ||
| 44 | * Report Size (1), Report Size (1), | ||
| 45 | * Usage Page (Button), Usage Page (Button), | ||
| 46 | * Usage Minimum (01h), Usage Minimum (01h), | ||
| 47 | * Usage Maximum (05h), -> Usage Maximum (08h), | ||
| 48 | * Logical Minimum (0), Logical Minimum (0), | ||
| 49 | * Logical Maximum (1), Logical Maximum (1), | ||
| 50 | * Input (Variable), Input (Variable), | ||
| 51 | * Report Count (1), -> Report Count (0), | ||
| 52 | * Report Size (3), Report Size (3), | ||
| 53 | * Input (Constant), Input (Constant), | ||
| 54 | * Report Size (16), Report Size (16), | ||
| 55 | * Report Count (2), Report Count (2), | ||
| 56 | * Usage Page (Desktop), Usage Page (Desktop), | ||
| 57 | * Usage (X), Usage (X), | ||
| 58 | * Usage (Y), Usage (Y), | ||
| 59 | * Logical Minimum (-32768), Logical Minimum (-32768), | ||
| 60 | * Logical Maximum (32767), Logical Maximum (32767), | ||
| 61 | * Input (Variable, Relative), Input (Variable, Relative), | ||
| 62 | * End Collection, End Collection, | ||
| 63 | */ | ||
| 64 | if (*rsize == 213 && rdesc[13] == 5 && rdesc[21] == 5) { | ||
| 65 | hid_info(hdev, "Fixing up Elecom DEFT Fn buttons\n"); | ||
| 66 | rdesc[13] = 8; /* Button/Variable Report Count */ | ||
| 67 | rdesc[21] = 8; /* Button/Variable Usage Maximum */ | ||
| 68 | rdesc[29] = 0; /* Button/Constant Report Count */ | ||
| 69 | } | ||
| 70 | break; | ||
| 29 | } | 71 | } |
| 30 | return rdesc; | 72 | return rdesc; |
| 31 | } | 73 | } |
| 32 | 74 | ||
| 33 | static const struct hid_device_id elecom_devices[] = { | 75 | static const struct hid_device_id elecom_devices[] = { |
| 34 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084)}, | 76 | { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_BM084) }, |
| 77 | { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_DEFT_WIRED) }, | ||
| 78 | { HID_USB_DEVICE(USB_VENDOR_ID_ELECOM, USB_DEVICE_ID_ELECOM_DEFT_WIRELESS) }, | ||
| 35 | { } | 79 | { } |
| 36 | }; | 80 | }; |
| 37 | MODULE_DEVICE_TABLE(hid, elecom_devices); | 81 | MODULE_DEVICE_TABLE(hid, elecom_devices); |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 643390ba749d..8e8a1baee090 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -358,6 +358,8 @@ | |||
| 358 | 358 | ||
| 359 | #define USB_VENDOR_ID_ELECOM 0x056e | 359 | #define USB_VENDOR_ID_ELECOM 0x056e |
| 360 | #define USB_DEVICE_ID_ELECOM_BM084 0x0061 | 360 | #define USB_DEVICE_ID_ELECOM_BM084 0x0061 |
| 361 | #define USB_DEVICE_ID_ELECOM_DEFT_WIRED 0x00fe | ||
| 362 | #define USB_DEVICE_ID_ELECOM_DEFT_WIRELESS 0x00ff | ||
| 361 | 363 | ||
| 362 | #define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34 | 364 | #define USB_VENDOR_ID_DREAM_CHEEKY 0x1d34 |
| 363 | #define USB_DEVICE_ID_DREAM_CHEEKY_WN 0x0004 | 365 | #define USB_DEVICE_ID_DREAM_CHEEKY_WN 0x0004 |
