HID: evision: Fix Report Descriptor for Evision Wireless Receiver 320f:226f

The mouse portion of the device's Report Descriptor declares 5 buttons but only
declares 3 usages (Button 1 through Button 3).  As a result events for the 2
side buttons are not generated.

Detect and repair the Report Descriptor if necessary by changing the Usage
Maximum value from Button 3 to Button 5.

[jkosina@suse.com: standardize changelog a little bit]
Reported-by: Artem <temabiill@gmail.com>
Closes: https://lore.kernel.org/all/CADYkRmrfhRf6VmQjc+su+mepyv=TsHc+aMcL6ryRZ5HTZ8pyFg@mail.gmail.com/
Signed-off-by: Terry Junge <linuxhid@cosmicgizmosystems.com>
Tested-by: Artem <temabiill@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
This commit is contained in:
Terry Junge 2025-11-19 17:49:27 -08:00 committed by Jiri Kosina
parent 36dcfa4685
commit baa120439a
3 changed files with 23 additions and 0 deletions

View File

@ -383,6 +383,7 @@ config HID_EVISION
help help
Support for some EVision keyboards. Note that this is needed only when Support for some EVision keyboards. Note that this is needed only when
applying customization using userspace programs. applying customization using userspace programs.
Support for some EVision devices requiring report descriptor fixups.
config HID_EZKEY config HID_EZKEY
tristate "Ezkey BTC 8193 keyboard" tristate "Ezkey BTC 8193 keyboard"

View File

@ -18,6 +18,10 @@ static int evision_input_mapping(struct hid_device *hdev, struct hid_input *hi,
struct hid_field *field, struct hid_usage *usage, struct hid_field *field, struct hid_usage *usage,
unsigned long **bit, int *max) unsigned long **bit, int *max)
{ {
/* mapping only applies to USB_DEVICE_ID_EVISION_ICL01 */
if (hdev->product != USB_DEVICE_ID_EVISION_ICL01)
return 0;
if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER) if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
return 0; return 0;
@ -37,8 +41,24 @@ static int evision_input_mapping(struct hid_device *hdev, struct hid_input *hi,
return 0; return 0;
} }
#define REP_DSC_SIZE 236
#define USAGE_MAX_INDEX 59
static const __u8 *evision_report_fixup(struct hid_device *hdev, __u8 *rdesc,
unsigned int *rsize)
{
if (hdev->product == USB_DEVICE_ID_EV_TELINK_RECEIVER &&
*rsize == REP_DSC_SIZE && rdesc[USAGE_MAX_INDEX] == 0x29 &&
rdesc[USAGE_MAX_INDEX + 1] == 3) {
hid_info(hdev, "fixing EVision:TeLink Receiver report descriptor\n");
rdesc[USAGE_MAX_INDEX + 1] = 5; // change usage max from 3 to 5
}
return rdesc;
}
static const struct hid_device_id evision_devices[] = { static const struct hid_device_id evision_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_EVISION, USB_DEVICE_ID_EVISION_ICL01) }, { HID_USB_DEVICE(USB_VENDOR_ID_EVISION, USB_DEVICE_ID_EVISION_ICL01) },
{ HID_USB_DEVICE(USB_VENDOR_ID_EVISION, USB_DEVICE_ID_EV_TELINK_RECEIVER) },
{ } { }
}; };
MODULE_DEVICE_TABLE(hid, evision_devices); MODULE_DEVICE_TABLE(hid, evision_devices);
@ -47,6 +67,7 @@ static struct hid_driver evision_driver = {
.name = "evision", .name = "evision",
.id_table = evision_devices, .id_table = evision_devices,
.input_mapping = evision_input_mapping, .input_mapping = evision_input_mapping,
.report_fixup = evision_report_fixup,
}; };
module_hid_driver(evision_driver); module_hid_driver(evision_driver);

View File

@ -477,6 +477,7 @@
#define USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II 0x0118 #define USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II 0x0118
#define USB_VENDOR_ID_EVISION 0x320f #define USB_VENDOR_ID_EVISION 0x320f
#define USB_DEVICE_ID_EV_TELINK_RECEIVER 0x226f
#define USB_DEVICE_ID_EVISION_ICL01 0x5041 #define USB_DEVICE_ID_EVISION_ICL01 0x5041
#define USB_VENDOR_ID_FFBEAST 0x045b #define USB_VENDOR_ID_FFBEAST 0x045b