Re: [PATCH] Support for Maltron L90 keyboard

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi William,

On Sun, Jan 13, 2019 at 7:41 PM William Whistler <wtbw@xxxxxxxxxx> wrote:
>
> Hello,
>
> I sent this patch back in September and haven't heard anything back.

Sorry for not coming back earlier to you. Actually, you haven't Cc-ed
linux-input@ and the email doesn't show up in my patch queue. Needless
to day that it got buried by hundreds of other email in my INBOX.

>
> This is my first attempt at submitting a kernel patch, so if I've done
> something incorrectly (procedurally or otherwise) please let me know!

Except for forgetting to CC the list, this seems OK from a rough point
of view. Even pinging the maintainer is a good thing to do, as we can
easily overlook patches.

>
> --
> Best regards,
>   William Whistler
>
>
> From 9f6cf93efecac336e872c9bb52dfd73c501a6786 Mon Sep 17 00:00:00 2001
> From: William Whistler <wtbw@xxxxxxxxxx>
> Date: Tue, 18 Sep 2018 11:09:33 +0100
> Subject: [PATCH] Support for Maltron L90 keyboard
>
>
> diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
> index 61e1953ff921..dcdce1273d6e 100644
> --- a/drivers/hid/Kconfig
> +++ b/drivers/hid/Kconfig
> @@ -577,6 +577,13 @@ config HID_MAGICMOUSE
>         Say Y here if you want support for the multi-touch features of the
>         Apple Wireless "Magic" Mouse and the Apple Wireless "Magic" Trackpad.
>
> +config HID_MALTRON
> +       tristate "Maltron L90 keyboard"
> +       depends on HID
> +       ---help---
> +       Support for the volume up/down, mute, and play/pause buttons.

I guess the driver also supports the other keys on the keyboard. Maybe
you should tell that this driver adds those various keys (well, there
are a lot of example in this file, I am sure you can make something
correct).

> +
> +
>  config HID_MAYFLASH
>         tristate "Mayflash game controller adapter force feedback"
>         depends on HID
> diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile
> index bd7ac53b75c5..ec82a913d22d 100644
> --- a/drivers/hid/Makefile
> +++ b/drivers/hid/Makefile
> @@ -65,6 +65,7 @@ obj-$(CONFIG_HID_LOGITECH)    += hid-logitech.o
>  obj-$(CONFIG_HID_LOGITECH_DJ)  += hid-logitech-dj.o
>  obj-$(CONFIG_HID_LOGITECH_HIDPP)       += hid-logitech-hidpp.o
>  obj-$(CONFIG_HID_MAGICMOUSE)   += hid-magicmouse.o
> +obj-$(CONFIG_HID_MALTRON)      += hid-maltron.o
>  obj-$(CONFIG_HID_MAYFLASH)     += hid-mf.o
>  obj-$(CONFIG_HID_MICROSOFT)    += hid-microsoft.o
>  obj-$(CONFIG_HID_MONTEREY)     += hid-monterey.o
> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
> index 5146ee029db4..07d701f6d388 100644
> --- a/drivers/hid/hid-ids.h
> +++ b/drivers/hid/hid-ids.h
> @@ -69,6 +69,7 @@
>
>  #define USB_VENDOR_ID_ALCOR            0x058f
>  #define USB_DEVICE_ID_ALCOR_USBRS232   0x9720
> +#define USB_DEVICE_ID_ALCOR_MALTRON_KB 0x9410
>
>  #define USB_VENDOR_ID_ALPS             0x0433
>  #define USB_DEVICE_ID_IBM_GAMEPAD      0x1101
> diff --git a/drivers/hid/hid-maltron.c b/drivers/hid/hid-maltron.c
> new file mode 100644
> index 000000000000..e10e68fdb412
> --- /dev/null
> +++ b/drivers/hid/hid-maltron.c
> @@ -0,0 +1,171 @@
> +/*
> + *  HID driver for Maltron L90
> + *
> + *  Copyright (c) 1999 Andreas Gal
> + *  Copyright (c) 2000-2005 Vojtech Pavlik <vojtech@xxxxxxx>
> + *  Copyright (c) 2005 Michael Haboustak <mike-@xxxxxxxxxxxx> for Concept2, Inc
> + *  Copyright (c) 2008 Jiri Slaby
> + *  Copyright (c) 2012 David Dillow <dave@xxxxxxxxxxxxxx>
> + *  Copyright (c) 2006-2013 Jiri Kosina
> + *  Copyright (c) 2013 Colin Leitner <colin.leitner@xxxxxxxxx>
> + *  Copyright (c) 2014-2016 Frank Praznik <frank.praznik@xxxxxxxxx>
> + *  Copyright (c) 2010 Richard Nauber <Richard.Nauber@xxxxxxxxx>
> + *  Copyright (c) 2016 Yuxuan Shui <yshuiv7@xxxxxxxxx>
> + *  Copyright (c) 2018 William Whistler <wtbw@xxxxxxxxxx>

That's a lot of copyright for a small driver that just does a report fixup.

> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the Free
> + * Software Foundation; either version 2 of the License, or (at your option)
> + * any later version.

You should use the SPDX tag now, and drop the license text.

> + */
> +
> +#include <linux/device.h>
> +#include <linux/hid.h>
> +#include <linux/module.h>
> +
> +#include "hid-ids.h"
> +
> +//The original buggy USB descriptor

No C++ comments. Please use /* */ even for one liners (so in the
report descriptors too).

And there is a script that checks for these kind of things, you should
really run it before hitting send:
./scripts/checkpatch.pl

Hint, you can run the script on your git tip by running:
`./scripts/checkpatch.pl -g HEAD`.

Currently, you have with this patch:
total: 200 errors, 5 warnings, 222 lines checked

That's a tad too much :)

There are rules we can break (the 80 chars one is one of those, but
trailing whitespaces or DOS line ending are not accepted).

> +static u8 maltron_rdesc_o[] = {
> +0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
> +0x09, 0x80,        // Usage (Sys Control)
> +0xA1, 0x01,        // Collection (Application)
> +0x85, 0x02,        //   Report ID (2)
> +0x75, 0x01,        //   Report Size (1)
> +0x95, 0x01,        //   Report Count (1)
> +0x15, 0x00,        //   Logical Minimum (0)
> +0x25, 0x01,        //   Logical Maximum (1)
> +0x09, 0x82,        //   Usage (Sys Sleep)
> +0x81, 0x06,        //   Input (Data,Var,Rel)
> +0x09, 0x82,        //   Usage (Sys Sleep)
> +0x81, 0x06,        //   Input (Data,Var,Rel)
> +0x09, 0x83,        //   Usage (Sys Wake Up)
> +0x81, 0x06,        //   Input (Data,Var,Rel)
> +0x75, 0x05,        //   Report Size (5)
> +0x81, 0x01,        //   Input (Const,Array,Abs)
> +0xC0,              // End Collection
> +0x05, 0x0C,        // Usage Page (Consumer)
> +0x09, 0x01,        // Usage (Consumer Control)
> +0xA1, 0x01,        // Collection (Application)
> +0x85, 0x03,        //   Report ID (3)
> +0x95, 0x01,        //   Report Count (1)
> +0x75, 0x10,        //   Report Size (16)
> +0x19, 0x00,        //   Usage Minimum (Unassigned)
> +0x2A, 0xFF, 0x7F,  //   Usage Maximum (0x7FFF)
> +0x81, 0x00,        //   Input (Data,Array,Abs)
> +0xC0,              // End Collection
> +0x06, 0x7F, 0xFF,  // Usage Page (Vendor Defined 0xFF7F)
> +0x09, 0x01,        // Usage (0x01)
> +0xA1, 0x01,        // Collection (Application)
> +0x85, 0x04,        //   Report ID (4)
> +0x95, 0x01,        //   Report Count (1)
> +0x75, 0x10,        //   Report Size (16)
> +0x19, 0x00,        //   Usage Minimum (0x00)
> +0x2A, 0xFF, 0x7F,  //   Usage Maximum (0x7FFF)
> +0x81, 0x00,        //   Input (Data,Array,Abs)
> +0x75, 0x02,        //   Report Size (2)
> +0x25, 0x02,        //   Logical Maximum (2)
> +0x09, 0x90,        //   Usage (0x90)
> +0xB1, 0x02,        //   Feature (Data,Var,Abs)
> +0x75, 0x06,        //   Report Size (6)
> +0xB1, 0x01,        //   Feature (Const,Array,Abs)
> +0x75, 0x01,        //   Report Size (1)
> +0x25, 0x01,        //   Logical Maximum (1)
> +0x05, 0x08,        //   Usage Page (LEDs)
> +0x09, 0x2A,        //   Usage (On-Line)
> +0x91, 0x02,        //   Output (Data,Var,Abs)
> +0x09, 0x4B,        //   Usage (Generic Indicator)
> +0x91, 0x02,        //   Output (Data,Var,Abs)
> +0x75, 0x06,        //   Report Size (6)
> +0x95, 0x01,        //   Report Count (1)
> +0x91, 0x01,        //   Output (Const,Array,Abs)
> +0xC0               // End Collection
> +};
> +
> +
> +//The patched USB descriptor, allowing media key events to be accepted as valid
> +static u8 maltron_rdesc[] = {
> +0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
> +0x09, 0x80,        // Usage (Sys Control)
> +0xA1, 0x01,        // Collection (Application)
> +0x85, 0x02,        //   Report ID (2)
> +0x75, 0x01,        //   Report Size (1)
> +0x95, 0x01,        //   Report Count (1)
> +0x14,              //   Logical Minimum
> +0x25, 0x01,        //   Logical Maximum (1)
> +0x09, 0x82,        //   Usage (Sys Sleep)
> +0x81, 0x06,        //   Input (Data,Var,Rel)
> +0x09, 0x82,        //   Usage (Sys Sleep)
> +0x81, 0x06,        //   Input (Data,Var,Rel)
> +0x09, 0x83,        //   Usage (Sys Wake Up)
> +0x81, 0x06,        //   Input (Data,Var,Rel)
> +0x75, 0x05,        //   Report Size (5)
> +0x81, 0x01,        //   Input (Const,Array,Abs)
> +0xC0,              // End Collection
> +0x05, 0x0C,        // Usage Page (Consumer)
> +0x09, 0x01,        // Usage (Consumer Control)
> +0xA1, 0x01,        // Collection (Application)
> +0x85, 0x03,        //   Report ID (3)
> +0x14,              //   Logical Minimum
> +0x26, 0xFF, 0x7F,  //   Logical Maximum (32767)
> +0x95, 0x01,        //   Report Count (1)
> +0x75, 0x10,        //   Report Size (16)
> +0x18,              //   Usage Minimum
> +0x2A, 0xFF, 0x7F,  //   Usage Maximum (0x7FFF)
> +0x80,              //   Input
> +0xC0,              // End Collection
> +0x06, 0x7F, 0xFF,  // Usage Page (Vendor Defined 0xFF7F)
> +0x09, 0x01,        // Usage (0x01)
> +0xA1, 0x01,        // Collection (Application)
> +0x85, 0x04,        //   Report ID (4)
> +0x95, 0x01,        //   Report Count (1)
> +0x75, 0x10,        //   Report Size (16)
> +0x18,              //   Usage Minimum
> +0x2A, 0xFF, 0x7F,  //   Usage Maximum (0x7FFF)
> +0x80,              //   Input
> +0x75, 0x02,        //   Report Size (2)
> +0x25, 0x02,        //   Logical Maximum (2)
> +0x09, 0x90,        //   Usage (0x90)
> +0xB1, 0x02,        //   Feature (Data,Var,Abs)
> +0x75, 0x06,        //   Report Size (6)
> +0xB1, 0x01,        //   Feature (Const,Array,Abs)
> +0x75, 0x01,        //   Report Size (1)
> +0x25, 0x01,        //   Logical Maximum (1)
> +0x05, 0x08,        //   Usage Page (LEDs)
> +0x09, 0x2A,        //   Usage (On-Line)
> +0x91, 0x02,        //   Output (Data,Var,Abs)
> +0x09, 0x4B,        //   Usage (Generic Indicator)
> +0x91, 0x02,        //   Output (Data,Var,Abs)
> +0x75, 0x06,        //   Report Size (6)
> +0x95, 0x01,        //   Report Count (1)
> +0x91, 0x01,        //   Output (Const,Array,Abs)
> +0xC0               // End Collection
> +};
> +
> +static __u8 *maltron_report_fixup(struct hid_device *hdev, __u8 *rdesc,
> +               unsigned int *rsize)

Personnal taste: please align the second line under 'struct hid_device'.

IIRC the kernel guidelines says to use 2 tabs, but I find it better to
align the parameters.

> +{
> +       if (*rsize == sizeof(maltron_rdesc_o)) {
> +               if (memcmp(maltron_rdesc_o, rdesc, sizeof(maltron_rdesc_o)) == 0) {
> +                       hid_info(hdev, "Replacing Maltron L90 Keyboard report descriptor\n");
> +                       *rsize = sizeof(maltron_rdesc);
> +                       return maltron_rdesc;
> +               }
> +       }
> +       return rdesc;
> +}
> +
> +static const struct hid_device_id maltron_devices[] = {
> +       { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_MALTRON_KB)},
> +       { }
> +};
> +MODULE_DEVICE_TABLE(hid, maltron_devices);
> +
> +static struct hid_driver maltron_driver = {
> +       .name = "maltron",
> +       .id_table = maltron_devices,
> +       .report_fixup = maltron_report_fixup
> +};
> +module_hid_driver(maltron_driver);
> +
> +MODULE_LICENSE("GPL");
> diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
> index 249d49b6b16c..c721e58dfbda 100644
> --- a/drivers/hid/hid-quirks.c
> +++ b/drivers/hid/hid-quirks.c
> @@ -479,6 +479,9 @@ static const struct hid_device_id hid_have_special_driver[] = {
>         { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_GAMECUBE1) },
>         { HID_USB_DEVICE(USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_GAMECUBE2) },
>  #endif
> +#if IS_ENABLED(CONFIG_HID_MALTRON)
> +       { HID_USB_DEVICE(USB_VENDOR_ID_ALCOR, USB_DEVICE_ID_ALCOR_MALTRON_KB)},
> +#endif

Please drop this hunk. It shouldn't be required since v4.17 (or v4.16).
This is even more required that your driver is a keyboard one, and if
a distribution compiles it but doesn't include it in the initrd, then
your users can't type their LUKS password :/


Thanks for the submission. This is a small driver that shouldn't take
too many revisions to apply.

Cheers,
Benjamin

>  #if IS_ENABLED(CONFIG_HID_MICROSOFT)
>         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500) },
>         { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_KEYBOARD) },
>
>
> --
> Best regards,
>   William Whistler



[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux