HID: Dead ./debug/hid/xxx/events
Hello everyone,
the context for this problem is getting the eGalax USB Touchscreen, ID 056a:0090, to work as such, as it is discussed on the linuxwacom-devel list (see [1]).
Quickly summarized:
Adding the device as USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH5, in line with the ..._MULTITOUCH[1-4], succeeds in thus far, as that it appears as a HID Touchscreen. However, as of 3.1.x, clicking, id est touching "jams" as in the click is never released.
Updating to 3.2.x-torvalds' kernel should have resolved that jamming, but instead no clicks or releases are recognized at all.
The real problem with debugging that, though, is that
/sys/kernel/debug/hid/<eGalax>/events
remains dead, in any kernel, 3.1.x-gentoo, 3.1.x-vanilla and 3.2.x-torvalds alike.
I hope that you may have an idea as for any of the problems, especially why there appears no output on the ./events node (the according node for my keyboard reports events just fine).
Pasted is .config [2] for 3.2.x-torvalds and ./hid/<eGalax>/rdesc [3] on 3.2.x-torvalds.
[1]
http://sourceforge.net/mailarchive/forum.php?thread_name=CAGzDe_Y2cSMxVPm-rcNSrMsew2V5Y0vbVyhXJBFCKraq7EaZ8g@mail.gmail.com&forum_name=linuxwacom-devel
[2] http://paste.pocoo.org/show/508548/
[3] http://paste.pocoo.org/show/508550/
Hi Cedric,
If I understand correctly, your device is an eGalax one with a Wacom VendorID... ;-)
I assume that you're the first of a long list that will encounter this kind of problem:
Now, hid (the generic hid input layer) can detect if your device is a multitouch one (by relying on the ContactID field in the report descriptor), and it will release it if it's detected.
The counter part of this autodetection (in hid-multitouch) has not been judged as enough mature to be included in the kernel, and hid-multitouch can't handle your device automatically.
That's why you don't see any event* unless you add the VID:PID in hid-multitouch.
I'm currently working on a solution to allow end-user to test more efficiently their device with hid-multitouch.
If you want to be my guinea pig, it would help me.
Cheers,
Benjamin
Quoted 30 lines · Cedric Sodhi
Hello everyone,
the context for this problem is getting the eGalax USB Touchscreen, ID 056a:0090, to work as such, as it is discussed on the linuxwacom-devel list (see [1]).
Quickly summarized:
Adding the device as
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH5, in line with the ..._MULTITOUCH[1-4], succeeds in thus far, as that it appears as a HID Touchscreen. However, as of 3.1.x, clicking, id est touching "jams" as in the click is never released.Updating to 3.2.x-torvalds' kernel should have resolved that jamming, but instead no clicks or releases are recognized at all.
The real problem with debugging that, though, is that
/sys/kernel/debug/hid/<eGalax>/events
remains dead, in any kernel, 3.1.x-gentoo, 3.1.x-vanilla and 3.2.x-torvalds alike.
I hope that you may have an idea as for any of the problems, especially why there appears no output on the ./events node (the according node for my keyboard reports events just fine).
Pasted is .config [2] for 3.2.x-torvalds and ./hid/<eGalax>/rdesc [3] on 3.2.x-torvalds.
Quoted 9 lines
[1]
http://sourceforge.net/mailarchive/forum.php?thread_name=CAGzDe_Y2cSMxVPm-rcNSrMsew2V5Y0vbVyhXJBFCKraq7EaZ8g@mail.gmail.com&forum_name=linuxwacom-devel
[2] http://paste.pocoo.org/show/508548/
[3] http://paste.pocoo.org/show/508550/
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Dear Benjamin,
Quoted 4 lines · Benjamin Tissoires
Hi Cedric,
If I understand correctly, your device is an eGalax one with a Wacom VendorID... ;-)
No. The VID is that of DWAV, as it should be. It might have been misleading to mention Wacom here, which is - at least with regard to the issue at hand - not related. I was just lucky the guys (esp. Chris) at linuxwacom-devel would take a look at the issue, since obviously, they are experts on touchscreens.
Quoted 3 lines
I assume that you're the first of a long list that will encounter this kind of problem:
You are right. I'm not the first, either, though. The eGalax is the touchdevice of the ASUS EEE Slate, in conjunction with a Wacom for the pen (yes, two devices: eGalax for finger and Wacom for pen).
Quoted 10 lines
Now, hid (the generic hid input layer) can detect if your device is a multitouch one (by relying on the ContactID field in the report descriptor), and it will release it if it's detected.
The counter part of this autodetection (in hid-multitouch) has not been judged as enough mature to be included in the kernel, and hid-multitouch can't handle your device automatically.That's why you don't see any event* unless you add the VID:PID in hid-multitouch.
That's what I already did, as I tried to describe by saying that I added "MULTITOUCH5" in line with the other MULTITOUCH[1-4] of DWAV VID.
Quoted 4 lines
I'm currently working on a solution to allow end-user to test more efficiently their device with hid-multitouch.
If you want to be my guinea pig, it would help me.
I'd happily be your guinea pig. I suggest you browse through the thread which I referred to, where Chris helped me solve a bulk of the problems already and also told me how to add the VID:PID to the whitelist of hid-multitouch.
regards,
Cedric
Quoted 44 lines
Cheers,
BenjaminQuoted 39 lines · Cedric Sodhi
Hello everyone,
the context for this problem is getting the eGalax USB Touchscreen, ID 056a:0090, to work as such, as it is discussed on the linuxwacom-devel list (see [1]).
Quickly summarized:
Adding the device as
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH5, in line with the ..._MULTITOUCH[1-4], succeeds in thus far, as that it appears as a HID Touchscreen. However, as of 3.1.x, clicking, id est touching "jams" as in the click is never released.Updating to 3.2.x-torvalds' kernel should have resolved that jamming, but instead no clicks or releases are recognized at all.
The real problem with debugging that, though, is that
/sys/kernel/debug/hid/<eGalax>/events
remains dead, in any kernel, 3.1.x-gentoo, 3.1.x-vanilla and 3.2.x-torvalds alike.
I hope that you may have an idea as for any of the problems, especially why there appears no output on the ./events node (the according node for my keyboard reports events just fine).
Pasted is .config [2] for 3.2.x-torvalds and ./hid/<eGalax>/rdesc [3] on 3.2.x-torvalds.
[1]
http://sourceforge.net/mailarchive/forum.php?thread_name=CAGzDe_Y2cSMxVPm-rcNSrMsew2V5Y0vbVyhXJBFCKraq7EaZ8g@mail.gmail.com&forum_name=linuxwacom-devel
[2] http://paste.pocoo.org/show/508548/
[3] http://paste.pocoo.org/show/508550/
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 39 lines · Cedric Sodhi
Dear Benjamin,
Quoted 4 lines · Benjamin Tissoires
Hi Cedric,
If I understand correctly, your device is an eGalax one with a Wacom VendorID... ;-)
No. The VID is that of DWAV, as it should be. It might have been misleading to mention Wacom here, which is - at least with regard to the issue at hand - not related. I was just lucky the guys (esp. Chris) at linuxwacom-devel would take a look at the issue, since obviously, they are experts on touchscreens.
Quoted 3 lines
I assume that you're the first of a long list that will encounter this kind of problem:
You are right. I'm not the first, either, though. The eGalax is the touchdevice of the ASUS EEE Slate, in conjunction with a Wacom for the pen (yes, two devices: eGalax for finger and Wacom for pen).
Quoted 10 lines
Now, hid (the generic hid input layer) can detect if your device is a multitouch one (by relying on the ContactID field in the report descriptor), and it will release it if it's detected.
The counter part of this autodetection (in hid-multitouch) has not been judged as enough mature to be included in the kernel, and hid-multitouch can't handle your device automatically.That's why you don't see any event* unless you add the VID:PID in hid-multitouch.
That's what I already did, as I tried to describe by saying that I added "MULTITOUCH5" in line with the other MULTITOUCH[1-4] of DWAV VID.
Quoted 4 lines
I'm currently working on a solution to allow end-user to test more efficiently their device with hid-multitouch.
If you want to be my guinea pig, it would help me.
Quoted 47 lines
I'd happily be your guinea pig. I suggest you browse through the thread which I referred to, where Chris helped me solve a bulk of the problems already and also told me how to add the VID:PID to the whitelist of hid-multitouch.
regards,
CedricQuoted 40 lines
Cheers,
BenjaminQuoted 35 lines · Cedric Sodhi
Hello everyone,
the context for this problem is getting the eGalax USB Touchscreen, ID 056a:0090, to work as such, as it is discussed on the linuxwacom-devel list (see [1]).
Quickly summarized:
Adding the device as
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH5, in line with the ..._MULTITOUCH[1-4], succeeds in thus far, as that it appears as a HID Touchscreen. However, as of 3.1.x, clicking, id est touching "jams" as in the click is never released.Updating to 3.2.x-torvalds' kernel should have resolved that jamming, but instead no clicks or releases are recognized at all.
The real problem with debugging that, though, is that
/sys/kernel/debug/hid/<eGalax>/events
remains dead, in any kernel, 3.1.x-gentoo, 3.1.x-vanilla and 3.2.x-torvalds alike.
I hope that you may have an idea as for any of the problems, especially why there appears no output on the ./events node (the according node for my keyboard reports events just fine).
Pasted is .config [2] for 3.2.x-torvalds and ./hid/<eGalax>/rdesc [3] on 3.2.x-torvalds.
[1]
http://sourceforge.net/mailarchive/forum.php?thread_name=CAGzDe_Y2cSMxVPm-rcNSrMsew2V5Y0vbVyhXJBFCKraq7EaZ8g@mail.gmail.com&forum_name=linuxwacom-devel
[2] http://paste.pocoo.org/show/508548/
[3] http://paste.pocoo.org/show/508550/
--
And a little extra info. Cedric tested the patch that is now in Jiri's upstream-fixes branch for this new 0xa0001 and got success so I sent in patch. After several days, he tested closer and realized it was getting X/Y movement and what I'll call unpredictable Touch behaviour. It would either act like a stylus hovering but never touching or it would always act like touching and never release.
Events are working and you can test with evtest. I've verified at least one test stream he emailed that it is not correctly sending BTN_TOUCH but it is sending good X/Y using MT and pointer emulation events.
It would probably be easy to see the issue if debug/hid/*/events were being displayed but for some reason "cat rdesc" outputs stuff but "cat events" does not. I couldn't come up with more ideas remotely.
The redesc shows it reports ContactID's range of 0-16 and features says only 10 touches max (seen in above paste link). So my last guess is that we may be using the wrong quirk for this one since it sounds like ContactID is not 1-to-1 with touches. Hard to tell without sample events though.
Chris
Quoted 16 lines · Chris Bagwell
And a little extra info. Cedric tested the patch that is now in Jiri's upstream-fixes branch for this new
0xa0001and got success so I sent in patch. After several days, he tested closer and realized it was getting X/Y movement and what I'll call unpredictable Touch behaviour. It would either act like a stylus hovering but never touching or it would always act like touching and never release.Events are working and you can test with evtest. I've verified at least one test stream he emailed that it is not correctly sending
BTN_TOUCHbut it is sending good X/Y using MT and pointer emulation events.It would probably be easy to see the issue if debug/hid/*/events were being displayed but for some reason "cat rdesc" outputs stuff but "cat events" does not. I couldn't come up with more ideas remotely.
Quoted 7 lines
The redesc shows it reports ContactID's range of 0-16 and features says only 10 touches max (seen in above paste link). So my last guess is that we may be using the wrong quirk for this one since it sounds like ContactID is not 1-to-1 with touches. Hard to tell without sample events though.
Chris
Chris, it might interest you that the event node now fires and outputs events, when letting hid-multitouch handle the device through Benjamin's patch (Writing "3 0eef a001 1" to new_id).
I think when adding the MULTITOUCH5 in the source in the exact same manner MULTITOUCH[1-4] are added I must have copied some quirks which interfere with the event node. Now, adding the device by Benjamin's way does not load any quirks by default, so the event node works.
Either Benjamin or I will tell you more once we discovered something definite.
regards,
Cedric
Thanks to Benjamin's help and his neat patch which allows tempering with quirks through sysfs, I got the device
eGalax 0eef:a001
to work. It works with the quirks
MT_QUIRK_SLOT_IS_CONTACTID | MT_QUIRK_ALWAYS_VALID ( = 18 )
so, using Benjamin's interface:
(1) Adding the device with
$ cd '/sys/modules/hid_multitouch/driver/hid:hid-multitouch' $ echo "3 0eef a001 1" > new_id
(2) Setting the quirks with
$ echo 18 > '0003:0EEF:A001.0001/quirks'
That's it. The device works!
regards,
Cedric
Quoted 11 lines · Cedric Sodhi
Thanks to Benjamin's help and his neat patch which allows tempering with quirks through sysfs, I got the device
eGalax 0eef:a001
to work. It works with the quirks
MT_QUIRK_SLOT_IS_CONTACTID|MT_QUIRK_ALWAYS_VALID( = 18 )so, using Benjamin's interface:
Quoted 8 lines
(1) Adding the device with
$ cd '/sys/modules/hid_multitouch/driver/hid:hid-multitouch' $ echo "3 0eef a001 1" > new_id(2) Setting the quirks with
$ echo 18 > '0003:0EEF:A001.0001/quirks'That's it. The device works!
Benjamin, do you have a take away from this? We are setting quirks to 0x62 which should same as 0x12 for most purposes. Combine this with the Acer eGalax patch and my guess is its .maxcontacts = 2 thats hurting things?
If so, do you have enough report descriptors to know if we can remove it for all or if we need to create an MT_CLS_EGALAX_HAS_MAXCONTACTS? My guess is for the ones that have correct MAXCONTACTS, they also have valid logical X/Y sizes and so we can remote that quirk as well. At least this one does.
Chris
Quoted 4 lines
regards,
Cedric
Quoted 19 lines · Chris Bagwell
Quoted 18 lines · Cedric Sodhi
Thanks to Benjamin's help and his neat patch which allows tempering with quirks through sysfs, I got the device
eGalax 0eef:a001
to work. It works with the quirks
MT_QUIRK_SLOT_IS_CONTACTID|MT_QUIRK_ALWAYS_VALID( = 18 )so, using Benjamin's interface:
(1) Adding the device with
$ cd '/sys/modules/hid_multitouch/driver/hid:hid-multitouch' $ echo "3 0eef a001 1" > new_id(2) Setting the quirks with
$ echo 18 > '0003:0EEF:A001.0001/quirks'
Quoted 6 lines
Quoted 1 line
That's it. The device works!
Benjamin, do you have a take away from this? We are setting quirks to
0x62which should same as0x12for most purposes. Combine this with the Acer eGalax patch and my guess is its .maxcontacts = 2 thats hurting things?
Well, Cedric as troubles again. I don't think the hiddev interface problem is related to hid-multitouch. The point is that his device "works", i.e. it emits events in /dev/input/eventX, but the hiddev event doesn't.
BTW, my patch is nearly ready. I mainly missed the Documentation ABI:
Quoted 1 line
From
a1890f599e9a2e3af3b1161a0224e470915065b0Mon Sep 17 00:00:00 2001
From: Benjamin Tissoires <[email protected]>
Date: Wed, 16 Nov 2011 17:48:34 +0100
Subject: [PATCH 2/2] hid-multitouch: WIP: create sysfs attribute to control
quirks from user-space
--- drivers/hid/hid-multitouch.c | 120 +++++++++++++++++++++++++++++++++++------ 1 files changed, 102 insertions(+), 18 deletions(-)
drivers/hid/hid-multitouch.c +102 -18
@@ -60,9 +60,19 @@ struct mt_slot {bool seen_in_this_frame;/* has this slot been updated */ }; +struct mt_class { +__s32 name;/* MT_CLS */ +__s32 quirks; +__s32 sn_move;/* Signal/noise ratio for move events */ +__s32 sn_width;/* Signal/noise ratio for width events */ +__s32 sn_height;/* Signal/noise ratio for height events */ +__s32 sn_pressure;/* Signal/noise ratio for pressure events */ +__u8 maxcontacts; +}; +struct mt_device {struct mt_slot curdata;/* placeholder of incoming data */ -struct mt_class *mtclass;/* our mt device class */ +struct mt_class mtclass;/* our mt device class */ unsigned last_field_index;/* last field index of the report */ unsigned last_slot_field;/* the last field of a slot */ int last_mt_collection;/* last known mt-related collection */
@@ -74,16 +84,6 @@ struct mt_device {struct mt_slot *slots; }; -struct mt_class { -__s32 name;/* MT_CLS */ -__s32 quirks; -__s32 sn_move;/* Signal/noise ratio for move events */ -__s32 sn_width;/* Signal/noise ratio for width events */ -__s32 sn_height;/* Signal/noise ratio for height events */ -__s32 sn_pressure;/* Signal/noise ratio for pressure events */ -__u8 maxcontacts; -}; -/* classes of device behavior */ #define MT_CLS_DEFAULT 0x0001
@@ -188,6 +188,87 @@ struct mt_class mt_classes[] = { { } }; +static ssize_t mt_show_quirks (struct device *dev, +struct device_attribute *attr, +char *buf) +{ + struct hid_device *hdev = container_of(dev, struct hid_device, dev); +struct mt_device *td =hid_get_drvdata (hdev); + +return sprintf (buf,"%u\n" , td->mtclass.quirks); +} + +static ssize_t mt_set_quirks (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count) +{ + struct hid_device *hdev = container_of(dev, struct hid_device, dev); +struct mt_device *td =hid_get_drvdata (hdev); + +unsigned long val; + +if (strict_strtoul (buf,0 , &val)) +return -EINVAL ; + + td->mtclass.quirks = val; + +return count; +} + +static DEVICE_ATTR(quirks, S_IWUSR | S_IRUGO, mt_show_quirks, mt_set_quirks); + +static ssize_t mt_show_class (struct device *dev, +struct device_attribute *attr, +char *buf) +{ + struct hid_device *hdev = container_of(dev, struct hid_device, dev); +struct mt_device *td =hid_get_drvdata (hdev); + +return sprintf (buf,"0x%x\n" , td->mtclass.name); +} + +static ssize_t mt_set_class (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count) +{ + struct hid_device *hdev = container_of(dev, struct hid_device, dev); +struct mt_device *td =hid_get_drvdata (hdev); +struct mt_class *mtclass =NULL ;/* MT_CLS_DEFAULT */ +int i; + +unsigned long val; + +if (strict_strtoul (buf,0 , &val)) +return -EINVAL ; + + +for (i =0 ; mt_classes[i].name ; i++) { +if (val == mt_classes[i].name) { + mtclass = &(mt_classes[i]); +break ; + } + } + +if (!mtclass) +return -EINVAL ; + + td->mtclass = *mtclass; + +return count; +} + +static DEVICE_ATTR(class, S_IWUSR | S_IRUGO, mt_show_class, mt_set_class); + +static struct attribute *sysfs_attrs[] = { + &dev_attr_quirks.attr, + &dev_attr_class.attr, +NULL +}; + +static struct attribute_group mt_attribute_group = { + .attrs = sysfs_attrs +}; +static void mt_feature_mapping (struct hid_device *hdev,struct hid_field *field,struct hid_usage *usage) {
@@ -199,9 +280,9 @@ static void mt_feature_mapping(struct hid_device *hdev,break ;case HID_DG_CONTACTMAX : td->maxcontacts = field->value[0 ]; -if (td->mtclass->maxcontacts) +if (td->mtclass.maxcontacts)/* check if the maxcontacts is given by the class */ - td->maxcontacts = td->mtclass->maxcontacts; + td->maxcontacts = td->mtclass.maxcontacts;break ; }
@@ -221,7 +302,7 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi, unsigned long **bit, int *max) { struct mt_device *td = hid_get_drvdata(hdev); -struct mt_class *cls = td->mtclass; +struct mt_class *cls = &td->mtclass;__s32 quirks = cls->quirks;/* Only map fields from TouchScreen or TouchPad collections.
@@ -370,7 +451,7 @@ static int mt_input_mapped(struct hid_device *hdev, struct hid_input *hi,static int mt_compute_slot (struct mt_device *td) { -__s32 quirks = td->mtclass->quirks; +__s32 quirks = td->mtclass.quirks;if (quirks &MT_QUIRK_SLOT_IS_CONTACTID )return td->curdata.contactid;
@@ -414,7 +495,7 @@ static void mt_emit_event(struct mt_device *td, struct input_dev *input)for (i =0 ; i < td->maxcontacts; ++i) {struct mt_slot *s = &(td->slots[i]); -if ((td->mtclass->quirks &MT_QUIRK_NOT_SEEN_MEANS_UP ) && +if ((td->mtclass.quirks &MT_QUIRK_NOT_SEEN_MEANS_UP ) && !s->seen_in_this_frame) { s->touch_state = false; }
@@ -451,7 +532,7 @@ static int mt_event(struct hid_device *hid, struct hid_field *field, struct hid_usage *usage, __s32 value) {struct mt_device *td =hid_get_drvdata (hid); -__s32 quirks = td->mtclass->quirks; +__s32 quirks = td->mtclass.quirks;if (hid->claimed &HID_CLAIMED_INPUT && td->slots) {switch (usage->hid) {
@@ -559,7 +640,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)dev_err (&hdev->dev,"cannot allocate multitouch data\n" );return -ENOMEM ; } - td->mtclass = mtclass; + td->mtclass = *mtclass; td->inputmode =-1 ; td->last_mt_collection =-1 ;hid_set_drvdata (hdev, td);
@@ -581,6 +662,8 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) goto fail; } + ret =sysfs_create_group (&hdev->dev.kobj, &mt_attribute_group); +mt_set_input_mode (hdev);return 0 ;
@@ -601,6 +684,7 @@ static int mt_reset_resume(struct hid_device *hdev)static void mt_remove (struct hid_device *hdev) {struct mt_device *td =hid_get_drvdata (hdev); +sysfs_remove_group (&hdev->dev.kobj, &mt_attribute_group);hid_hw_stop (hdev);kfree (td->slots);kfree (td);
Signature · 1 line
1.7.4.4
Quoted 6 lines
If so, do you have enough report descriptors to know if we can remove it for all or if we need to create an
MT_CLS_EGALAX_HAS_MAXCONTACTS? My guess is for the ones that have correct MAXCONTACTS, they also have valid logical X/Y sizes and so we can remote that quirk as well. At least this one does.
I'll have to digg it through them....
Cheers,
Benjamin
Quoted 7 lines
Chris
Quoted 4 lines
regards,
Cedric
Dear Benjamin,
I applied your patch tp 3.2-jikos (uname shows 3.1, though). The diff to jikos' original is now [attached].
Chris says the output of evtest still signifies problems with multitouch:
Quoted 14 lines
Quoted 1 line
Cedric, can you send these logs to Benjamin for ideas? The HID events look good but the evtest log for 2 fingers is not. The two touches are fighting each other. That "-1" value is interrupted as each finger is being lifted in between each new X/Y report.
Also, can you send me and Benjamin the source code diff of what your testing against kernel tree?
The behavior in your evtest log looks like what would happen if your setting the
MT_QUIRK_NOT_SEEN_MEANS_UP. Since your HW only sends 1 fingers worth of data per packet, you do not want that quirk.
Quoted 5 lines
I'll still hold off on xf86-input-wacom issues until the events coming are sane. Your current events will cause xf86-input-wacom to do all kinds of weird stuff thats not worth effort to weed threw.
Chris
These logs in that tarfile were created while still manually adding the ID via your sysfs interface. You find yet another evtest log for two-finger touch attached.
Cedric
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0xeef product 0xa001 version 0x210 Input device name: "eGalax_eMPIA Technology Inc. PCAP MultiTouch Controller" Supported events:
Event type 0 (Sync)
Event type 1 (Key)
Event code 330 (Touch)
Event type 3 (Absolute)
Event code 0 (X)
Value 23408
Min 0
Max 32767
Fuzz 7
Event code 1 (Y)
Value 19664
Min 0
Max 32767
Fuzz 7
Event code 47 (Slot)
Value 0
Min 0
Max 9
Event code 53 (Position X)
Value 0
Min 0
Max 32767
Fuzz 7
Event code 54 (Position Y)
Value 0
Min 0
Max 32767
Fuzz 7
Event code 57 (Tracking ID)
Value 0
Min 0
Max 65535Testing ... (interrupt to exit)
Event: time 1321475730.593802, type 3 (Absolute), code 57 (Tracking ID), value 7
Event: time 1321475730.593804, type 3 (Absolute), code 53 (Position X), value 19920
Event: time 1321475730.593804, type 3 (Absolute), code 54 (Position Y), value 18048
Event: time 1321475730.593815, type 1 (Key), code 330 (Touch), value 1
Event: time 1321475730.593817, type 3 (Absolute), code 0 (X), value 19920
Event: time 1321475730.593818, type 3 (Absolute), code 1 (Y), value 18048
Event: time 1321475730.593818, -------------- Report Sync ------------
Event: time 1321475730.641804, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475730.641805, type 3 (Absolute), code 57 (Tracking ID), value 8
Event: time 1321475730.641806, type 3 (Absolute), code 53 (Position X), value 20544
Event: time 1321475730.641807, type 3 (Absolute), code 54 (Position Y), value 9504
Event: time 1321475730.641819, -------------- Report Sync ------------
Event: time 1321475730.816799, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475730.816799, type 3 (Absolute), code 53 (Position X), value 19888
Event: time 1321475730.816800, type 3 (Absolute), code 54 (Position Y), value 18032
Event: time 1321475730.816815, type 3 (Absolute), code 0 (X), value 19888
Event: time 1321475730.816815, type 3 (Absolute), code 1 (Y), value 18032
Event: time 1321475730.816816, -------------- Report Sync ------------
Event: time 1321475730.823797, type 3 (Absolute), code 53 (Position X), value 19872
Event: time 1321475730.823798, type 3 (Absolute), code 54 (Position Y), value 18016
Event: time 1321475730.823813, type 3 (Absolute), code 0 (X), value 19872
Event: time 1321475730.823813, type 3 (Absolute), code 1 (Y), value 18016
Event: time 1321475730.823814, -------------- Report Sync ------------
Event: time 1321475730.830799, type 3 (Absolute), code 53 (Position X), value 19856
Event: time 1321475730.830815, type 3 (Absolute), code 0 (X), value 19856
Event: time 1321475730.830816, -------------- Report Sync ------------
Event: time 1321475730.837798, type 3 (Absolute), code 53 (Position X), value 19840
Event: time 1321475730.837814, type 3 (Absolute), code 0 (X), value 19840
Event: time 1321475730.837815, -------------- Report Sync ------------
Event: time 1321475730.851796, type 3 (Absolute), code 53 (Position X), value 19808
Event: time 1321475730.851797, type 3 (Absolute), code 54 (Position Y), value 18000
Event: time 1321475730.851812, type 3 (Absolute), code 0 (X), value 19808
Event: time 1321475730.851812, type 3 (Absolute), code 1 (Y), value 18000
Event: time 1321475730.851813, -------------- Report Sync ------------
Event: time 1321475730.858792, type 3 (Absolute), code 53 (Position X), value 19792
Event: time 1321475730.858792, type 3 (Absolute), code 54 (Position Y), value 17984
Event: time 1321475730.858807, type 3 (Absolute), code 0 (X), value 19792
Event: time 1321475730.858808, type 3 (Absolute), code 1 (Y), value 17984
Event: time 1321475730.858809, -------------- Report Sync ------------
Event: time 1321475730.866782, type 3 (Absolute), code 53 (Position X), value 19776
Event: time 1321475730.866798, type 3 (Absolute), code 0 (X), value 19776
Event: time 1321475730.866799, -------------- Report Sync ------------
Event: time 1321475730.873779, type 3 (Absolute), code 53 (Position X), value 19760
Event: time 1321475730.873795, type 3 (Absolute), code 0 (X), value 19760
Event: time 1321475730.873796, -------------- Report Sync ------------
Event: time 1321475730.908793, type 3 (Absolute), code 53 (Position X), value 19744
Event: time 1321475730.908794, type 3 (Absolute), code 54 (Position Y), value 17968
Event: time 1321475730.908809, type 3 (Absolute), code 0 (X), value 19744
Event: time 1321475730.908810, type 3 (Absolute), code 1 (Y), value 17968
Event: time 1321475730.908811, -------------- Report Sync ------------
Event: time 1321475730.915792, type 3 (Absolute), code 53 (Position X), value 19728
Event: time 1321475730.915793, type 3 (Absolute), code 54 (Position Y), value 17952
Event: time 1321475730.915808, type 3 (Absolute), code 0 (X), value 19728
Event: time 1321475730.915808, type 3 (Absolute), code 1 (Y), value 17952
Event: time 1321475730.915809, -------------- Report Sync ------------
Event: time 1321475730.922798, type 3 (Absolute), code 53 (Position X), value 19712
Event: time 1321475730.922799, type 3 (Absolute), code 54 (Position Y), value 17936
Event: time 1321475730.922814, type 3 (Absolute), code 0 (X), value 19712
Event: time 1321475730.922814, type 3 (Absolute), code 1 (Y), value 17936
Event: time 1321475730.922815, -------------- Report Sync ------------
Event: time 1321475730.929798, type 3 (Absolute), code 53 (Position X), value 19696
Event: time 1321475730.929814, type 3 (Absolute), code 0 (X), value 19696
Event: time 1321475730.929815, -------------- Report Sync ------------
Event: time 1321475730.951802, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475730.951802, type 3 (Absolute), code 53 (Position X), value 20528
Event: time 1321475730.951803, type 3 (Absolute), code 54 (Position Y), value 9472
Event: time 1321475730.951815, -------------- Report Sync ------------
Event: time 1321475730.958847, type 3 (Absolute), code 54 (Position Y), value 9456
Event: time 1321475730.958873, -------------- Report Sync ------------
Event: time 1321475730.965844, type 3 (Absolute), code 54 (Position Y), value 9440
Event: time 1321475730.965869, -------------- Report Sync ------------
Event: time 1321475730.972801, type 3 (Absolute), code 54 (Position Y), value 9424
Event: time 1321475730.972814, -------------- Report Sync ------------
Event: time 1321475731.565796, type 3 (Absolute), code 53 (Position X), value 20512
Event: time 1321475731.565797, type 3 (Absolute), code 54 (Position Y), value 9408
Event: time 1321475731.565810, -------------- Report Sync ------------
Event: time 1321475731.572802, type 3 (Absolute), code 54 (Position Y), value 9392
Event: time 1321475731.572815, -------------- Report Sync ------------
Event: time 1321475731.579802, type 3 (Absolute), code 54 (Position Y), value 9360
Event: time 1321475731.579815, -------------- Report Sync ------------
Event: time 1321475731.586810, type 3 (Absolute), code 54 (Position Y), value 9344
Event: time 1321475731.586823, -------------- Report Sync ------------
Event: time 1321475732.141800, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.141800, type 3 (Absolute), code 54 (Position Y), value 17904
Event: time 1321475732.141816, type 3 (Absolute), code 1 (Y), value 17904
Event: time 1321475732.141816, -------------- Report Sync ------------
Event: time 1321475732.156793, type 3 (Absolute), code 53 (Position X), value 19728
Event: time 1321475732.156809, type 3 (Absolute), code 0 (X), value 19728
Event: time 1321475732.156810, -------------- Report Sync ------------
Event: time 1321475732.163798, type 3 (Absolute), code 53 (Position X), value 19744
Event: time 1321475732.163814, type 3 (Absolute), code 0 (X), value 19744
Event: time 1321475732.163815, -------------- Report Sync ------------
Event: time 1321475732.164802, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.164803, type 3 (Absolute), code 53 (Position X), value 20528
Event: time 1321475732.164816, -------------- Report Sync ------------
Event: time 1321475732.170779, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.170779, type 3 (Absolute), code 53 (Position X), value 19776
Event: time 1321475732.170794, type 3 (Absolute), code 0 (X), value 19776
Event: time 1321475732.170796, -------------- Report Sync ------------
Event: time 1321475732.171795, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.171796, type 3 (Absolute), code 53 (Position X), value 20560
Event: time 1321475732.171809, -------------- Report Sync ------------
Event: time 1321475732.177799, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.177799, type 3 (Absolute), code 53 (Position X), value 19808
Event: time 1321475732.177815, type 3 (Absolute), code 0 (X), value 19808
Event: time 1321475732.177816, -------------- Report Sync ------------
Event: time 1321475732.178802, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.178802, type 3 (Absolute), code 53 (Position X), value 20592
Event: time 1321475732.178815, -------------- Report Sync ------------
Event: time 1321475732.184800, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.184801, type 3 (Absolute), code 53 (Position X), value 19840
Event: time 1321475732.184816, type 3 (Absolute), code 0 (X), value 19840
Event: time 1321475732.184817, -------------- Report Sync ------------
Event: time 1321475732.185830, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.185831, type 3 (Absolute), code 53 (Position X), value 20608
Event: time 1321475732.185857, -------------- Report Sync ------------
Event: time 1321475732.191847, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.191848, type 3 (Absolute), code 53 (Position X), value 19856
Event: time 1321475732.191879, type 3 (Absolute), code 0 (X), value 19856
Event: time 1321475732.191882, -------------- Report Sync ------------
Event: time 1321475732.192801, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.192802, type 3 (Absolute), code 53 (Position X), value 20640
Event: time 1321475732.192828, -------------- Report Sync ------------
Event: time 1321475732.198813, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.198813, type 3 (Absolute), code 53 (Position X), value 19888
Event: time 1321475732.198828, type 3 (Absolute), code 0 (X), value 19888
Event: time 1321475732.198830, -------------- Report Sync ------------
Event: time 1321475732.199795, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.199796, type 3 (Absolute), code 53 (Position X), value 20656
Event: time 1321475732.199809, -------------- Report Sync ------------
Event: time 1321475732.205853, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.205854, type 3 (Absolute), code 53 (Position X), value 19904
Event: time 1321475732.205885, type 3 (Absolute), code 0 (X), value 19904
Event: time 1321475732.205888, -------------- Report Sync ------------
Event: time 1321475732.206837, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.206838, type 3 (Absolute), code 53 (Position X), value 20672
Event: time 1321475732.206864, -------------- Report Sync ------------
Event: time 1321475732.212781, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.212782, type 3 (Absolute), code 53 (Position X), value 19920
Event: time 1321475732.212797, type 3 (Absolute), code 0 (X), value 19920
Event: time 1321475732.212798, -------------- Report Sync ------------
Event: time 1321475732.213782, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.213782, type 3 (Absolute), code 53 (Position X), value 20688
Event: time 1321475732.213796, -------------- Report Sync ------------
Event: time 1321475732.219799, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.219799, type 3 (Absolute), code 53 (Position X), value 19936
Event: time 1321475732.219815, type 3 (Absolute), code 0 (X), value 19936
Event: time 1321475732.219816, -------------- Report Sync ------------
Event: time 1321475732.220838, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.220839, type 3 (Absolute), code 53 (Position X), value 20704
Event: time 1321475732.220865, -------------- Report Sync ------------
Event: time 1321475732.233800, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.233800, type 3 (Absolute), code 53 (Position X), value 19984
Event: time 1321475732.233801, type 3 (Absolute), code 54 (Position Y), value 17936
Event: time 1321475732.233816, type 3 (Absolute), code 0 (X), value 19984
Event: time 1321475732.233816, type 3 (Absolute), code 1 (Y), value 17936
Event: time 1321475732.233817, -------------- Report Sync ------------
Event: time 1321475732.240799, type 3 (Absolute), code 53 (Position X), value 20016
Event: time 1321475732.240800, type 3 (Absolute), code 54 (Position Y), value 17952
Event: time 1321475732.240815, type 3 (Absolute), code 0 (X), value 20016
Event: time 1321475732.240816, type 3 (Absolute), code 1 (Y), value 17952
Event: time 1321475732.240817, -------------- Report Sync ------------
Event: time 1321475732.247793, type 3 (Absolute), code 53 (Position X), value 20032
Event: time 1321475732.247809, type 3 (Absolute), code 0 (X), value 20032
Event: time 1321475732.247810, -------------- Report Sync ------------
Event: time 1321475732.254799, type 3 (Absolute), code 53 (Position X), value 20048
Event: time 1321475732.254814, type 3 (Absolute), code 0 (X), value 20048
Event: time 1321475732.254815, -------------- Report Sync ------------
Event: time 1321475732.255797, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.255797, type 3 (Absolute), code 53 (Position X), value 20720
Event: time 1321475732.255798, type 3 (Absolute), code 54 (Position Y), value 9360
Event: time 1321475732.255811, -------------- Report Sync ------------
Event: time 1321475732.261798, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.261798, type 3 (Absolute), code 53 (Position X), value 20064
Event: time 1321475732.261814, type 3 (Absolute), code 0 (X), value 20064
Event: time 1321475732.261815, -------------- Report Sync ------------
Event: time 1321475732.262802, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.262802, type 3 (Absolute), code 53 (Position X), value 20784
Event: time 1321475732.262803, type 3 (Absolute), code 54 (Position Y), value 9424
Event: time 1321475732.262815, -------------- Report Sync ------------
Event: time 1321475732.269801, type 3 (Absolute), code 53 (Position X), value 20816
Event: time 1321475732.269802, type 3 (Absolute), code 54 (Position Y), value 9440
Event: time 1321475732.269815, -------------- Report Sync ------------
Event: time 1321475732.277783, type 3 (Absolute), code 53 (Position X), value 20832
Event: time 1321475732.277784, type 3 (Absolute), code 54 (Position Y), value 9456
Event: time 1321475732.277797, -------------- Report Sync ------------
Event: time 1321475732.285839, type 3 (Absolute), code 53 (Position X), value 20864
Event: time 1321475732.285840, type 3 (Absolute), code 54 (Position Y), value 9472
Event: time 1321475732.285852, -------------- Report Sync ------------
Event: time 1321475732.290780, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.290780, type 3 (Absolute), code 53 (Position X), value 20128
Event: time 1321475732.290781, type 3 (Absolute), code 54 (Position Y), value 17968
Event: time 1321475732.290796, type 3 (Absolute), code 0 (X), value 20128
Event: time 1321475732.290796, type 3 (Absolute), code 1 (Y), value 17968
Event: time 1321475732.290797, -------------- Report Sync ------------
Event: time 1321475732.297799, type 3 (Absolute), code 53 (Position X), value 20160
Event: time 1321475732.297814, type 3 (Absolute), code 0 (X), value 20160
Event: time 1321475732.297815, -------------- Report Sync ------------
Event: time 1321475732.298802, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.298803, type 3 (Absolute), code 53 (Position X), value 20944
Event: time 1321475732.298803, type 3 (Absolute), code 54 (Position Y), value 9536
Event: time 1321475732.298816, -------------- Report Sync ------------
Event: time 1321475732.304804, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.304804, type 3 (Absolute), code 53 (Position X), value 20192
Event: time 1321475732.304805, type 3 (Absolute), code 54 (Position Y), value 17984
Event: time 1321475732.304820, type 3 (Absolute), code 0 (X), value 20192
Event: time 1321475732.304820, type 3 (Absolute), code 1 (Y), value 17984
Event: time 1321475732.304821, -------------- Report Sync ------------
Event: time 1321475732.305802, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.305802, type 3 (Absolute), code 53 (Position X), value 20960
Event: time 1321475732.305803, type 3 (Absolute), code 54 (Position Y), value 9552
Event: time 1321475732.305815, -------------- Report Sync ------------
Event: time 1321475732.311799, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.311799, type 3 (Absolute), code 53 (Position X), value 20208
Event: time 1321475732.311814, type 3 (Absolute), code 0 (X), value 20208
Event: time 1321475732.311816, -------------- Report Sync ------------
Event: time 1321475732.312853, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.312854, type 3 (Absolute), code 53 (Position X), value 20976
Event: time 1321475732.312856, type 3 (Absolute), code 54 (Position Y), value 9568
Event: time 1321475732.312881, -------------- Report Sync ------------
Event: time 1321475732.318818, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.318818, type 3 (Absolute), code 53 (Position X), value 20224
Event: time 1321475732.318834, type 3 (Absolute), code 0 (X), value 20224
Event: time 1321475732.318835, -------------- Report Sync ------------
Event: time 1321475732.319802, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.319802, type 3 (Absolute), code 53 (Position X), value 20992
Event: time 1321475732.319816, -------------- Report Sync ------------
Event: time 1321475732.423792, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.423793, type 3 (Absolute), code 53 (Position X), value 20256
Event: time 1321475732.423808, type 3 (Absolute), code 0 (X), value 20256
Event: time 1321475732.423810, -------------- Report Sync ------------
Event: time 1321475732.424853, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.424854, type 3 (Absolute), code 53 (Position X), value 21024
Event: time 1321475732.424856, type 3 (Absolute), code 54 (Position Y), value 9584
Event: time 1321475732.424881, -------------- Report Sync ------------
Event: time 1321475732.431813, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.431813, type 3 (Absolute), code 53 (Position X), value 20272
Event: time 1321475732.431828, type 3 (Absolute), code 0 (X), value 20272
Event: time 1321475732.431830, -------------- Report Sync ------------
Event: time 1321475732.433834, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.433834, type 3 (Absolute), code 53 (Position X), value 21040
Event: time 1321475732.433847, -------------- Report Sync ------------
Event: time 1321475732.438799, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.438799, type 3 (Absolute), code 53 (Position X), value 20288
Event: time 1321475732.438815, type 3 (Absolute), code 0 (X), value 20288
Event: time 1321475732.438816, -------------- Report Sync ------------
Event: time 1321475732.440797, type 3 (Absolute), code 47 (Slot), value 1
Event: time 1321475732.440798, type 3 (Absolute), code 53 (Position X), value 21056
Event: time 1321475732.440811, -------------- Report Sync ------------
Event: time 1321475732.446802, type 3 (Absolute), code 53 (Position X), value 21072
Event: time 1321475732.446815, -------------- Report Sync ------------
Event: time 1321475732.452804, type 3 (Absolute), code 47 (Slot), value 0
Event: time 1321475732.452804, type 3 (Absolute), code 53 (Position X), value 20304
Event: time 1321475732.452820, type 3 (Absolute), code 0 (X), value 20304
Event: time 1321475732.452821, -------------- Report Sync --------
usr/src/linux/drivers/hid/hid-multitouch.c renamed from hid-multitouch.c-orig +112 -18
@@ -60,9 +60,19 @@bool seen_in_this_frame;/* has this slot been updated */ }; +struct mt_class { +__s32 name;/* MT_CLS */ +__s32 quirks; +__s32 sn_move;/* Signal/noise ratio for move events */ +__s32 sn_width;/* Signal/noise ratio for width events */ +__s32 sn_height;/* Signal/noise ratio for height events */ +__s32 sn_pressure;/* Signal/noise ratio for pressure events */ +__u8 maxcontacts; +}; +struct mt_device {struct mt_slot curdata;/* placeholder of incoming data */ -struct mt_class *mtclass;/* our mt device class */ +struct mt_class mtclass;/* our mt device class */ unsigned last_field_index;/* last field index of the report */ unsigned last_slot_field;/* the last field of a slot */ int last_mt_collection;/* last known mt-related collection */
@@ -74,16 +84,6 @@struct mt_slot *slots; }; -struct mt_class { -__s32 name;/* MT_CLS */ -__s32 quirks; -__s32 sn_move;/* Signal/noise ratio for move events */ -__s32 sn_width;/* Signal/noise ratio for width events */ -__s32 sn_height;/* Signal/noise ratio for height events */ -__s32 sn_pressure;/* Signal/noise ratio for pressure events */ -__u8 maxcontacts; -}; -/* classes of device behavior */ #define MT_CLS_DEFAULT 0x0001
@@ -98,6 +98,7 @@#define MT_CLS_3M 0x0101#define MT_CLS_CYPRESS 0x0102#define MT_CLS_EGALAX 0x0103 +#define MT_CLS_EGALAX_SERIAL 0x0104#define MT_DEFAULT_MAXCONTACT 10
@@ -177,10 +178,97 @@ .sn_move = 4096, .sn_pressure = 32, }, + { .name = MT_CLS_EGALAX_SERIAL, + .quirks = MT_QUIRK_SLOT_IS_CONTACTID | + MT_QUIRK_ALWAYS_VALID, + .sn_move = 4096, + .sn_pressure = 32 + }, { } }; +static ssize_t mt_show_quirks (struct device *dev, +struct device_attribute *attr, +char *buf) +{ + struct hid_device *hdev = container_of(dev, struct hid_device, dev); +struct mt_device *td =hid_get_drvdata (hdev); + +return sprintf (buf,"%u\n" , td->mtclass.quirks); +} + +static ssize_t mt_set_quirks (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count) +{ + struct hid_device *hdev = container_of(dev, struct hid_device, dev); +struct mt_device *td =hid_get_drvdata (hdev); + +unsigned long val; + +if (strict_strtoul (buf,0 , &val)) +return -EINVAL ; + + td->mtclass.quirks = val; + +return count; +} + +static DEVICE_ATTR(quirks, S_IWUSR | S_IRUGO, mt_show_quirks, mt_set_quirks); + +static ssize_t mt_show_class (struct device *dev, +struct device_attribute *attr, +char *buf) +{ + struct hid_device *hdev = container_of(dev, struct hid_device, dev); +struct mt_device *td =hid_get_drvdata (hdev); + +return sprintf (buf,"0x%x\n" , td->mtclass.name); +} + +static ssize_t mt_set_class (struct device *dev, +struct device_attribute *attr, +const char *buf,size_t count) +{ + struct hid_device *hdev = container_of(dev, struct hid_device, dev); +struct mt_device *td =hid_get_drvdata (hdev); +struct mt_class *mtclass =NULL ;/* MT_CLS_DEFAULT */ +int i; + +unsigned long val; + +if (strict_strtoul (buf,0 , &val)) +return -EINVAL ; + + +for (i =0 ; mt_classes[i].name ; i++) { +if (val == mt_classes[i].name) { + mtclass = &(mt_classes[i]); +break ; + } + } + +if (!mtclass) +return -EINVAL ; + + td->mtclass = *mtclass; + +return count; +} + +static DEVICE_ATTR(class, S_IWUSR | S_IRUGO, mt_show_class, mt_set_class); + +static struct attribute *sysfs_attrs[] = { + &dev_attr_quirks.attr, + &dev_attr_class.attr, +NULL +}; + +static struct attribute_group mt_attribute_group = { + .attrs = sysfs_attrs +}; +static void mt_feature_mapping (struct hid_device *hdev,struct hid_field *field,struct hid_usage *usage) {
@@ -192,9 +280,9 @@break ;case HID_DG_CONTACTMAX : td->maxcontacts = field->value[0 ]; -if (td->mtclass->maxcontacts) +if (td->mtclass.maxcontacts)/* check if the maxcontacts is given by the class */ - td->maxcontacts = td->mtclass->maxcontacts; + td->maxcontacts = td->mtclass.maxcontacts;break ; }
@@ -214,7 +302,7 @@ unsigned long **bit, int *max) { struct mt_device *td = hid_get_drvdata(hdev); -struct mt_class *cls = td->mtclass; +struct mt_class *cls = &td->mtclass;__s32 quirks = cls->quirks;/* Only map fields from TouchScreen or TouchPad collections.
@@ -363,7 +451,7 @@static int mt_compute_slot (struct mt_device *td) { -__s32 quirks = td->mtclass->quirks; +__s32 quirks = td->mtclass.quirks;if (quirks &MT_QUIRK_SLOT_IS_CONTACTID )return td->curdata.contactid;
@@ -407,7 +495,7 @@for (i =0 ; i < td->maxcontacts; ++i) {struct mt_slot *s = &(td->slots[i]); -if ((td->mtclass->quirks &MT_QUIRK_NOT_SEEN_MEANS_UP ) && +if ((td->mtclass.quirks &MT_QUIRK_NOT_SEEN_MEANS_UP ) && !s->seen_in_this_frame) { s->touch_state = false; }
@@ -444,7 +532,7 @@ struct hid_usage *usage, __s32 value) {struct mt_device *td =hid_get_drvdata (hid); -__s32 quirks = td->mtclass->quirks; +__s32 quirks = td->mtclass.quirks;if (hid->claimed &HID_CLAIMED_INPUT && td->slots) {switch (usage->hid) {
@@ -552,7 +640,7 @@dev_err (&hdev->dev,"cannot allocate multitouch data\n" );return -ENOMEM ; } - td->mtclass = mtclass; + td->mtclass = *mtclass; td->inputmode =-1 ; td->last_mt_collection =-1 ;hid_set_drvdata (hdev, td);
@@ -574,6 +662,8 @@ goto fail; } + ret =sysfs_create_group (&hdev->dev.kobj, &mt_attribute_group); +mt_set_input_mode (hdev);return 0 ;
@@ -594,6 +684,7 @@static void mt_remove (struct hid_device *hdev) {struct mt_device *td =hid_get_drvdata (hdev); +sysfs_remove_group (&hdev->dev.kobj, &mt_attribute_group);hid_hw_stop (hdev);kfree (td->slots);kfree (td);
@@ -662,6 +753,9 @@ { .driver_data = MT_CLS_EGALAX,HID_USB_DEVICE (USB_VENDOR_ID_DWAV , USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH4) }, + { .driver_data = MT_CLS_EGALAX_SERIAL, +HID_USB_DEVICE (USB_VENDOR_ID_DWAV , + USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH5) }, /* Elo TouchSystems IntelliTouch Plus panel */ { .driver_data = MT_CLS_DUAL_NSMU_CONTACTID,
Hi Chris,
it looks like the quirks were not taken into account. Normally, you don't need to manually add the VID:PID with the sysfs as you already registered your device in the list.
1) What is the value of the quirks sysfs attrib ? (according to your logs, it should show 1, instead of 18)
2) did you do depmod and are you sure the hid-multitouch module loaded is the one with USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH5?
to be sure, please provide the outputs of:
$ modinfo hid-multitouch $ modinfo <path to jiri-hid>/drivers/hid/hid-multitouch.ko
If you added your device through the sysfs because it was not taken by hid-multitouch, replace the last parameter by 104:
$ echo 3 0eef a001 104 > new_id But again, this is not the right way as you registered it.
Cheers,
Benjamin
Quoted 26 lines · Cedric Sodhi
Dear Benjamin,
I applied your patch tp 3.2-jikos (uname shows 3.1, though). The diff to jikos' original is now [attached].
Chris says the output of evtest still signifies problems with multitouch:
Quoted 18 lines
Quoted 1 line
Cedric, can you send these logs to Benjamin for ideas? The HID events look good but the evtest log for 2 fingers is not. The two touches are fighting each other. That "-1" value is interrupted as each finger is being lifted in between each new X/Y report.
Also, can you send me and Benjamin the source code diff of what your testing against kernel tree?
The behavior in your evtest log looks like what would happen if your setting the
MT_QUIRK_NOT_SEEN_MEANS_UP. Since your HW only sends 1 fingers worth of data per packet, you do not want that quirk.I'll still hold off on xf86-input-wacom issues until the events coming are sane. Your current events will cause xf86-input-wacom to do all kinds of weird stuff thats not worth effort to weed threw.
Quoted 8 lines
Quoted 1 line
Chris
These logs in that tarfile were created while still manually adding the ID via your sysfs interface. You find yet another evtest log for two-finger touch attached.
Cedric
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
One update on my side. I was looking at hid-multitouch.c from Dmitri's next branch and didn't see that ALWAYS_VALID. So I thought it was a typo and manually mapping your "18" value to VALID_IS_INRANGE; which we were previously setting it to. Thats why I mentioned I thought you were setting to same quirks.
Thanks for diff. Often a diff is worth a thousand words.
OK, now back to your email. I'm confused about your logs. The URL points to the tar file with multiple logs and the evtest_twofinger.log inside it is the one I was talking about having issues.
Now you've attached a new evtest_twofinger.log and its values look good. So your saying this new log is from a version based on the diff?
If so, I'll chalk it up to some debug issue and sounds like ALWAYS_VALID is indeed the key to this.
Chris
Quoted 26 lines · Cedric Sodhi
Dear Benjamin,
I applied your patch tp 3.2-jikos (uname shows 3.1, though). The diff to jikos' original is now [attached].
Chris says the output of evtest still signifies problems with multitouch:
Quoted 18 lines
Quoted 1 line
Cedric, can you send these logs to Benjamin for ideas? The HID events look good but the evtest log for 2 fingers is not. The two touches are fighting each other. That "-1" value is interrupted as each finger is being lifted in between each new X/Y report.
Also, can you send me and Benjamin the source code diff of what your testing against kernel tree?
The behavior in your evtest log looks like what would happen if your setting the
MT_QUIRK_NOT_SEEN_MEANS_UP. Since your HW only sends 1 fingers worth of data per packet, you do not want that quirk.I'll still hold off on xf86-input-wacom issues until the events coming are sane. Your current events will cause xf86-input-wacom to do all kinds of weird stuff thats not worth effort to weed threw.
Quoted 8 lines
Quoted 1 line
Chris
These logs in that tarfile were created while still manually adding the ID via your sysfs interface. You find yet another evtest log for two-finger touch attached.
Cedric
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 5 lines · Benjamin Tissoires
Hi Chris,
it looks like the quirks were not taken into account. Normally, you don't need to manually add the VID:PID with the sysfs as you already registered your device in the list.
Assuming that it was me who you were addressing: I'm aware of that. As the diff shows, I added the device to the "hardcoded" whitelist as MULTITOUCH5, using the quirks SLOT_IS_CONTACTID and ALWAYS_VALID.
Quoted 3 lines
1) What is the value of the quirks sysfs attrib ? (according to your logs, it should show 1, instead of 18)
Cat'ing quirks returns 18. Conclusion ahead: I think I must have taken those logs in the TAR file before I added the device to the whitelist and then forgot to write out the quirks to sysfs, while manually adding it.
Quoted 4 lines
2) did you do depmod and are you sure the hid-multitouch module loaded is the one with
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH5?
to be sure, please provide the outputs of:
Quoted 8 lines
$ modinfo hid-multitouch $ modinfo <path to jiri-hid>/drivers/hid/hid-multitouch.koIf you added your device through the sysfs because it was not taken by hid-multitouch, replace the last parameter by 104:
$ echo 3 0eef a001 104 > new_id But again, this is not the right way as you registered it.
Therefore, no, everything seems to work now. The device is picked up through the patch and, according to Chris, returns the correct values.
The log which I attached to my last email was the one I took after making the changes to the code. I forgot to specify that.
Cedric
Quoted 4 lines
Cheers,
Benjamin
Quoted 35 lines
Quoted 34 lines · Cedric Sodhi
Dear Benjamin,
I applied your patch tp 3.2-jikos (uname shows 3.1, though). The diff to jikos' original is now [attached].
Chris says the output of evtest still signifies problems with multitouch:
Quoted 14 lines
Quoted 1 line
Cedric, can you send these logs to Benjamin for ideas? The HID events look good but the evtest log for 2 fingers is not. The two touches are fighting each other. That "-1" value is interrupted as each finger is being lifted in between each new X/Y report.
Also, can you send me and Benjamin the source code diff of what your testing against kernel tree?
The behavior in your evtest log looks like what would happen if your setting the
MT_QUIRK_NOT_SEEN_MEANS_UP. Since your HW only sends 1 fingers worth of data per packet, you do not want that quirk.Quoted 5 lines
I'll still hold off on xf86-input-wacom issues until the events coming are sane. Your current events will cause xf86-input-wacom to do all kinds of weird stuff thats not worth effort to weed threw.
Chris
These logs in that tarfile were created while still manually adding the ID via your sysfs interface. You find yet another evtest log for two-finger touch attached.
Cedric
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 11 lines · Chris Bagwell
One update on my side. I was looking at
hid-multitouch.cfrom Dmitri's next branch and didn't see thatALWAYS_VALID. So I thought it was a typo and manually mapping your "18" value toVALID_IS_INRANGE; which we were previously setting it to. Thats why I mentioned I thought you were setting to same quirks.Thanks for diff. Often a diff is worth a thousand words.
OK, now back to your email. I'm confused about your logs. The URL points to the tar file with multiple logs and the evtest_twofinger.log inside it is the one I was talking about having issues.
Indeed. Those logs in the TAR file were created when I was still manually adding the device to sysfs (that is, before that very diff which includes changes to the whitelist). It looks like I neglected to set the quirks back then. Sorry.
Quoted 4 lines
Now you've attached a new evtest_twofinger.log and its values look good. So your saying this new log is from a version based on the diff?
Exactly.
Cedric
Quoted 38 lines
If so, I'll chalk it up to some debug issue and sounds like
ALWAYS_VALIDis indeed the key to this.Chris
Quoted 32 lines · Cedric Sodhi
Dear Benjamin,
I applied your patch tp 3.2-jikos (uname shows 3.1, though). The diff to jikos' original is now [attached].
Chris says the output of evtest still signifies problems with multitouch:
Quoted 14 lines
Quoted 1 line
Cedric, can you send these logs to Benjamin for ideas? The HID events look good but the evtest log for 2 fingers is not. The two touches are fighting each other. That "-1" value is interrupted as each finger is being lifted in between each new X/Y report.
Also, can you send me and Benjamin the source code diff of what your testing against kernel tree?
The behavior in your evtest log looks like what would happen if your setting the
MT_QUIRK_NOT_SEEN_MEANS_UP. Since your HW only sends 1 fingers worth of data per packet, you do not want that quirk.Quoted 5 lines
I'll still hold off on xf86-input-wacom issues until the events coming are sane. Your current events will cause xf86-input-wacom to do all kinds of weird stuff thats not worth effort to weed threw.
Chris
These logs in that tarfile were created while still manually adding the ID via your sysfs interface. You find yet another evtest log for two-finger touch attached.
Quoted 6 lines
Quoted 2 lines
Cedric
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to [email protected]
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html