HID: macally: Add support for Macally ikey keyboard
authorAlex Henrie <alexhenrie24@gmail.com>
Wed, 3 Apr 2019 03:18:17 +0000 (21:18 -0600)
committerBenjamin Tissoires <benjamin.tissoires@redhat.com>
Wed, 3 Apr 2019 15:14:13 +0000 (17:14 +0200)
This enables the power and equals keys on the Macally ikey keyboard.

Based on the Cougar gaming keyboard HID driver, which uses the same
vendor ID.

Signed-off-by: Alex Henrie <alexhenrie24@gmail.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
drivers/hid/Kconfig
drivers/hid/Makefile
drivers/hid/hid-ids.h
drivers/hid/hid-macally.c [new file with mode: 0644]

index 6ca8d32..aef4a2a 100644 (file)
@@ -230,6 +230,16 @@ config HID_COUGAR
        Supported devices:
        - Cougar 500k Gaming Keyboard
 
+config HID_MACALLY
+       tristate "Macally devices"
+       depends on HID
+       help
+       Support for Macally devices that are not fully compliant with the
+       HID standard.
+
+       supported devices:
+       - Macally ikey keyboard
+
 config HID_PRODIKEYS
        tristate "Prodikeys PC-MIDI Keyboard support"
        depends on HID && SND
index 170163b..44b9cae 100644 (file)
@@ -65,6 +65,7 @@ obj-$(CONFIG_HID_LENOVO)      += hid-lenovo.o
 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_MACALLY)      += hid-macally.o
 obj-$(CONFIG_HID_MAGICMOUSE)   += hid-magicmouse.o
 obj-$(CONFIG_HID_MALTRON)      += hid-maltron.o
 obj-$(CONFIG_HID_MAYFLASH)     += hid-mf.o
index b6d93f4..aacc753 100644 (file)
 #define USB_DEVICE_ID_SINO_LITE_CONTROLLER     0x3008
 
 #define USB_VENDOR_ID_SOLID_YEAR                       0x060b
+#define USB_DEVICE_ID_MACALLY_IKEY_KEYBOARD            0x0001
 #define USB_DEVICE_ID_COUGAR_500K_GAMING_KEYBOARD      0x500a
 #define USB_DEVICE_ID_COUGAR_700K_GAMING_KEYBOARD      0x700a
 
diff --git a/drivers/hid/hid-macally.c b/drivers/hid/hid-macally.c
new file mode 100644 (file)
index 0000000..9a4fc7d
--- /dev/null
@@ -0,0 +1,45 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ *  HID driver for quirky Macally devices
+ *
+ *  Copyright (c) 2019 Alex Henrie <alexhenrie24@gmail.com>
+ */
+
+#include <linux/hid.h>
+#include <linux/module.h>
+
+#include "hid-ids.h"
+
+MODULE_AUTHOR("Alex Henrie <alexhenrie24@gmail.com>");
+MODULE_DESCRIPTION("Macally devices");
+MODULE_LICENSE("GPL");
+
+/*
+ * The Macally ikey keyboard says that its logical and usage maximums are both
+ * 101, but the power key is 102 and the equals key is 103
+ */
+static __u8 *macally_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+                                unsigned int *rsize)
+{
+       if (*rsize >= 60 && rdesc[53] == 0x65 && rdesc[59] == 0x65) {
+               hid_info(hdev,
+                       "fixing up Macally ikey keyboard report descriptor\n");
+               rdesc[53] = rdesc[59] = 0x67;
+       }
+       return rdesc;
+}
+
+static struct hid_device_id macally_id_table[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_SOLID_YEAR,
+                        USB_DEVICE_ID_MACALLY_IKEY_KEYBOARD) },
+       { }
+};
+MODULE_DEVICE_TABLE(hid, macally_id_table);
+
+static struct hid_driver macally_driver = {
+       .name                   = "macally",
+       .id_table               = macally_id_table,
+       .report_fixup           = macally_report_fixup,
+};
+
+module_hid_driver(macally_driver);