Re: [PATCH] HID: add support for PenMount dual-touch panel
From: Benjamin Tissoires
Date: Wed Apr 20 2011 - 05:54:17 EST
Hi Henrik,
On Wed, Apr 20, 2011 at 11:47, Henrik Rydberg <rydberg@xxxxxxxxxxx> wrote:
> Hi,
>
> thanks for the patch. Please find comments inline.
>
> On Wed, Apr 20, 2011 at 05:19:15PM +0800, PenMount wrote:
>> This patch adds PenMount support to hid-multitouch.
>> A new class MT_CLS_CONFIDENCE_SERIAL_MODE is defined for PenMount,
>> since it uses HID_DG_CONFIDENCE as the valid flag.
>> A new quirk MT_QUIRK_SERIAL_REPORT_MODE is defined,
>> since PenMount uses serial reporting mode and there is no
>> HID_DG_CONTACTCOUNT usage in it's report descriptor.
>>
>> Signed-off-by: PenMount <salt@xxxxxxxxxxx>
>> Reviewed-by: Benjamin Tissoires <benjamin.tissoires@xxxxxxx>
>> ---
>> drivers/hid/Kconfig | 1 +
>> drivers/hid/hid-core.c | 1 +
>> drivers/hid/hid-ids.h | 3 +++
>> drivers/hid/hid-multitouch.c | 14 ++++++++++++++
>> 4 files changed, 19 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
>> index 996ae3a..8058cf1 100644
>> --- a/drivers/hid/Kconfig
>> +++ b/drivers/hid/Kconfig
>> @@ -313,6 +313,7 @@ config HID_MULTITOUCH
>> - Cypress TrueTouch panels
>> - Hanvon dual touch panels
>> - IrTouch Infrared USB panels
>> + - PenMount dual touch panels
>> - Pixcir dual touch panels
>> - 'Sensing Win7-TwoFinger' panel by GeneralTouch
>> - eGalax dual-touch panels, including the
>> diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
>> index c3d6626..6e31b9f 100644
>> --- a/drivers/hid/hid-core.c
>> +++ b/drivers/hid/hid-core.c
>> @@ -1438,6 +1438,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_PCI) },
>> { HID_USB_DEVICE(USB_VENDOR_ID_PETALYNX, USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE) },
>> { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH) },
>> { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN) },
>> diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
>> index d485894..a4d0505 100644
>> --- a/drivers/hid/hid-ids.h
>> +++ b/drivers/hid/hid-ids.h
>> @@ -487,6 +487,9 @@
>> #define USB_VENDOR_ID_PETALYNX 0x18b1
>> #define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037
>>
>> +#define USB_VENDOR_ID_PENMOUNT 0x14e1
>> +#define USB_DEVICE_ID_PENMOUNT_PCI 0x3500
>> +
>> #define USB_VENDOR_ID_PHILIPS 0x0471
>> #define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617
>>
>> diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
>> index 0175f85..c88d96d 100644
>> --- a/drivers/hid/hid-multitouch.c
>> +++ b/drivers/hid/hid-multitouch.c
>> @@ -50,6 +50,7 @@ MODULE_LICENSE("GPL");
>> #define MT_QUIRK_VALID_IS_INRANGE (1 << 4)
>> #define MT_QUIRK_VALID_IS_CONFIDENCE (1 << 5)
>> #define MT_QUIRK_EGALAX_XYZ_FIXUP (1 << 6)
>> +#define MT_QUIRK_SERIAL_REPORT_MODE (1 << 7)
>>
>> struct mt_slot {
>> __s32 x, y, p, w, h;
>> @@ -89,6 +90,7 @@ struct mt_class {
>> #define MT_CLS_EGALAX 5
>> #define MT_CLS_STANTUM 6
>> #define MT_CLS_3M 7
>> +#define MT_CLS_CONFIDENCE_SERIAL_MODE 8
>>
>> #define MT_DEFAULT_MAXCONTACT 10
>>
>> @@ -156,6 +158,9 @@ struct mt_class mt_classes[] = {
>> .sn_move = 2048,
>> .sn_width = 128,
>> .sn_height = 128 },
>> + { .name = MT_CLS_CONFIDENCE_SERIAL_MODE,
>> + .quirks = MT_QUIRK_VALID_IS_CONFIDENCE |
>> + MT_QUIRK_SERIAL_REPORT_MODE },
>>
>> { }
>> };
>> @@ -196,6 +201,10 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
>> struct mt_class *cls = td->mtclass;
>> __s32 quirks = cls->quirks;
>>
>> + if ((quirks & MT_QUIRK_SERIAL_REPORT_MODE) &&
>> + (!td->last_field_index))
>> + td->last_field_index = field->report->maxfield - 1;
>> +
>
> Are the events not emitted automatically per touch, if the lines above are omitted?
>
>> switch (usage->hid & HID_USAGE_PAGE) {
>>
>> case HID_UP_GENDESK:
>> @@ -585,6 +594,11 @@ static const struct hid_device_id mt_devices[] = {
>> HID_USB_DEVICE(USB_VENDOR_ID_IRTOUCHSYSTEMS,
>> USB_DEVICE_ID_IRTOUCH_INFRARED_USB) },
>>
>> + /* PenMount panels */
>> + { .driver_data = MT_CLS_CONFIDENCE_SERIAL_MODE,
>> + HID_USB_DEVICE(USB_VENDOR_ID_PENMOUNT,
>> + USB_DEVICE_ID_PENMOUNT_PCI) },
>> +
>> /* PixCir-based panels */
>> { .driver_data = MT_CLS_DUAL_INRANGE_CONTACTID,
>> HID_USB_DEVICE(USB_VENDOR_ID_HANVON,
>> --
>> 1.7.4.1
>>
>
> Benjamin: Since field->index == 0 is in use, it seems the driver could
> execute event emission wrongly under some circumstances (when
> last_field_index == 0). Is that related to the reason for the quirk in
> this patch?
In fact, I have a second patch just on top of this one. It has been
tested by Ryan with PenMount devices.
I was waiting for Penmount to be included first as it does not impact
any other drivers.
I inline the code here, but my gmail client will destroy tabs (so I
attached it too)....
Can you test it against 3M?
Richard, can you test it (after applying the PenMount patch) too?
Thanks,
Benjamin