Message ID | 1408978083-569-1-git-send-email-christian.gmeiner@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Jiri Kosina |
Headers | show |
On Mon, Aug 25, 2014 at 10:48 AM, Christian Gmeiner <christian.gmeiner@gmail.com> wrote: > This driver is a cleaned up version of > http://git.android-x86.org/?p=kernel/cdv.git;a=blob_plain;f=drivers/hid/hid-penmount.c;hb=HEAD This is definitively weird. According to your driver, it should go by default through hid-multitouch and behave correctly (at least the multi-touch versions, and I would say yours too). Can you send me some touch recordings of your device with hid-recorder[1] please? No need to remove your driver, it will capture raw input events, so you should be just fine. If the default binding does not work and if we can not make this work through hid-multitouch, then I'll have some comments on your patch, but I keep that for later :) Cheers, Benjamin [1] http://bentiss.github.io/hid-replay-docs/ > > As I only have a PenMount 6000 to test I removed the multi touch support from the dirver. > > Bus 002 Device 006: ID 14e1:6000 Dialogue Technology Corp. > Device Descriptor: > bLength 18 > bDescriptorType 1 > bcdUSB 1.10 > bDeviceClass 0 (Defined at Interface level) > bDeviceSubClass 0 > bDeviceProtocol 0 > bMaxPacketSize0 64 > idVendor 0x14e1 Dialogue Technology Corp. > idProduct 0x6000 > bcdDevice a4.b4 > iManufacturer 1 DIALOGUE INC > iProduct 2 PenMount USB > iSerial 0 > bNumConfigurations 1 > Configuration Descriptor: > bLength 9 > bDescriptorType 2 > wTotalLength 41 > bNumInterfaces 1 > bConfigurationValue 1 > iConfiguration 4 full speed > bmAttributes 0xa0 > (Bus Powered) > Remote Wakeup > MaxPower 500mA > Interface Descriptor: > bLength 9 > bDescriptorType 4 > bInterfaceNumber 0 > bAlternateSetting 0 > bNumEndpoints 2 > bInterfaceClass 3 Human Interface Device > bInterfaceSubClass 0 No Subclass > bInterfaceProtocol 0 None > iInterface 3 EndPoint1 Interrupt Pipe > HID Device Descriptor: > bLength 9 > bDescriptorType 33 > bcdHID 1.01 > bCountryCode 0 Not supported > bNumDescriptors 1 > bDescriptorType 34 Report > wDescriptorLength 76 > Report Descriptors: > ** UNAVAILABLE ** > Endpoint Descriptor: > bLength 7 > bDescriptorType 5 > bEndpointAddress 0x81 EP 1 IN > bmAttributes 3 > Transfer Type Interrupt > Synch Type None > Usage Type Data > wMaxPacketSize 0x0005 1x 5 bytes > bInterval 1 > Endpoint Descriptor: > bLength 7 > bDescriptorType 5 > bEndpointAddress 0x02 EP 2 OUT > bmAttributes 3 > Transfer Type Interrupt > Synch Type None > Usage Type Data > wMaxPacketSize 0x0005 1x 5 bytes > bInterval 1 > Device Status: 0x0000 > (Bus Powered) > > Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com> > --- > drivers/hid/Kconfig | 6 ++ > drivers/hid/Makefile | 1 + > drivers/hid/hid-core.c | 1 + > drivers/hid/hid-ids.h | 1 + > drivers/hid/hid-penmount.c | 200 +++++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 209 insertions(+) > create mode 100644 drivers/hid/hid-penmount.c > > diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig > index c18d5d7..0351b66 100644 > --- a/drivers/hid/Kconfig > +++ b/drivers/hid/Kconfig > @@ -530,6 +530,12 @@ 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--- > + Say Y here if you have a Penmount based touch controller. > + > config HID_PETALYNX > tristate "Petalynx Maxter remote control" > depends on HID > diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile > index 4dbac7f..e2850d8 100644 > --- a/drivers/hid/Makefile > +++ b/drivers/hid/Makefile > @@ -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 > diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c > index 12b6e67..6827196 100644 > --- a/drivers/hid/hid-core.c > +++ b/drivers/hid/hid-core.c > @@ -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) > diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h > index 25cd674..3943ffe 100644 > --- a/drivers/hid/hid-ids.h > +++ b/drivers/hid/hid-ids.h > @@ -722,6 +722,7 @@ > #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 > index 0000000..3a630d1 > --- /dev/null > +++ b/drivers/hid/hid-penmount.c > @@ -0,0 +1,200 @@ > +/* > + * HID driver for PenMount touchscreens > + * > + * Copyright (c) 2011 PenMount Touch Solutions <penmount@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 <linux/version.h> > +#include <linux/input/mt.h> > +#include "hid-ids.h" > + > +struct penmount_priv { > + u8 touch; > + bool touching; > + u16 x; > + u16 y; > +}; > + > +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) > +{ > + struct input_dev *dev = hi->input; > + int mapped = 0; > + > + switch (usage->hid & HID_USAGE_PAGE) { > + case HID_UP_GENDESK: > + switch (usage->hid) { > + case HID_GD_X: > + hid_map_usage(hi, usage, bit, max, EV_ABS, ABS_X); > + mapped = 1; > + break; > + case HID_GD_Y: > + hid_map_usage(hi, usage, bit, max, EV_ABS, ABS_Y); > + mapped = 1; > + break; > + } > + break; > + case HID_UP_BUTTON: > + hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); > + mapped = 1; > + break; > + case HID_UP_DIGITIZER: > + switch (usage->hid) { > + case HID_DG_TIPSWITCH: > + hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); > + mapped = 1; > + break; > + case HID_DG_CONTACTID: > + input_mt_init_slots(dev, 1, 0); > + mapped = -1; > + break; > + case HID_DG_INRANGE: > + case HID_DG_CONFIDENCE: > + mapped = -1; > + break; > + } > + break; > + } > + > + return mapped; > +} > + > +static void penmount_process(struct input_dev *dev, struct penmount_priv *priv) > +{ > + if (!priv->touching) { > + if (priv->touch) { > + input_report_key(dev, BTN_TOUCH, 1); > + priv->touching = true; > + } > + } else { > + if (!priv->touch) { > + input_report_key(dev, BTN_TOUCH, 0); > + priv->touching = false; > + } > + } > + > + input_report_abs(dev, ABS_X, priv->x); > + input_report_abs(dev, ABS_Y, priv->y); > + input_sync(dev); > + > + priv->touch = 0; > +} > + > +static int penmount_event(struct hid_device *hdev, struct hid_field *field, > + struct hid_usage *usage, __s32 value) > +{ > + if (hdev->claimed & HID_CLAIMED_INPUT) { > + struct penmount_priv *priv = hid_get_drvdata(hdev); > + struct input_dev *dev = field->hidinput->input; > + > + switch (usage->hid) { > + case HID_DG_TIPSWITCH: > + priv->touch = value; > + break; > + case HID_GD_X: > + priv->x = value; > + break; > + case HID_GD_Y: > + priv->y = value; > + break; > + default: > + /* fallback to the generic hidinput handling */ > + return 0; > + } > + > + penmount_process(dev, priv); > + } > + > + if ((hdev->claimed & HID_CLAIMED_HIDDEV) && (hdev->hiddev_hid_event)) > + hdev->hiddev_hid_event(hdev, field, usage, value); > + > + return 1; > +} > + > +static int penmount_probe(struct hid_device *hdev, > + const struct hid_device_id *id) > +{ > + struct penmount_priv *priv; > + int ret = 0; > + > + priv = kzalloc(sizeof(*priv), GFP_KERNEL); > + if (!priv) > + return -ENOMEM; > + > + hid_set_drvdata(hdev, priv); > + > + ret = hid_parse(hdev); > + if (ret) { > + hid_err(hdev, "parse failed\n"); > + goto err_free; > + } > + > + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); > + if (ret) { > + hid_err(hdev, "hw start failed\n"); > + goto err_free; > + } > + > + return 0; > + > +err_free: > + kfree(priv); > + return ret; > +} > + > +static void penmount_remove(struct hid_device *hdev) > +{ > + struct penmount_priv *priv = hid_get_drvdata(hdev); > + > + hid_hw_stop(hdev); > + kfree(priv); > +} > + > +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 const struct hid_usage_id penmount_usages[] = { > + { HID_ANY_ID, HID_ANY_ID, HID_ANY_ID }, > + { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1 } > +}; > + > +static struct hid_driver penmount_driver = { > + .name = "hid-penmount", > + .id_table = penmount_devices, > + .probe = penmount_probe, > + .remove = penmount_remove, > + .input_mapping = penmount_input_mapping, > + .usage_table = penmount_usages, > + .event = penmount_event, > +}; > + > +static int __init penmount_init(void) > +{ > + return hid_register_driver(&penmount_driver); > +} > + > +static void __exit penmount_exit(void) > +{ > + hid_unregister_driver(&penmount_driver); > +} > + > +module_init(penmount_init); > +module_exit(penmount_exit); > + > +MODULE_AUTHOR("PenMount Touch Solutions <penmount@seed.net.tw>"); > +MODULE_DESCRIPTION("PenMount HID TouchScreen Driver"); > +MODULE_LICENSE("GPL"); > -- > 1.9.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-input" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Benjamin. 2014-08-25 17:43 GMT+02:00 Benjamin Tissoires <benjamin.tissoires@gmail.com>: > On Mon, Aug 25, 2014 at 10:48 AM, Christian Gmeiner > <christian.gmeiner@gmail.com> wrote: >> This driver is a cleaned up version of >> http://git.android-x86.org/?p=kernel/cdv.git;a=blob_plain;f=drivers/hid/hid-penmount.c;hb=HEAD > > This is definitively weird. According to your driver, it should go by > default through hid-multitouch and behave correctly (at least the > multi-touch versions, and I would say yours too). > I thought I have tried it with hid-multitouch, but I it never gets used. [ 94.342542] usb 2-1.7: USB disconnect, device number 6 [ 96.312636] usb 2-1.7: new full-speed USB device number 7 using ehci-pci [ 96.399606] usb 2-1.7: New USB device found, idVendor=14e1, idProduct=6000 [ 96.399611] usb 2-1.7: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 96.399614] usb 2-1.7: Product: PenMount USB [ 96.399617] usb 2-1.7: Manufacturer: DIALOGUE INC [ 96.402777] input: DIALOGUE INC PenMount USB as /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0/0003:14E1:6000.0004/input/input12 [ 96.403533] hid-generic 0003:14E1:6000.0004: input,hidraw2: USB HID v1.01 Mouse [DIALOGUE INC PenMount USB] on usb-0000:00:1d.0-1.7/input0 > Can you send me some touch recordings of your device with > hid-recorder[1] please? No need to remove your driver, it will capture > raw input events, so you should be just fine. [christian@chgm-pc hid]$ sudo hid-recorder Available devices: /dev/hidraw0: Microsoft Microsoft 3-Button Mouse with IntelliEye(TM) /dev/hidraw1: LITE-ON Technology USB NetVista Full Width Keyboard. /dev/hidraw2: DIALOGUE INC PenMount USB Select the device event number [0-2]: 2 R: 76 05 01 09 02 a1 01 09 01 a1 00 09 00 15 00 25 01 95 06 75 01 81 01 05 09 19 01 29 03 15 00 25 01 95 02 75 01 81 02 05 01 09 30 09 31 15 00 26 ff 03 36 80 00 46 ff 7f 75 10 95 02 81 02 09 00 15 00 26 ff 00 75 08 95 05 b1 02 c0 c0 N: DIALOGUE INC PenMount USB P: usb-0000:00:1d.0-1.7/input0 I: 3 14e1 6000 E: 0.000000 5 30 d0 00 d1 01 E: 0.000945 5 70 d0 00 d1 01 E: 0.006984 5 70 d0 00 d1 01 E: 0.012961 5 70 d0 00 d1 01 E: 0.019001 5 70 d0 00 d1 01 E: 0.025965 5 70 d0 00 d1 01 E: 0.031960 5 70 d0 00 d1 01 E: 0.037964 5 70 d0 00 d1 01 E: 0.043964 5 70 d0 00 d1 01 E: 0.050988 5 70 d0 00 d1 01 E: 0.056945 5 70 d0 00 d1 01 E: 0.062985 5 70 d0 00 d1 01 E: 0.068965 5 70 d0 00 d1 01 E: 0.075974 5 70 d0 00 d1 01 E: 0.081961 5 70 d0 00 d1 01 E: 0.112985 5 70 d0 00 d1 01 E: 0.118978 5 70 d0 00 d0 01 E: 0.124978 5 70 d1 00 d0 01 E: 0.131973 5 70 d3 00 d0 01 E: 0.137971 5 70 d4 00 d0 01 E: 0.143919 5 70 d5 00 cf 01 E: 0.149938 5 70 d7 00 cf 01 E: 0.155971 5 70 d9 00 cf 01 E: 0.163011 5 70 db 00 ce 01 E: 0.168984 5 70 dc 00 ce 01 E: 0.174996 5 70 de 00 cd 01 E: 0.180957 5 70 e0 00 cd 01 E: 0.187985 5 70 e1 00 cc 01 E: 0.193991 5 70 e3 00 cc 01 E: 0.199984 5 70 e5 00 cb 01 E: 0.206006 5 70 e7 00 cb 01 E: 0.212986 5 70 e9 00 ca 01 E: 0.218988 5 70 eb 00 ca 01 E: 0.224955 5 70 ed 00 c9 01 E: 0.230943 5 70 f0 00 c9 01 E: 0.237986 5 70 f2 00 c8 01 E: 0.243951 5 70 f5 00 c7 01 E: 0.262959 5 70 f8 00 c6 01 E: 0.269008 5 70 fc 00 c5 01 E: 0.274963 5 70 ff 00 c3 01 E: 0.280913 5 70 03 01 c1 01 E: 0.287962 5 70 07 01 c0 01 E: 0.293989 5 70 0a 01 bf 01 E: 0.299971 5 70 0e 01 be 01 E: 0.305973 5 70 12 01 bd 01 E: 0.313004 5 70 15 01 bc 01 E: 0.318966 5 70 18 01 bb 01 E: 0.324979 5 70 1b 01 ba 01 E: 0.330975 5 70 1f 01 b9 01 E: 0.337957 5 70 22 01 b8 01 E: 0.343986 5 70 25 01 b7 01 E: 0.349924 5 70 28 01 b5 01 E: 0.355963 5 70 2c 01 b4 01 E: 0.362928 5 70 2f 01 b3 01 E: 0.368975 5 70 33 01 b1 01 E: 0.374911 5 70 36 01 b0 01 E: 0.380961 5 70 39 01 af 01 E: 0.387969 5 70 3d 01 af 01 E: 0.393916 5 70 40 01 ae 01 E: 0.399961 5 70 43 01 ad 01 E: 0.405957 5 70 47 01 ad 01 E: 0.412947 5 70 4a 01 ac 01 E: 0.418982 5 70 4d 01 ab 01 E: 0.424983 5 70 50 01 aa 01 E: 0.430989 5 70 54 01 a9 01 E: 0.437946 5 70 57 01 a8 01 E: 0.443999 5 70 5a 01 a7 01 E: 0.449980 5 70 5d 01 a6 01 E: 0.455972 5 70 61 01 a5 01 E: 0.462986 5 70 64 01 a4 01 E: 0.468994 5 70 67 01 a3 01 E: 0.474981 5 70 6a 01 a3 01 E: 0.480990 5 70 6c 01 a2 01 E: 0.487974 5 70 6f 01 a1 01 E: 0.493988 5 70 72 01 a1 01 E: 0.500009 5 70 75 01 a0 01 E: 0.505973 5 70 77 01 9f 01 E: 0.512990 5 70 7a 01 9f 01 E: 0.518971 5 70 7d 01 9e 01 E: 0.524988 5 70 7f 01 9e 01 E: 0.530969 5 70 81 01 9e 01 E: 0.537991 5 70 83 01 9d 01 E: 0.543979 5 70 86 01 9d 01 E: 0.549988 5 70 88 01 9c 01 E: 0.555973 5 70 8a 01 9c 01 E: 0.562958 5 70 8c 01 9c 01 E: 0.568917 5 70 8d 01 9b 01 E: 0.574984 5 70 8f 01 9b 01 E: 0.580986 5 70 92 01 9b 01 E: 0.587984 5 70 94 01 9a 01 E: 0.593990 5 70 95 01 9a 01 E: 0.599959 5 70 97 01 99 01 E: 0.605980 5 70 97 01 99 01 E: 0.612983 5 70 98 01 99 01 E: 0.618990 5 70 9a 01 98 01 E: 0.624972 5 70 9b 01 98 01 E: 0.630983 5 70 9c 01 97 01 E: 0.638007 5 70 9e 01 97 01 E: 0.643953 5 70 9f 01 97 01 E: 0.649986 5 70 a1 01 96 01 E: 0.655975 5 70 a1 01 96 01 E: 0.662980 5 70 a3 01 96 01 E: 0.668993 5 70 a4 01 95 01 > If the default binding does not work and if we can not make this work > through hid-multitouch, then I'll have some comments on your patch, > but I keep that for later :) > Greets -- Christian Gmeiner, MSc https://soundcloud.com/christian-gmeiner > Cheers, > Benjamin > > [1] http://bentiss.github.io/hid-replay-docs/ > > > >> >> As I only have a PenMount 6000 to test I removed the multi touch support from the dirver. >> >> Bus 002 Device 006: ID 14e1:6000 Dialogue Technology Corp. >> Device Descriptor: >> bLength 18 >> bDescriptorType 1 >> bcdUSB 1.10 >> bDeviceClass 0 (Defined at Interface level) >> bDeviceSubClass 0 >> bDeviceProtocol 0 >> bMaxPacketSize0 64 >> idVendor 0x14e1 Dialogue Technology Corp. >> idProduct 0x6000 >> bcdDevice a4.b4 >> iManufacturer 1 DIALOGUE INC >> iProduct 2 PenMount USB >> iSerial 0 >> bNumConfigurations 1 >> Configuration Descriptor: >> bLength 9 >> bDescriptorType 2 >> wTotalLength 41 >> bNumInterfaces 1 >> bConfigurationValue 1 >> iConfiguration 4 full speed >> bmAttributes 0xa0 >> (Bus Powered) >> Remote Wakeup >> MaxPower 500mA >> Interface Descriptor: >> bLength 9 >> bDescriptorType 4 >> bInterfaceNumber 0 >> bAlternateSetting 0 >> bNumEndpoints 2 >> bInterfaceClass 3 Human Interface Device >> bInterfaceSubClass 0 No Subclass >> bInterfaceProtocol 0 None >> iInterface 3 EndPoint1 Interrupt Pipe >> HID Device Descriptor: >> bLength 9 >> bDescriptorType 33 >> bcdHID 1.01 >> bCountryCode 0 Not supported >> bNumDescriptors 1 >> bDescriptorType 34 Report >> wDescriptorLength 76 >> Report Descriptors: >> ** UNAVAILABLE ** >> Endpoint Descriptor: >> bLength 7 >> bDescriptorType 5 >> bEndpointAddress 0x81 EP 1 IN >> bmAttributes 3 >> Transfer Type Interrupt >> Synch Type None >> Usage Type Data >> wMaxPacketSize 0x0005 1x 5 bytes >> bInterval 1 >> Endpoint Descriptor: >> bLength 7 >> bDescriptorType 5 >> bEndpointAddress 0x02 EP 2 OUT >> bmAttributes 3 >> Transfer Type Interrupt >> Synch Type None >> Usage Type Data >> wMaxPacketSize 0x0005 1x 5 bytes >> bInterval 1 >> Device Status: 0x0000 >> (Bus Powered) >> >> Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com> >> --- >> drivers/hid/Kconfig | 6 ++ >> drivers/hid/Makefile | 1 + >> drivers/hid/hid-core.c | 1 + >> drivers/hid/hid-ids.h | 1 + >> drivers/hid/hid-penmount.c | 200 +++++++++++++++++++++++++++++++++++++++++++++ >> 5 files changed, 209 insertions(+) >> create mode 100644 drivers/hid/hid-penmount.c >> >> diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig >> index c18d5d7..0351b66 100644 >> --- a/drivers/hid/Kconfig >> +++ b/drivers/hid/Kconfig >> @@ -530,6 +530,12 @@ 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--- >> + Say Y here if you have a Penmount based touch controller. >> + >> config HID_PETALYNX >> tristate "Petalynx Maxter remote control" >> depends on HID >> diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile >> index 4dbac7f..e2850d8 100644 >> --- a/drivers/hid/Makefile >> +++ b/drivers/hid/Makefile >> @@ -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 >> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c >> index 12b6e67..6827196 100644 >> --- a/drivers/hid/hid-core.c >> +++ b/drivers/hid/hid-core.c >> @@ -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) >> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h >> index 25cd674..3943ffe 100644 >> --- a/drivers/hid/hid-ids.h >> +++ b/drivers/hid/hid-ids.h >> @@ -722,6 +722,7 @@ >> #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 >> index 0000000..3a630d1 >> --- /dev/null >> +++ b/drivers/hid/hid-penmount.c >> @@ -0,0 +1,200 @@ >> +/* >> + * HID driver for PenMount touchscreens >> + * >> + * Copyright (c) 2011 PenMount Touch Solutions <penmount@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 <linux/version.h> >> +#include <linux/input/mt.h> >> +#include "hid-ids.h" >> + >> +struct penmount_priv { >> + u8 touch; >> + bool touching; >> + u16 x; >> + u16 y; >> +}; >> + >> +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) >> +{ >> + struct input_dev *dev = hi->input; >> + int mapped = 0; >> + >> + switch (usage->hid & HID_USAGE_PAGE) { >> + case HID_UP_GENDESK: >> + switch (usage->hid) { >> + case HID_GD_X: >> + hid_map_usage(hi, usage, bit, max, EV_ABS, ABS_X); >> + mapped = 1; >> + break; >> + case HID_GD_Y: >> + hid_map_usage(hi, usage, bit, max, EV_ABS, ABS_Y); >> + mapped = 1; >> + break; >> + } >> + break; >> + case HID_UP_BUTTON: >> + hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); >> + mapped = 1; >> + break; >> + case HID_UP_DIGITIZER: >> + switch (usage->hid) { >> + case HID_DG_TIPSWITCH: >> + hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); >> + mapped = 1; >> + break; >> + case HID_DG_CONTACTID: >> + input_mt_init_slots(dev, 1, 0); >> + mapped = -1; >> + break; >> + case HID_DG_INRANGE: >> + case HID_DG_CONFIDENCE: >> + mapped = -1; >> + break; >> + } >> + break; >> + } >> + >> + return mapped; >> +} >> + >> +static void penmount_process(struct input_dev *dev, struct penmount_priv *priv) >> +{ >> + if (!priv->touching) { >> + if (priv->touch) { >> + input_report_key(dev, BTN_TOUCH, 1); >> + priv->touching = true; >> + } >> + } else { >> + if (!priv->touch) { >> + input_report_key(dev, BTN_TOUCH, 0); >> + priv->touching = false; >> + } >> + } >> + >> + input_report_abs(dev, ABS_X, priv->x); >> + input_report_abs(dev, ABS_Y, priv->y); >> + input_sync(dev); >> + >> + priv->touch = 0; >> +} >> + >> +static int penmount_event(struct hid_device *hdev, struct hid_field *field, >> + struct hid_usage *usage, __s32 value) >> +{ >> + if (hdev->claimed & HID_CLAIMED_INPUT) { >> + struct penmount_priv *priv = hid_get_drvdata(hdev); >> + struct input_dev *dev = field->hidinput->input; >> + >> + switch (usage->hid) { >> + case HID_DG_TIPSWITCH: >> + priv->touch = value; >> + break; >> + case HID_GD_X: >> + priv->x = value; >> + break; >> + case HID_GD_Y: >> + priv->y = value; >> + break; >> + default: >> + /* fallback to the generic hidinput handling */ >> + return 0; >> + } >> + >> + penmount_process(dev, priv); >> + } >> + >> + if ((hdev->claimed & HID_CLAIMED_HIDDEV) && (hdev->hiddev_hid_event)) >> + hdev->hiddev_hid_event(hdev, field, usage, value); >> + >> + return 1; >> +} >> + >> +static int penmount_probe(struct hid_device *hdev, >> + const struct hid_device_id *id) >> +{ >> + struct penmount_priv *priv; >> + int ret = 0; >> + >> + priv = kzalloc(sizeof(*priv), GFP_KERNEL); >> + if (!priv) >> + return -ENOMEM; >> + >> + hid_set_drvdata(hdev, priv); >> + >> + ret = hid_parse(hdev); >> + if (ret) { >> + hid_err(hdev, "parse failed\n"); >> + goto err_free; >> + } >> + >> + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); >> + if (ret) { >> + hid_err(hdev, "hw start failed\n"); >> + goto err_free; >> + } >> + >> + return 0; >> + >> +err_free: >> + kfree(priv); >> + return ret; >> +} >> + >> +static void penmount_remove(struct hid_device *hdev) >> +{ >> + struct penmount_priv *priv = hid_get_drvdata(hdev); >> + >> + hid_hw_stop(hdev); >> + kfree(priv); >> +} >> + >> +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 const struct hid_usage_id penmount_usages[] = { >> + { HID_ANY_ID, HID_ANY_ID, HID_ANY_ID }, >> + { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1 } >> +}; >> + >> +static struct hid_driver penmount_driver = { >> + .name = "hid-penmount", >> + .id_table = penmount_devices, >> + .probe = penmount_probe, >> + .remove = penmount_remove, >> + .input_mapping = penmount_input_mapping, >> + .usage_table = penmount_usages, >> + .event = penmount_event, >> +}; >> + >> +static int __init penmount_init(void) >> +{ >> + return hid_register_driver(&penmount_driver); >> +} >> + >> +static void __exit penmount_exit(void) >> +{ >> + hid_unregister_driver(&penmount_driver); >> +} >> + >> +module_init(penmount_init); >> +module_exit(penmount_exit); >> + >> +MODULE_AUTHOR("PenMount Touch Solutions <penmount@seed.net.tw>"); >> +MODULE_DESCRIPTION("PenMount HID TouchScreen Driver"); >> +MODULE_LICENSE("GPL"); >> -- >> 1.9.3 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-input" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Aug 26, 2014 at 3:29 AM, Christian Gmeiner <christian.gmeiner@gmail.com> wrote: > Hi Benjamin. > > 2014-08-25 17:43 GMT+02:00 Benjamin Tissoires <benjamin.tissoires@gmail.com>: >> On Mon, Aug 25, 2014 at 10:48 AM, Christian Gmeiner >> <christian.gmeiner@gmail.com> wrote: >>> This driver is a cleaned up version of >>> http://git.android-x86.org/?p=kernel/cdv.git;a=blob_plain;f=drivers/hid/hid-penmount.c;hb=HEAD >> >> This is definitively weird. According to your driver, it should go by >> default through hid-multitouch and behave correctly (at least the >> multi-touch versions, and I would say yours too). >> > > I thought I have tried it with hid-multitouch, but I it never gets used. > > [ 94.342542] usb 2-1.7: USB disconnect, device number 6 > [ 96.312636] usb 2-1.7: new full-speed USB device number 7 using ehci-pci > [ 96.399606] usb 2-1.7: New USB device found, idVendor=14e1, idProduct=6000 > [ 96.399611] usb 2-1.7: New USB device strings: Mfr=1, Product=2, > SerialNumber=0 > [ 96.399614] usb 2-1.7: Product: PenMount USB > [ 96.399617] usb 2-1.7: Manufacturer: DIALOGUE INC > [ 96.402777] input: DIALOGUE INC PenMount USB as > /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0/0003:14E1:6000.0004/input/input12 > [ 96.403533] hid-generic 0003:14E1:6000.0004: input,hidraw2: USB HID > v1.01 Mouse [DIALOGUE INC PenMount USB] on usb-0000:00:1d.0-1.7/input0 Yep, it will never go through hid-multitouch because the report descriptor does not contain the ContactID usage. So hid-generic is fine for now. > > >> Can you send me some touch recordings of your device with >> hid-recorder[1] please? No need to remove your driver, it will capture >> raw input events, so you should be just fine. > > [christian@chgm-pc hid]$ sudo hid-recorder > Available devices: > /dev/hidraw0: Microsoft Microsoft 3-Button Mouse with IntelliEye(TM) > /dev/hidraw1: LITE-ON Technology USB NetVista Full Width Keyboard. > /dev/hidraw2: DIALOGUE INC PenMount USB > Select the device event number [0-2]: 2 > R: 76 05 01 09 02 a1 01 09 01 a1 00 09 00 15 00 25 01 95 06 75 01 81 > 01 05 09 19 01 29 03 15 00 25 01 95 02 75 01 81 02 05 01 09 30 09 31 > 15 00 26 ff 03 36 80 00 46 ff 7f 75 10 95 02 81 02 09 00 15 00 26 ff > 00 75 08 95 05 b1 02 c0 c0 > N: DIALOGUE INC PenMount USB > P: usb-0000:00:1d.0-1.7/input0 > I: 3 14e1 6000 > E: 0.000000 5 30 d0 00 d1 01 > E: 0.000945 5 70 d0 00 d1 01 > E: 0.006984 5 70 d0 00 d1 01 > E: 0.012961 5 70 d0 00 d1 01 > E: 0.019001 5 70 d0 00 d1 01 > E: 0.025965 5 70 d0 00 d1 01 > E: 0.031960 5 70 d0 00 d1 01 > E: 0.037964 5 70 d0 00 d1 01 > E: 0.043964 5 70 d0 00 d1 01 > E: 0.050988 5 70 d0 00 d1 01 > E: 0.056945 5 70 d0 00 d1 01 > E: 0.062985 5 70 d0 00 d1 01 > E: 0.068965 5 70 d0 00 d1 01 > E: 0.075974 5 70 d0 00 d1 01 > E: 0.081961 5 70 d0 00 d1 01 > E: 0.112985 5 70 d0 00 d1 01 > E: 0.118978 5 70 d0 00 d0 01 > E: 0.124978 5 70 d1 00 d0 01 > E: 0.131973 5 70 d3 00 d0 01 > E: 0.137971 5 70 d4 00 d0 01 > E: 0.143919 5 70 d5 00 cf 01 > E: 0.149938 5 70 d7 00 cf 01 > E: 0.155971 5 70 d9 00 cf 01 > E: 0.163011 5 70 db 00 ce 01 > E: 0.168984 5 70 dc 00 ce 01 > E: 0.174996 5 70 de 00 cd 01 > E: 0.180957 5 70 e0 00 cd 01 > E: 0.187985 5 70 e1 00 cc 01 > E: 0.193991 5 70 e3 00 cc 01 > E: 0.199984 5 70 e5 00 cb 01 > E: 0.206006 5 70 e7 00 cb 01 > E: 0.212986 5 70 e9 00 ca 01 > E: 0.218988 5 70 eb 00 ca 01 > E: 0.224955 5 70 ed 00 c9 01 > E: 0.230943 5 70 f0 00 c9 01 > E: 0.237986 5 70 f2 00 c8 01 > E: 0.243951 5 70 f5 00 c7 01 > E: 0.262959 5 70 f8 00 c6 01 > E: 0.269008 5 70 fc 00 c5 01 > E: 0.274963 5 70 ff 00 c3 01 > E: 0.280913 5 70 03 01 c1 01 > E: 0.287962 5 70 07 01 c0 01 > E: 0.293989 5 70 0a 01 bf 01 > E: 0.299971 5 70 0e 01 be 01 > E: 0.305973 5 70 12 01 bd 01 > E: 0.313004 5 70 15 01 bc 01 > E: 0.318966 5 70 18 01 bb 01 > E: 0.324979 5 70 1b 01 ba 01 > E: 0.330975 5 70 1f 01 b9 01 > E: 0.337957 5 70 22 01 b8 01 > E: 0.343986 5 70 25 01 b7 01 > E: 0.349924 5 70 28 01 b5 01 > E: 0.355963 5 70 2c 01 b4 01 > E: 0.362928 5 70 2f 01 b3 01 > E: 0.368975 5 70 33 01 b1 01 > E: 0.374911 5 70 36 01 b0 01 > E: 0.380961 5 70 39 01 af 01 > E: 0.387969 5 70 3d 01 af 01 > E: 0.393916 5 70 40 01 ae 01 > E: 0.399961 5 70 43 01 ad 01 > E: 0.405957 5 70 47 01 ad 01 > E: 0.412947 5 70 4a 01 ac 01 > E: 0.418982 5 70 4d 01 ab 01 > E: 0.424983 5 70 50 01 aa 01 > E: 0.430989 5 70 54 01 a9 01 > E: 0.437946 5 70 57 01 a8 01 > E: 0.443999 5 70 5a 01 a7 01 > E: 0.449980 5 70 5d 01 a6 01 > E: 0.455972 5 70 61 01 a5 01 > E: 0.462986 5 70 64 01 a4 01 > E: 0.468994 5 70 67 01 a3 01 > E: 0.474981 5 70 6a 01 a3 01 > E: 0.480990 5 70 6c 01 a2 01 > E: 0.487974 5 70 6f 01 a1 01 > E: 0.493988 5 70 72 01 a1 01 > E: 0.500009 5 70 75 01 a0 01 > E: 0.505973 5 70 77 01 9f 01 > E: 0.512990 5 70 7a 01 9f 01 > E: 0.518971 5 70 7d 01 9e 01 > E: 0.524988 5 70 7f 01 9e 01 > E: 0.530969 5 70 81 01 9e 01 > E: 0.537991 5 70 83 01 9d 01 > E: 0.543979 5 70 86 01 9d 01 > E: 0.549988 5 70 88 01 9c 01 > E: 0.555973 5 70 8a 01 9c 01 > E: 0.562958 5 70 8c 01 9c 01 > E: 0.568917 5 70 8d 01 9b 01 > E: 0.574984 5 70 8f 01 9b 01 > E: 0.580986 5 70 92 01 9b 01 > E: 0.587984 5 70 94 01 9a 01 > E: 0.593990 5 70 95 01 9a 01 > E: 0.599959 5 70 97 01 99 01 > E: 0.605980 5 70 97 01 99 01 > E: 0.612983 5 70 98 01 99 01 > E: 0.618990 5 70 9a 01 98 01 > E: 0.624972 5 70 9b 01 98 01 > E: 0.630983 5 70 9c 01 97 01 > E: 0.638007 5 70 9e 01 97 01 > E: 0.643953 5 70 9f 01 97 01 > E: 0.649986 5 70 a1 01 96 01 > E: 0.655975 5 70 a1 01 96 01 > E: 0.662980 5 70 a3 01 96 01 > E: 0.668993 5 70 a4 01 95 01 > Weird, this trace is missing the release from the finger (it should start with 5 30 ...) As I understand, the only problem which your driver is trying to solve is to map the button 0 emitted by your touchscreen to BTN_TOUCH (I have the feeling that you already said that, but I can not find it in the thread :/ -> found your other thread). You have 2 possibilities: 1. fix the report descriptor and rely on the generic implementations 2. just handle the button mapping in this penmount driver and leave the rest to the generic code. The choice 2. might be easier if you never played with report descriptors. You will just have to heavily remove stuffs from your current version: - struct penmount_priv is not required anymore - in penmount_input_mapping() just map HID_UP_BUTTON to BTN_TOUCH, and return 0 for everything else - remove penmount_process() and penmount_event() - no need to have a probe or a remove function anymore - use the macro module_hid_driver(penmount_driver) instead of having your own penmount_init() and penmount_exit() You might also want to say that you are the author of the module and also just say that you based your work on a hid-penmount copyrighted by PenMount Touch Solution <...>. The code should be very different by now, so there is no need IMO to keep the author when you completely have rewritten the code. Cheers, Benjamin -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Benjamin. 2014-08-26 20:47 GMT+02:00 Benjamin Tissoires <benjamin.tissoires@gmail.com>: > On Tue, Aug 26, 2014 at 3:29 AM, Christian Gmeiner > <christian.gmeiner@gmail.com> wrote: >> Hi Benjamin. >> >> 2014-08-25 17:43 GMT+02:00 Benjamin Tissoires <benjamin.tissoires@gmail.com>: >>> On Mon, Aug 25, 2014 at 10:48 AM, Christian Gmeiner >>> <christian.gmeiner@gmail.com> wrote: >>>> This driver is a cleaned up version of >>>> http://git.android-x86.org/?p=kernel/cdv.git;a=blob_plain;f=drivers/hid/hid-penmount.c;hb=HEAD >>> >>> This is definitively weird. According to your driver, it should go by >>> default through hid-multitouch and behave correctly (at least the >>> multi-touch versions, and I would say yours too). >>> >> >> I thought I have tried it with hid-multitouch, but I it never gets used. >> >> [ 94.342542] usb 2-1.7: USB disconnect, device number 6 >> [ 96.312636] usb 2-1.7: new full-speed USB device number 7 using ehci-pci >> [ 96.399606] usb 2-1.7: New USB device found, idVendor=14e1, idProduct=6000 >> [ 96.399611] usb 2-1.7: New USB device strings: Mfr=1, Product=2, >> SerialNumber=0 >> [ 96.399614] usb 2-1.7: Product: PenMount USB >> [ 96.399617] usb 2-1.7: Manufacturer: DIALOGUE INC >> [ 96.402777] input: DIALOGUE INC PenMount USB as >> /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.7/2-1.7:1.0/0003:14E1:6000.0004/input/input12 >> [ 96.403533] hid-generic 0003:14E1:6000.0004: input,hidraw2: USB HID >> v1.01 Mouse [DIALOGUE INC PenMount USB] on usb-0000:00:1d.0-1.7/input0 > > Yep, it will never go through hid-multitouch because the report > descriptor does not contain the ContactID usage. So hid-generic is > fine for now. > ok >> >> >>> Can you send me some touch recordings of your device with >>> hid-recorder[1] please? No need to remove your driver, it will capture >>> raw input events, so you should be just fine. >> >> [christian@chgm-pc hid]$ sudo hid-recorder >> Available devices: >> /dev/hidraw0: Microsoft Microsoft 3-Button Mouse with IntelliEye(TM) >> /dev/hidraw1: LITE-ON Technology USB NetVista Full Width Keyboard. >> /dev/hidraw2: DIALOGUE INC PenMount USB >> Select the device event number [0-2]: 2 >> R: 76 05 01 09 02 a1 01 09 01 a1 00 09 00 15 00 25 01 95 06 75 01 81 >> 01 05 09 19 01 29 03 15 00 25 01 95 02 75 01 81 02 05 01 09 30 09 31 >> 15 00 26 ff 03 36 80 00 46 ff 7f 75 10 95 02 81 02 09 00 15 00 26 ff >> 00 75 08 95 05 b1 02 c0 c0 >> N: DIALOGUE INC PenMount USB >> P: usb-0000:00:1d.0-1.7/input0 >> I: 3 14e1 6000 >> E: 0.000000 5 30 d0 00 d1 01 >> E: 0.000945 5 70 d0 00 d1 01 >> E: 0.006984 5 70 d0 00 d1 01 >> E: 0.012961 5 70 d0 00 d1 01 >> E: 0.019001 5 70 d0 00 d1 01 >> E: 0.025965 5 70 d0 00 d1 01 >> E: 0.031960 5 70 d0 00 d1 01 >> E: 0.037964 5 70 d0 00 d1 01 >> E: 0.043964 5 70 d0 00 d1 01 >> E: 0.050988 5 70 d0 00 d1 01 >> E: 0.056945 5 70 d0 00 d1 01 >> E: 0.062985 5 70 d0 00 d1 01 >> E: 0.068965 5 70 d0 00 d1 01 >> E: 0.075974 5 70 d0 00 d1 01 >> E: 0.081961 5 70 d0 00 d1 01 >> E: 0.112985 5 70 d0 00 d1 01 >> E: 0.118978 5 70 d0 00 d0 01 >> E: 0.124978 5 70 d1 00 d0 01 >> E: 0.131973 5 70 d3 00 d0 01 >> E: 0.137971 5 70 d4 00 d0 01 >> E: 0.143919 5 70 d5 00 cf 01 >> E: 0.149938 5 70 d7 00 cf 01 >> E: 0.155971 5 70 d9 00 cf 01 >> E: 0.163011 5 70 db 00 ce 01 >> E: 0.168984 5 70 dc 00 ce 01 >> E: 0.174996 5 70 de 00 cd 01 >> E: 0.180957 5 70 e0 00 cd 01 >> E: 0.187985 5 70 e1 00 cc 01 >> E: 0.193991 5 70 e3 00 cc 01 >> E: 0.199984 5 70 e5 00 cb 01 >> E: 0.206006 5 70 e7 00 cb 01 >> E: 0.212986 5 70 e9 00 ca 01 >> E: 0.218988 5 70 eb 00 ca 01 >> E: 0.224955 5 70 ed 00 c9 01 >> E: 0.230943 5 70 f0 00 c9 01 >> E: 0.237986 5 70 f2 00 c8 01 >> E: 0.243951 5 70 f5 00 c7 01 >> E: 0.262959 5 70 f8 00 c6 01 >> E: 0.269008 5 70 fc 00 c5 01 >> E: 0.274963 5 70 ff 00 c3 01 >> E: 0.280913 5 70 03 01 c1 01 >> E: 0.287962 5 70 07 01 c0 01 >> E: 0.293989 5 70 0a 01 bf 01 >> E: 0.299971 5 70 0e 01 be 01 >> E: 0.305973 5 70 12 01 bd 01 >> E: 0.313004 5 70 15 01 bc 01 >> E: 0.318966 5 70 18 01 bb 01 >> E: 0.324979 5 70 1b 01 ba 01 >> E: 0.330975 5 70 1f 01 b9 01 >> E: 0.337957 5 70 22 01 b8 01 >> E: 0.343986 5 70 25 01 b7 01 >> E: 0.349924 5 70 28 01 b5 01 >> E: 0.355963 5 70 2c 01 b4 01 >> E: 0.362928 5 70 2f 01 b3 01 >> E: 0.368975 5 70 33 01 b1 01 >> E: 0.374911 5 70 36 01 b0 01 >> E: 0.380961 5 70 39 01 af 01 >> E: 0.387969 5 70 3d 01 af 01 >> E: 0.393916 5 70 40 01 ae 01 >> E: 0.399961 5 70 43 01 ad 01 >> E: 0.405957 5 70 47 01 ad 01 >> E: 0.412947 5 70 4a 01 ac 01 >> E: 0.418982 5 70 4d 01 ab 01 >> E: 0.424983 5 70 50 01 aa 01 >> E: 0.430989 5 70 54 01 a9 01 >> E: 0.437946 5 70 57 01 a8 01 >> E: 0.443999 5 70 5a 01 a7 01 >> E: 0.449980 5 70 5d 01 a6 01 >> E: 0.455972 5 70 61 01 a5 01 >> E: 0.462986 5 70 64 01 a4 01 >> E: 0.468994 5 70 67 01 a3 01 >> E: 0.474981 5 70 6a 01 a3 01 >> E: 0.480990 5 70 6c 01 a2 01 >> E: 0.487974 5 70 6f 01 a1 01 >> E: 0.493988 5 70 72 01 a1 01 >> E: 0.500009 5 70 75 01 a0 01 >> E: 0.505973 5 70 77 01 9f 01 >> E: 0.512990 5 70 7a 01 9f 01 >> E: 0.518971 5 70 7d 01 9e 01 >> E: 0.524988 5 70 7f 01 9e 01 >> E: 0.530969 5 70 81 01 9e 01 >> E: 0.537991 5 70 83 01 9d 01 >> E: 0.543979 5 70 86 01 9d 01 >> E: 0.549988 5 70 88 01 9c 01 >> E: 0.555973 5 70 8a 01 9c 01 >> E: 0.562958 5 70 8c 01 9c 01 >> E: 0.568917 5 70 8d 01 9b 01 >> E: 0.574984 5 70 8f 01 9b 01 >> E: 0.580986 5 70 92 01 9b 01 >> E: 0.587984 5 70 94 01 9a 01 >> E: 0.593990 5 70 95 01 9a 01 >> E: 0.599959 5 70 97 01 99 01 >> E: 0.605980 5 70 97 01 99 01 >> E: 0.612983 5 70 98 01 99 01 >> E: 0.618990 5 70 9a 01 98 01 >> E: 0.624972 5 70 9b 01 98 01 >> E: 0.630983 5 70 9c 01 97 01 >> E: 0.638007 5 70 9e 01 97 01 >> E: 0.643953 5 70 9f 01 97 01 >> E: 0.649986 5 70 a1 01 96 01 >> E: 0.655975 5 70 a1 01 96 01 >> E: 0.662980 5 70 a3 01 96 01 >> E: 0.668993 5 70 a4 01 95 01 >> > > Weird, this trace is missing the release from the finger (it should > start with 5 30 ...) > here it is: E: 0.387936 5 70 59 02 cd 01 E: 0.394915 5 70 59 02 cd 01 E: 0.400929 5 70 59 02 cd 01 E: 0.437981 5 30 59 02 cd 01 > As I understand, the only problem which your driver is trying to solve > is to map the button 0 emitted by your touchscreen to BTN_TOUCH (I > have the feeling that you already said that, but I can not find it in > the thread :/ -> found your other thread). > Yeah that is what I want. userspace should see a touch event. In the end the browser will react to this touch events. And this work enabled this for the penmount 6000. > You have 2 possibilities: > 1. fix the report descriptor and rely on the generic implementations > 2. just handle the button mapping in this penmount driver and leave > the rest to the generic code. > I am not sure what you would prefer but as I have never played with report descriptors I went with possibility #2. > The choice 2. might be easier if you never played with report > descriptors. You will just have to heavily remove stuffs from your > current version: > - struct penmount_priv is not required anymore > - in penmount_input_mapping() just map HID_UP_BUTTON to BTN_TOUCH, and > return 0 for everything else > - remove penmount_process() and penmount_event() > - no need to have a probe or a remove function anymore > - use the macro module_hid_driver(penmount_driver) instead of having > your own penmount_init() and penmount_exit() > > You might also want to say that you are the author of the module and > also just say that you based your work on a hid-penmount copyrighted > by PenMount Touch Solution <...>. > The code should be very different by now, so there is no need IMO to > keep the author when you completely have rewritten the code. > I have send a v2. Greets -- Christian Gmeiner, MSc https://soundcloud.com/christian-gmeiner -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig index c18d5d7..0351b66 100644 --- a/drivers/hid/Kconfig +++ b/drivers/hid/Kconfig @@ -530,6 +530,12 @@ 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--- + Say Y here if you have a Penmount based touch controller. + config HID_PETALYNX tristate "Petalynx Maxter remote control" depends on HID diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile index 4dbac7f..e2850d8 100644 --- a/drivers/hid/Makefile +++ b/drivers/hid/Makefile @@ -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 diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 12b6e67..6827196 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -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) diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 25cd674..3943ffe 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h @@ -722,6 +722,7 @@ #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 index 0000000..3a630d1 --- /dev/null +++ b/drivers/hid/hid-penmount.c @@ -0,0 +1,200 @@ +/* + * HID driver for PenMount touchscreens + * + * Copyright (c) 2011 PenMount Touch Solutions <penmount@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 <linux/version.h> +#include <linux/input/mt.h> +#include "hid-ids.h" + +struct penmount_priv { + u8 touch; + bool touching; + u16 x; + u16 y; +}; + +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) +{ + struct input_dev *dev = hi->input; + int mapped = 0; + + switch (usage->hid & HID_USAGE_PAGE) { + case HID_UP_GENDESK: + switch (usage->hid) { + case HID_GD_X: + hid_map_usage(hi, usage, bit, max, EV_ABS, ABS_X); + mapped = 1; + break; + case HID_GD_Y: + hid_map_usage(hi, usage, bit, max, EV_ABS, ABS_Y); + mapped = 1; + break; + } + break; + case HID_UP_BUTTON: + hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); + mapped = 1; + break; + case HID_UP_DIGITIZER: + switch (usage->hid) { + case HID_DG_TIPSWITCH: + hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_TOUCH); + mapped = 1; + break; + case HID_DG_CONTACTID: + input_mt_init_slots(dev, 1, 0); + mapped = -1; + break; + case HID_DG_INRANGE: + case HID_DG_CONFIDENCE: + mapped = -1; + break; + } + break; + } + + return mapped; +} + +static void penmount_process(struct input_dev *dev, struct penmount_priv *priv) +{ + if (!priv->touching) { + if (priv->touch) { + input_report_key(dev, BTN_TOUCH, 1); + priv->touching = true; + } + } else { + if (!priv->touch) { + input_report_key(dev, BTN_TOUCH, 0); + priv->touching = false; + } + } + + input_report_abs(dev, ABS_X, priv->x); + input_report_abs(dev, ABS_Y, priv->y); + input_sync(dev); + + priv->touch = 0; +} + +static int penmount_event(struct hid_device *hdev, struct hid_field *field, + struct hid_usage *usage, __s32 value) +{ + if (hdev->claimed & HID_CLAIMED_INPUT) { + struct penmount_priv *priv = hid_get_drvdata(hdev); + struct input_dev *dev = field->hidinput->input; + + switch (usage->hid) { + case HID_DG_TIPSWITCH: + priv->touch = value; + break; + case HID_GD_X: + priv->x = value; + break; + case HID_GD_Y: + priv->y = value; + break; + default: + /* fallback to the generic hidinput handling */ + return 0; + } + + penmount_process(dev, priv); + } + + if ((hdev->claimed & HID_CLAIMED_HIDDEV) && (hdev->hiddev_hid_event)) + hdev->hiddev_hid_event(hdev, field, usage, value); + + return 1; +} + +static int penmount_probe(struct hid_device *hdev, + const struct hid_device_id *id) +{ + struct penmount_priv *priv; + int ret = 0; + + priv = kzalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + hid_set_drvdata(hdev, priv); + + ret = hid_parse(hdev); + if (ret) { + hid_err(hdev, "parse failed\n"); + goto err_free; + } + + ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT); + if (ret) { + hid_err(hdev, "hw start failed\n"); + goto err_free; + } + + return 0; + +err_free: + kfree(priv); + return ret; +} + +static void penmount_remove(struct hid_device *hdev) +{ + struct penmount_priv *priv = hid_get_drvdata(hdev); + + hid_hw_stop(hdev); + kfree(priv); +} + +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 const struct hid_usage_id penmount_usages[] = { + { HID_ANY_ID, HID_ANY_ID, HID_ANY_ID }, + { HID_ANY_ID - 1, HID_ANY_ID - 1, HID_ANY_ID - 1 } +}; + +static struct hid_driver penmount_driver = { + .name = "hid-penmount", + .id_table = penmount_devices, + .probe = penmount_probe, + .remove = penmount_remove, + .input_mapping = penmount_input_mapping, + .usage_table = penmount_usages, + .event = penmount_event, +}; + +static int __init penmount_init(void) +{ + return hid_register_driver(&penmount_driver); +} + +static void __exit penmount_exit(void) +{ + hid_unregister_driver(&penmount_driver); +} + +module_init(penmount_init); +module_exit(penmount_exit); + +MODULE_AUTHOR("PenMount Touch Solutions <penmount@seed.net.tw>"); +MODULE_DESCRIPTION("PenMount HID TouchScreen Driver"); +MODULE_LICENSE("GPL");
This driver is a cleaned up version of http://git.android-x86.org/?p=kernel/cdv.git;a=blob_plain;f=drivers/hid/hid-penmount.c;hb=HEAD As I only have a PenMount 6000 to test I removed the multi touch support from the dirver. Bus 002 Device 006: ID 14e1:6000 Dialogue Technology Corp. Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x14e1 Dialogue Technology Corp. idProduct 0x6000 bcdDevice a4.b4 iManufacturer 1 DIALOGUE INC iProduct 2 PenMount USB iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 41 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 4 full speed bmAttributes 0xa0 (Bus Powered) Remote Wakeup MaxPower 500mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 3 EndPoint1 Interrupt Pipe HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.01 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 76 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0005 1x 5 bytes bInterval 1 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0005 1x 5 bytes bInterval 1 Device Status: 0x0000 (Bus Powered) Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com> --- drivers/hid/Kconfig | 6 ++ drivers/hid/Makefile | 1 + drivers/hid/hid-core.c | 1 + drivers/hid/hid-ids.h | 1 + drivers/hid/hid-penmount.c | 200 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 209 insertions(+) create mode 100644 drivers/hid/hid-penmount.c