Re: [PATCH] HID: add support for PenMount HID TouchScreen Driver

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

 



Hi Benjamin.

2014-08-25 17:43 GMT+02:00 Benjamin Tissoires <benjamin.tissoires@xxxxxxxxx>:
> On Mon, Aug 25, 2014 at 10:48 AM, Christian Gmeiner
> <christian.gmeiner@xxxxxxxxx> 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@xxxxxxxxx>
>> ---
>>  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@xxxxxxxxxxx>
>> + *
>> + */
>> +
>> +/*
>> + * 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@xxxxxxxxxxx>");
>> +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@xxxxxxxxxxxxxxx
>> 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@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[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