RE: g_hid and hid-multitouch compatibility?

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

 



Hi Benjamin,

Now things seem to work a lot better thanks to your input :) I'm still on the 2.6.38 version of the multitouch code, but static registering works after adding our faked USB VIP/PID to hid.ids.c, hid-core.c and hid-multitouch.c:

Digitizers.TipSwitch ---> Key.Touch
Digitizers.InRange ---> Sync.Report
Digitizers.ContactID ---> Sync.Report
GenericDesktop.X ---> Absolute.MTPositionX
GenericDesktop.Y ---> Absolute.MTPositionY
Digitizers.TipSwitch ---> Key.Touch
Digitizers.InRange ---> Sync.Report
Digitizers.ContactID ---> Sync.Report
GenericDesktop.X ---> Absolute.MTPositionX
GenericDesktop.Y ---> Absolute.MTPositionY
Digitizers.ContactCount ---> Sync.Report
Button.0001 ---> Key.LeftBtn
Button.0002 ---> Key.RightBtn
Button.0003 ---> Key.MiddleBtn
GenericDesktop.X ---> Absolute.MTPositionX
GenericDesktop.Y ---> Absolute.MTPositionY
GenericDesktop.Wheel ---> Relative.Wheel

Running some diagnostics:
workstation$ sudo python eviocg.py /dev/input/event3
the device '/dev/input/event3' is multitouch enabled with the protocol B.

An unmodified version of mtdiag now discovers our multitouch device, but I cannot get any valid touch output in the "drawing surface" of the application. You mentioned that I could optimize things by using some of the quirk defined, but is this necessary or optional? If I'm reporting as the Windows 7 specification describes do I still need to use any of the quirks? Specially I'm wondering about the quirks that relate to contact id/contact number and slots. Do I really need to think about slots at all if I have valid ContactIDs in my reports?

Regards,
Pablo


> -----Original Message-----
> From: Benjamin Tissoires [mailto:benjamin.tissoires@xxxxxxxxx]
> Sent: den 28 maj 2011 00:42
> To: Pablo Cases
> Cc: Stéphane Chatty; Henrik Rydberg; Jiri Kosina; linux-
> input@xxxxxxxxxxxxxxx
> Subject: Re: g_hid and hid-multitouch compatibility?
> 
> Hi Pablo
> 
> On Sat, May 28, 2011 at 00:08, Pablo Cases <pablo.cases@xxxxxxxxxxxx>
> wrote:
> > Hi Benjamin,
> >
> > Thanks for the response. It is my ignorance that should be excused as
> I have shown/will show that I am the novice with regards to USB HID and
> multitouch in this forum :)
> > I´ll continue interleaving additional comments below.
> >
> > -Pablo
> >
> >> -----Original Message-----
> >> From: Benjamin Tissoires [mailto:benjamin.tissoires@xxxxxxxxx]
> >> Sent: den 27 maj 2011 18:10
> >> To: Pablo Cases
> >> Cc: Stéphane Chatty; Henrik Rydberg; Jiri Kosina; linux-
> >> input@xxxxxxxxxxxxxxx
> >> Subject: Re: g_hid and hid-multitouch compatibility?
> >>
> >> Hi Pablo,
> >>
> >> Adding Stéphane, Henrik and Jiri in CC.
> >>
> >> On Fri, May 27, 2011 at 17:33, Pablo Cases
> <pablo.cases@xxxxxxxxxxxx>
> >> wrote:
> >> >
> >> > Hi all,
> >> >
> >> > I have searched the net and the archives of linux-input for
> >> information on how to use the Linux g_hid kernel module on a device
> and
> >> the hid-multitouch kernel module on a host to communicate multitouch
> >> events. But unfortunately I can only get single touch working.
> >>
> >> Excuse my ignorance, I didn't know g_hid existed before your mail.
> If
> >> I understand it well enough, it's an hid emulation from user-space.
> >> Are you trying to inject events from a device in user-space to the
> >> kernel? If so, I think it would be easier to use uinput. And the
> funny
> >> think was that I'm currently writing a small lib to inject mulitouch
> >> events in a uinput device in an easier way.
> >>
> >
> > Maybe I misunderstand your explanation above but we´re not running
> g_hid and hid-multitouch on the same system. We have a separate
> hardware USB device running Linux with the g_hid kernel module loaded.
> On this device we then have (thanks to g_hid) a userspace file called
> /dev/hidg0 that we can write USB HID input reports to, which then will
> be sent through the device's gadget usb framework, through an physical
> USB cable, to a separate PC host running hid-multitouch.
> 
> Thanks for the explaination. I didn't knew that it was possible to do
> such things. Linux is really a wonderful world ;-)
> 
> >
> >> >
> >> > Q: Has anyone successfully completed a g_hid <-> hid-multitouch
> >> setup? And is there a description somewhere of such setup?
> >>
> >> I don't think so, hid-multitouch is really new (since 2.6.38, and
> was
> >> not very generic at this time).
> >>
> >> > Q: Is the Windows 7 multitouch USB HID descriptor the correct one
> to
> >> use also for Linux hid-multitouch? Or is some tweaking necessary?
> >>
> >> Normally, any valid Windows 7 multitouch USB HID descriptor can be
> >> handled by hid-multitouch.
> >> But it's more the events that are sent to hid-multitouch that will
> >> tell if your device is compatible or not.
> >>
> >> >
> >> > DETAILED DESCRIPTION BELOW
> >> > The device is a Linux device that uses g_hid (currently 2.6.37
> >> kernel) and a USB HID Report Descriptor for multitouch using two-
> touch
> >> parallel mode according to Microsoft document
> >> http://msdn.microsoft.com/en-us/windows/hardware/gg487437.
> >> >
> >> > On the host (ubuntu 11.04, 2.6.38 kernel) I register dynamically
> >> according to the description at http://lii-
> >> enac.fr/en/architecture/linux-input/multitouch-ubuntu-howto.html.
> Using
> >> the events/rdesc files in debugfs on Ubuntu 11.04 I have validated
> the
> >> parsing of the report descriptor and the input reports.
> >>
> >> This is really a bad idea to use these howto with ubuntu 11.04 ATM.
> I
> >> didn't found the time to update this stuff, and this branch can not
> be
> >> used in ubuntu 11.04 (it contains code for 2.6.35 only, and there
> were
> >> changes in the hid layer after). If you only used the part "How to
> add
> >> your device to hid-multitouch from the user space" without updating
> >> your hid module, then it's as if you have'nt done anything (the
> >> generic hid module can not autodetect multitouch devices).
> >
> > Currently I am using the hid-multitouch code as existing in the
> source distribution of a 2.6.38 Ubuntu 11.04 fetched through apt-get.
> In the page referred to above I have only used the "How to add your
> device to hid-multitouch from the user space", and not the 2.6.35
> related parts.
> 
> So there are no autodetection in your kernel.
> 
> >
> > Ok, so for autodetection of multitouch devices to work I need to
> update the hid-multitouch module to a newer version (than was available
> in 2.6.38), preferably head on a git master branch somewhere? Another
> option is to add a static configuration field in hid-multitouch and
> hid-ids.h for my USB device's VID/PID. But then again, maybe it's
> better to do that on the latest available code as well?
> 
> Autodetection is not available upstream too, sorry. The latest
> available code is on Jiri's tree. I'll try to maintain a bunch of
> patches to backport the work done on hid-multitouch since 2.6.35 on
> http://lii-enac.fr/en/architecture/linux-input/multitouch-
> howto.html#hid-multitouch
> but I'm a little late for the backports right now.
> 
> Jiri's tree is at
> http://git.kernel.org/?p=linux/kernel/git/jikos/hid.git;a=summary
> 
> >
> >> >
> >> > Example multitouch input report from
> >> /sys/kernel/debug/hid/0003:xxxx:yyyy.0002/events looks correct:
> >> > report (size 14) (numbered) =  05 03 00 a5 12 32 0e 03 01 99 14 32
> 0e
> >> 02
> >> > Digitizers.TipSwitch = 1
> >> > Digitizers.InRange = 1
> >> > Digitizers.ContactID = 0
> >> > GenericDesktop.X = 4773
> >> > GenericDesktop.Y = 3634
> >> > Digitizers.TipSwitch = 1
> >> > Digitizers.InRange = 1
> >> > Digitizers.ContactID = 1
> >> > GenericDesktop.X = 5273
> >> > GenericDesktop.Y = 3634
> >> > Digitizers.ContactCount = 2
> >> >
> >>
> >> Most of the time, the problematic part comes from the releases. But
> >> it's a good start.
> >
> > With "releases" I assume you mean the finger removal from the touch
> surface, like a "touch-up" event? I have not implemented that part yet,
> but our Microsoft contact informed us that for Windows 7 compatibility
> it should be reported as a final touch report with
> > TipSwitch = 0
> > InRange = 1
> > Is this applicable to hid-multitouch too?
> 
> Exactly, I meant touch-up. Your behavior is applicable to hid-
> multitouch.
> 
> Once registering your device with hid-multitouch, you can choose a
> class that controls how optimized your driver will be. Normally, the
> MT_CLS_DEFAULT class will work with any Win 7 compliant device
> (crossing fingers).
> 
> Then, you can optimize it by looking for the classes that have
> MT_QUIRK_VALID_IS_INRANGE (or adding a new one). In the same time, you
> can also optimize the way your device actually does the match between
> slots (from 0 to N-1 with N the maximum contact count of your device)
> and the tracking_id reported by the device (or the position in the hid
> report).
> For dual touches only devices, the differences are not big, but we
> prefer to optimize things all the time ;-)
> 
> >
> >> > The first touch in the report is correctly presented both on
> Windows
> >> and on Ubuntu 11.04 (using ENAC's mtdiag tool with a minor tweak to
> >> display data from all devices not just multitouch ones). I can see
> in
> >> the debugfs files that the data for the second touch data is
> correctly
> >> transferred and interpreted (see above), but the mapping to the
> linux
> >> input system seems a bit strange though (see below). My guess is
> that I
> >> have not been correctly registered as a multitouch device. I'm
> assuming
> >> this also because I cannot see any activity from the hid-multitouch
> >> module other than it being initialized when I connect my device
> >> (probably another reason for the needed tweak in mtdiag above).
> >> >
> >> > Example mapping from
> /sys/kernel/debug/hid/0003:xxxx:yyyy.0002/rdesc
> >> that does not look entirely correct for the second touch:
> >> > Digitizers.TipSwitch ---> Key.Touch
> >> > Digitizers.InRange ---> Key.ToolPen
> >> > Digitizers.ContactID ---> Absolute.Misc
> >> > GenericDesktop.X ---> Absolute.X
> >> > GenericDesktop.Y ---> Absolute.Y
> >> > Digitizers.TipSwitch ---> Key.Touch
> >> > Digitizers.InRange ---> Key.ToolRubber
> >> > Digitizers.ContactID ---> Absolute.?
> >> > GenericDesktop.X ---> Absolute.Z
> >> > GenericDesktop.Y ---> Absolute.Rx
> >>
> >> This means that your device is handled by the generic usbhid and not
> >> hid-multitouch.
> >
> > That is what troubles me. I can see in the host's dmesg that
> "generic-usb" seems to be the driver chosen for my device when it is
> connected to the host. And according to your comment above I might not
> have correctly registered my device in hid-multitouch which would be
> the source of the problem...
> >
> > As a side note; I have sprinkled printk() here and there hid-
> multitouch.c and hid-core.c. While running the code I can only see that
> mt_init() and mt_exit() are called during module loading/unloading;
> never do I see any evidence of that the probing or mapping functions in
> hid-multitouch are used, only the generic usb parts are used for
> parsing the report descriptors and input reports.
> 
> Yep, hid-multitouch does not handle your device. There is currently no
> user-space way to tell usbhid (the generic) not to handle a device.
> You'll have to add your VID-PID to the hid_have_special_driver list
> (in hid-core.c) to disable generic usb hid handling for your device.
> You can check the latest patches adding a specific device to
> hid-multitouch to have some examples.
> 
> >
> > Could you point me to the location in the code where the decision is
> taken to use the hid-multitouch driver for a hid-multitouch supported
> device? I'm guessing it is somewhere in hid-core.c but I have not been
> able to pinpoint the location exactly. I could use this location as a
> start point to backtrace why we're not considered as a hid-multitouch
> supported device.
> 
> it's just above ;-) hid_have_special_driver in hid-core.c
> 
> Cheers,
> Benjamin
> 
> >
> >> If you are trying to inject events from the user space, I strongly
> >> recommend to use uinput instead. Let me know if you want to have my
> >> little uinput-multitouch lib.
> >>
> >> Cheers,
> >> Benjamin
> >>
> >> > Digitizers.ContactCount ---> Absolute.?
> >> > Button.0001 ---> Key.LeftBtn
> >> > Button.0002 ---> Key.RightBtn
> >> > Button.0003 ---> Key.MiddleBtn
> >> > GenericDesktop.X ---> Relative.X
> >> > GenericDesktop.Y ---> Relative.Y
> >> > GenericDesktop.Wheel ---> Relative.Wheel
> >> >
> >> >
> >> > Regards,
> >> > Pablo Cases
> >> >
> >> > -------------------------
> >> > Pablo Cases, M.Sc.
> >> > Development Engineer Software
> >> > FlatFrog Laboratories AB
> >> > Magistratsvägen 10
> >> > 22643 Lund
> >> > Sweden
> >> > Tel: +46 708 393816
> >> > Mail: pc@xxxxxxxxxxxx
> >> > Web: www.flatfrog.com
> >> > --
> >> > 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