HID: evision: Add preliminary support for EVision keyboards
For now only supports one model and only filters out bogus reports sent when the keyboard has been configured through hidraw. Without this, as events are not released, soft repeat floods userspace with unknown key events. Signed-off-by: Philippe Valembois <lephilousophe@gmail.com> Link: https://lore.kernel.org/r/20230125211511.12266-1-lephilousophe@gmail.com Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
This commit is contained in:
parent
7287904c87
commit
f5cd71cfdb
@ -329,6 +329,13 @@ config HID_ELO
|
||||
Support for the ELO USB 4000/4500 touchscreens. Note that this is for
|
||||
different devices than those handled by CONFIG_TOUCHSCREEN_USB_ELO.
|
||||
|
||||
config HID_EVISION
|
||||
tristate "EVision Keyboards Support"
|
||||
depends on HID
|
||||
help
|
||||
Support for some EVision keyboards. Note that this is needed only when
|
||||
applying customization using userspace programs.
|
||||
|
||||
config HID_EZKEY
|
||||
tristate "Ezkey BTC 8193 keyboard"
|
||||
default !EXPERT
|
||||
|
@ -45,6 +45,7 @@ obj-$(CONFIG_HID_EMS_FF) += hid-emsff.o
|
||||
obj-$(CONFIG_HID_ELAN) += hid-elan.o
|
||||
obj-$(CONFIG_HID_ELECOM) += hid-elecom.o
|
||||
obj-$(CONFIG_HID_ELO) += hid-elo.o
|
||||
obj-$(CONFIG_HID_EVISION) += hid-evision.o
|
||||
obj-$(CONFIG_HID_EZKEY) += hid-ezkey.o
|
||||
obj-$(CONFIG_HID_FT260) += hid-ft260.o
|
||||
obj-$(CONFIG_HID_GEMBIRD) += hid-gembird.o
|
||||
|
53
drivers/hid/hid-evision.c
Normal file
53
drivers/hid/hid-evision.c
Normal file
@ -0,0 +1,53 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/*
|
||||
* HID driver for EVision devices
|
||||
* For now, only ignore bogus consumer reports
|
||||
* sent after the keyboard has been configured
|
||||
*
|
||||
* Copyright (c) 2022 Philippe Valembois
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/hid.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "hid-ids.h"
|
||||
|
||||
static int evision_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
struct hid_field *field, struct hid_usage *usage,
|
||||
unsigned long **bit, int *max)
|
||||
{
|
||||
if ((usage->hid & HID_USAGE_PAGE) != HID_UP_CONSUMER)
|
||||
return 0;
|
||||
|
||||
/* Ignore key down event */
|
||||
if ((usage->hid & HID_USAGE) >> 8 == 0x05)
|
||||
return -1;
|
||||
/* Ignore key up event */
|
||||
if ((usage->hid & HID_USAGE) >> 8 == 0x06)
|
||||
return -1;
|
||||
|
||||
switch (usage->hid & HID_USAGE) {
|
||||
/* Ignore configuration saved event */
|
||||
case 0x0401: return -1;
|
||||
/* Ignore reset event */
|
||||
case 0x0402: return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct hid_device_id evision_devices[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_EVISION, USB_DEVICE_ID_EVISION_ICL01) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(hid, evision_devices);
|
||||
|
||||
static struct hid_driver evision_driver = {
|
||||
.name = "evision",
|
||||
.id_table = evision_devices,
|
||||
.input_mapping = evision_input_mapping,
|
||||
};
|
||||
module_hid_driver(evision_driver);
|
||||
|
||||
MODULE_LICENSE("GPL");
|
@ -445,6 +445,9 @@
|
||||
#define USB_VENDOR_ID_EMS 0x2006
|
||||
#define USB_DEVICE_ID_EMS_TRIO_LINKER_PLUS_II 0x0118
|
||||
|
||||
#define USB_VENDOR_ID_EVISION 0x320f
|
||||
#define USB_DEVICE_ID_EVISION_ICL01 0x5041
|
||||
|
||||
#define USB_VENDOR_ID_FLATFROG 0x25b5
|
||||
#define USB_DEVICE_ID_MULTITOUCH_3200 0x0002
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user