Re: [PATCH 1/1] HID: evision: Add preliminary support for EVision keyboards

From: Philippe Valembois
Date: Mon Jan 23 2023 - 16:25:10 EST


Hello,

Thanks for the review.
I just sent an updated patch taking your comments into account.

Regards,
Philippe Valembois

Le lun. 23 janv. 2023 à 08:57, Benjamin Tissoires
<benjamin.tissoires@xxxxxxxxxx> a écrit :
>
> On Sat, Dec 24, 2022 at 1:23 PM Philippe Valembois
> <lephilousophe@xxxxxxxxx> wrote:
> >
> > From: Philippe Valembois <lephilousophe@xxxxxxxxxxxxxxxxxxxxxxxx>
>
> Jiri, I have a doubt. Do we accept emails from users.noreply.github.com?
>
> >
> > 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@xxxxxxxxxxxxxxxxxxxxxxxx>
> > ---
> > drivers/hid/Kconfig | 7 ++++
> > drivers/hid/Makefile | 1 +
> > drivers/hid/hid-evision.c | 79 +++++++++++++++++++++++++++++++++++++++
> > 3 files changed, 87 insertions(+)
> > create mode 100644 drivers/hid/hid-evision.c
> >
> > diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
> > index e2a5d30c8..1320ea75c 100644
> > --- a/drivers/hid/Kconfig
> > +++ b/drivers/hid/Kconfig
> > @@ -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 USB_HID
>
> AFAICT, the driver only uses pure HID API, so you should be able to
> depend on HID, not just USB_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
> > diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
> > index e8014c1a2..bd01571dd 100644
> > --- a/drivers/hid/Makefile
> > +++ b/drivers/hid/Makefile
> > @@ -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
> > diff --git a/drivers/hid/hid-evision.c b/drivers/hid/hid-evision.c
> > new file mode 100644
> > index 000000000..6ea331575
> > --- /dev/null
> > +++ b/drivers/hid/hid-evision.c
> > @@ -0,0 +1,79 @@
> > +// 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 <linux/usb.h>
>
> Outside of hid_is_usb(), you are not using anything USB related, so
> this can be dropped
>
> > +
> > +
> > +#define USB_VENDOR_ID_EVISION 0x320f
> > +#define USB_DEVICE_ID_EVISION_ICL01 0x5041
>
> We tend to add those variables in drivers/hid/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
>
> No C++ comments style please, use /* */ instead
>
> > + if ((usage->hid & HID_USAGE) >> 8 == 0x05)
> > + return -1;
> > + // Ignore key up event
>
> Same (and for any other // below).
>
> > + 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 int evision_probe(struct hid_device *hdev, const struct hid_device_id *id)
> > +{
> > + int ret;
> > +
> > + if (!hid_is_usb(hdev))
> > + return -EINVAL;
>
> This can be dropped...
>
> > +
> > + ret = hid_parse(hdev);
> > + if (ret) {
> > + hid_err(hdev, "EVision hid parse failed: %d\n", ret);
> > + return ret;
> > + }
> > +
> > + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT);
> > + if (ret) {
> > + hid_err(hdev, "EVision hw start failed: %d\n", ret);
> > + return ret;
> > + }
> > +
> > + return 0;
>
> ... which means the probe is the default one, meaning it can also be
> dropped from the patch :)
>
> > +}
> > +
> > +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,
> > + .probe = evision_probe,
>
> Just for completeness, remove that .probe line and your driver will
> behave the same and be smaller :)
>
> > +};
> > +module_hid_driver(evision_driver);
> > +
> > +MODULE_LICENSE("GPL");
> > --
> > 2.38.2
> >
>
> Cheers,
> Benjamin
>