HID: add support for PenMount HID TouchScreen Driver
authorChristian Gmeiner <christian.gmeiner@gmail.com>
Wed, 3 Sep 2014 08:33:53 +0000 (10:33 +0200)
committerJiri Kosina <jkosina@suse.cz>
Thu, 4 Sep 2014 09:23:51 +0000 (11:23 +0200)
This patch adds a seperate hid-penmount driver to work
around an issue with the HID report descriptor. The
descriptor does not contain the ContactID usage and as
result the touchscreen is represented as normal mouse
to the system.

This driver maps the button 0 emitted by the touchscreen
to BTN_TOUCH. This makes it possible to use touch events
in userspace.

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
drivers/hid/Kconfig
drivers/hid/Makefile
drivers/hid/hid-core.c
drivers/hid/hid-ids.h
drivers/hid/hid-penmount.c [new file with mode: 0644]

index c18d5d71062d48828148e128ac3019d06a090e99..f42df4dd58d285dff4eac05ba9ff7e8688bf4de9 100644 (file)
@@ -530,6 +530,17 @@ config PANTHERLORD_FF
          Say Y here if you have a PantherLord/GreenAsia based game controller
          or adapter and want to enable force feedback support for it.
 
+config HID_PENMOUNT
+       tristate "Penmount touch device"
+       depends on USB_HID
+       ---help---
+         This selects a driver for the PenMount 6000 touch controller.
+
+         The driver works around a problem in the report descript allowing
+         the userspace to touch events instead of mouse events.
+
+         Say Y here if you have a Penmount based touch controller.
+
 config HID_PETALYNX
        tristate "Petalynx Maxter remote control"
        depends on HID
index 4dbac7f8530c3b072ba9b5f43f9059f2cfbb962c..e2850d8af9ca353a3b95ad6706667266f5a804b8 100644 (file)
@@ -71,6 +71,7 @@ obj-$(CONFIG_HID_NTRIG)               += hid-ntrig.o
 obj-$(CONFIG_HID_ORTEK)                += hid-ortek.o
 obj-$(CONFIG_HID_PRODIKEYS)    += hid-prodikeys.o
 obj-$(CONFIG_HID_PANTHERLORD)  += hid-pl.o
+obj-$(CONFIG_HID_PENMOUNT)     += hid-penmount.o
 obj-$(CONFIG_HID_PETALYNX)     += hid-petalynx.o
 obj-$(CONFIG_HID_PICOLCD)      += hid-picolcd.o
 hid-picolcd-y                  += hid-picolcd_core.o
index 12b6e67d9de0861d3599ceac272544d266ba1660..6827196be3fc55585beed856defc49019a3a97d7 100644 (file)
@@ -1880,6 +1880,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
        { HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_18) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_PKB1700) },
        { HID_USB_DEVICE(USB_VENDOR_ID_ORTEK, USB_DEVICE_ID_ORTEK_WKB2000) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_6000) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
        { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_KEYBOARD) },
 #if IS_ENABLED(CONFIG_HID_ROCCAT)
index 25cd674d6064887887a795c46518ebec68a90e46..3943ffe1a3337ff88d9e88a5ccaac46143b1748a 100644 (file)
 #define USB_DEVICE_ID_PENMOUNT_PCI     0x3500
 #define USB_DEVICE_ID_PENMOUNT_1610    0x1610
 #define USB_DEVICE_ID_PENMOUNT_1640    0x1640
+#define USB_DEVICE_ID_PENMOUNT_6000    0x6000
 
 #define USB_VENDOR_ID_PETALYNX         0x18b1
 #define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE   0x0037
diff --git a/drivers/hid/hid-penmount.c b/drivers/hid/hid-penmount.c
new file mode 100644 (file)
index 0000000..c11dce8
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ *  HID driver for PenMount touchscreens
+ *
+ *  Copyright (c) 2014 Christian Gmeiner <christian.gmeiner <at> gmail.com>
+ *
+ *  based on hid-penmount copyrighted by
+ *    PenMount Touch Solutions <penmount <at> seed.net.tw>
+ */
+
+/*
+ * 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.
+ */
+
+#include <linux/module.h>
+#include <linux/hid.h>
+#include "hid-ids.h"
+
+static int penmount_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_BUTTON) {
+               hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH);
+               return 1;
+       }
+
+       return 0;
+}
+
+static const struct hid_device_id penmount_devices[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT, USB_DEVICE_ID_PENMOUNT_6000) },
+       { }
+};
+MODULE_DEVICE_TABLE(hid, penmount_devices);
+
+static struct hid_driver penmount_driver = {
+       .name = "hid-penmount",
+       .id_table = penmount_devices,
+       .input_mapping = penmount_input_mapping,
+};
+
+module_hid_driver(penmount_driver);
+
+MODULE_AUTHOR("Christian Gmeiner <christian.gmeiner@gmail.com>");
+MODULE_DESCRIPTION("PenMount HID TouchScreen driver");
+MODULE_LICENSE("GPL");