public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* usbhid: HP LD4200tm touchscreen ALMOST works
@ 2010-10-25 23:48 William Sherman
  2010-11-01 21:14 ` Dmitry Torokhov
  0 siblings, 1 reply; 4+ messages in thread
From: William Sherman @ 2010-10-25 23:48 UTC (permalink / raw)
  To: linux-kernel; +Cc: William Sherman

Hello,

I'm looking to dig into the usbhid driver code to get me the last
mile and get my HP LD4200tm touchscreen working on my Linux system.
[NOTE: I posted about this elsewhere, but as I think about it more,
this is more of a linux-kernel issue than anything else, so I'm
reprising that note here.]

So, in first connecting the HP touchscreen (with touchscreen hardware
from Nexio) to the Linux system (running Ubuntu 10.10 -- 2.6.35-22 generic)
things were looking up, as the unit almost worked right out of the box
as a plug-and-play device.  Unfortunately, that last mile needs to be
addressed in order for the unit to work in a useful way.  I think I've
narrowed down the problem to the usbhid driver, as I'll explain in a
moment, and while I expect I have the ability to debug and fix the issue,
this would be my first dive into Linux driver coding, so I could probably
use a pointer as to what steps are necessary to get the proper kernel
sources, compile the needed parts and restart the system (hopefully
just restart X-windows) to test my edits (especially since Ubuntu tends
to not include a not of the necessary components).

I've collected gobs of data on what udev, hidraw, evtest and X-windows
report, but before I get to any of that, here's the executive summary:

Plugging the HP LD4200tm into a Ubuntu 10.10 system will cause the
device to be recognized, create a usbhid device, create an event device,
activate the evdev driver for Xorg, and put it on the list of X's inputs.
So far, so good.

Touching the device causes the mouse pointer to jump to that location,
even better.

But when I'm touching the screen, what happens is that the system
generates a continuous stream of button presses/releases -- as if
I moved the mouse to a particular location and then went crazy
tapping on the mouse button.  This is the part that makes the system
unusable.

One more data point is that if I touch the screen with a second
finger, the button barrage stops, and it will now gracefully report
the movement of the first finger.

So all I need to do is modify the driver for this device's protocol
to not send all the unnecessary release/press events.


Here is the data that leads me to believe the issue is at the usbhid
layer:


1) Running "evtest /dev/input/event4" reveals that the button barrage
is already occurring at the HID event layer.

2) Watching the raw data on /dev/usb/hiddev2 does report a stream of
data as the touchscreen is touched (and no data when it's not touched),
looking at the output suggests that the device is only reporting touch/
release events when the screen is actually touched or released.  And of
course, even if the device were reporting things poorly, I figure the
usbhid driver could be written to overcome this.

Fortunately, the data seems to be a constant 14-byte stride, so I
wrote a simple awk script ("nexio") to reformat the data as I was
figuring out the raw protocol.  Here's a sample of the reformatted
data, followed by my estimation of the protocol:
         % sudo xxd -c 14 -g 1 /dev/hidraw2 | nexio
         0000000: 01 03 01 12d8 3357  02 02 15e1 1f71  01
         000000e: 01 03 01 12cc 332a  02 02 15e1 1f71  01
         000001c: 01 03 01 12de 3335  00 02 15e1 1f71  01
         000002a: 01 03 01 12f4 3346  00 02 15e1 1f71  01
         0000038: 01 03 01 1304 3352  00 02 15e1 1f71  01
         0000046: 01 03 01 130c 3358  00 02 15e1 1f71  01
         [... (next I stop touching the screen, and then touch it again)]
         00009a0: 01 03 01 12d8 3357  00 02 15e1 1f71  01
         00009ae: 01 03 01 12d8 3357  00 02 15e1 1f71  01
         00009bc: 01 02 01 12d8 3357  00 02 15e1 1f71  01
         00009ca: 01 03 01 10af 3681  02 02 15e1 1f71  01
         00009d8: 01 03 01 10a5 3651  02 02 15e1 1f71  01
         00009e6: 01 03 01 10b7 3654  00 02 15e1 1f71  01
         [... (next is a multi-touch event)]
         0000c78: 01 03 01 1019 3627  00 02 15e1 1f71  01
         0000c86: 01 03 01 1019 3627  00 02 15e1 1f71  01
         0000c94: 01 00 01 100b 35f8  00 02 1585 3110  00
         0000ca2: 01 00 01 100e 3604  00 02 158a 311b  00
         0000cb0: 01 00 01 1013 3615  00 02 1591 312b  00
         0000cbe: 01 00 01 1017 3622  00 02 1596 3136  00
         0000ccc: 01 00 01 1019 3628  00 02 1598 313c  00
         0000cda: 01 00 01 1019 3629  00 02 1599 313d  00
         0000ce8: 01 03 01 1019 3629  03 02 1598 313d  02
         0000cf6: 01 03 01 1019 3628  03 02 1598 313c  02
         0000d04: 01 03 01 1019 3627  03 02 1598 313b  02
         0000d12: 01 03 01 1018 3627  03 02 1597 313a  02
         [... (next I release both fingers -- not quite simultaneously)]
         0000df2: 01 03 01 1019 3627  03 02 1598 3132  02
         0000e00: 01 03 01 1019 3627  03 02 1598 3132  02
         0000e0e: 01 03 01 1019 3627  02 02 1598 3132  01
         0000e1c: 01 03 01 1019 3626  02 02 1598 3132  01
         0000e2a: 01 03 01 1019 3626  00 02 1598 3132  01
         0000e38: 01 03 01 1019 3626  00 02 1598 3132  01
         0000e46: 01 03 01 1019 3626  00 02 1598 3132  01
         0000e54: 01 03 01 1019 3626  00 02 1598 3132  01
         0000e62: 01 03 01 1019 3625  00 02 1598 3132  01
         0000e70: 01 02 01 1019 3625  00 02 1598 3132  01

Decoding the above:
- column 1: just a reprint of the xxd byte count
- column 2: always 01 -- probably a data packet sync byte
- column 3: usually 03 (which means an on-going touch event)
		- 02 seems to indicate a touch-release event
		- 00 seems to indicate a transition to a dual-touch event
- column 4: always 01 -- probably an indicator that the next two
		words are the X/Y values for touch #1
- column 5: value of X location of touch #1
- column 6: value of Y location of touch #1
- column 7: usually 00
		- 02 seems to mean initiation of a single-touch event
		- 03 seems to indicate an on-going dual-touch event
- column 8: always 02 -- probably an indicator that the next two
		words are the X/Y values for touch #2
- column 9: value of X location of touch #2
- column 10:value of Y location of touch #2
- column 11: usually 01 or 02 representing the number of contact points
		- will be 00 when transitioning from single to dual
		  contact touch event

The rest of this email is a sample of some of the data that I've
collected about what the system reports.  I think this should be
sufficient to get across all necessary information, but I have
more if warrented.

         % xinput list --short 10
         Nexio Touch Device.   HID Multi-Touch           id=10   [slave 
  pointer  (2)]
         % xinput test 10
         motion a[0]=15177 a[1]=5581 a[2]=15479 a[3]=7829 a[4]=0 a[5]=0
         motion a[6]=0 a[7]=0 a[8]=0 a[9]=0 a[10]=0
         button press   1
         button release 1
         button press   1
         button release 1
         button press   1
         button release 1
         button press   1
         button release 1
         button press   1
         button release 1
         button press   1
         button release 1
         [...]

So you can see that at first contact the location of the touch is reported,
but then there is the continual stream of button press/release.

Here is the output from "evtest" from a single finger interaction:
     % sudo evtest /dev/input/event4
     Input driver version is 1.0.1
     Input device ID: bus 0x3 vendor 0x1870 product 0x100 version 0x111
     Input device name: "Nexio Touch Device.   HID Multi-Touch"
     Supported events:
       Event type 0 (Sync)
       Event type 1 (Key)
         Event code 272 (LeftBtn)
         Event code 273 (RightBtn)
         Event code 274 (MiddleBtn)
         Event code 320 (ToolPen)
         Event code 321 (ToolRubber)
         Event code 322 (ToolBrush)
         Event code 330 (Touch)
       Event type 3 (Absolute)
         Event code 0 (X)
           Value  15129
           Min        0
           Max    16383
         Event code 1 (Y)
           Value   6425
           Min        0
           Max    16383
         Event code 2 (Z)
           Value  14859
           Min        0
           Max    16383
         Event code 3 (Rx)
           Value   7160
           Min        0
           Max    16383
         Event code 4 (Ry)
           Value      0
           Min        0
           Max    32767
         Event code 5 (Rz)
           Value      0
           Min        0
           Max    32767
         Event code 6 (Throttle)
           Value      0
           Min        0
           Max    16383
         Event code 7 (Rudder)
           Value      0
           Min        0
           Max    16383
         Event code 40 (Misc)
           Value      1
           Min        0
           Max        1
         Event code 41 (?)
           Value      2
           Min        0
           Max        1
         Event code 42 (?)
           Value      1
           Min        0
           Max        2
       Event type 4 (Misc)
         Event code 4 (ScanCode)
     Testing ... (interrupt to exit)
     Event: time 1287784276.760109, type 4 (Misc), code 4 (ScanCode), 
value d0042
     Event: time 1287784276.760112, type 1 (Key), code 330 (Touch), value 1
     Event: time 1287784276.760119, type 3 (Absolute), code 0 (X), value 
14976
     Event: time 1287784276.760122, type 3 (Absolute), code 1 (Y), value 
7291
     Event: time 1287784276.760125, type 4 (Misc), code 4 (ScanCode), 
value d0042
     Event: time 1287784276.760127, type 1 (Key), code 330 (Touch), value 0
     Event: time 1287784276.760130, type 1 (Key), code 321 (ToolRubber), 
value 1
     Event: time 1287784276.760139, -------------- Report Sync ------------
     Event: time 1287784276.773107, type 4 (Misc), code 4 (ScanCode), 
value d0042
     Event: time 1287784276.773111, type 1 (Key), code 330 (Touch), value 1
     Event: time 1287784276.773117, type 3 (Absolute), code 0 (X), value 
14925
     Event: time 1287784276.773120, type 3 (Absolute), code 1 (Y), value 
7266
     Event: time 1287784276.773123, type 4 (Misc), code 4 (ScanCode), 
value d0042
     Event: time 1287784276.773124, type 1 (Key), code 330 (Touch), value 0
     Event: time 1287784276.773135, -------------- Report Sync ------------
     Event: time 1287784276.785094, type 4 (Misc), code 4 (ScanCode), 
value d0042
     Event: time 1287784276.785099, type 1 (Key), code 330 (Touch), value 1
     Event: time 1287784276.785105, type 3 (Absolute), code 0 (X), value 
14937
     Event: time 1287784276.785108, type 3 (Absolute), code 1 (Y), value 
7269
     Event: time 1287784276.785112, type 4 (Misc), code 4 (ScanCode), 
value d0042
     Event: time 1287784276.785113, type 1 (Key), code 330 (Touch), value 0
     Event: time 1287784276.785116, type 1 (Key), code 321 (ToolRubber), 
value 0
     Event: time 1287784276.785125, -------------- Report Sync ------------
     ^C

And here is the output of "evtest" from when I touched the screen with
two fingers:
     % sudo evtest /dev/input/event4
     Input driver version is 1.0.1
     Input device ID: bus 0x3 vendor 0x1870 product 0x100 version 0x111
     Input device name: "Nexio Touch Device.   HID Multi-Touch"
     Supported events:
       Event type 0 (Sync)
       Event type 1 (Key)
         Event code 272 (LeftBtn)
         Event code 273 (RightBtn)
         Event code 274 (MiddleBtn)
         Event code 320 (ToolPen)
         Event code 321 (ToolRubber)
         Event code 322 (ToolBrush)
         Event code 330 (Touch)
       Event type 3 (Absolute)
         Event code 0 (X)
           Value  14937
           Min        0
           Max    16383
         Event code 1 (Y)
           Value   7269
           Min        0
           Max    16383
         Event code 2 (Z)
           Value  14859
           Min        0
           Max    16383
         Event code 3 (Rx)
           Value   7160
           Min        0
           Max    16383
         Event code 4 (Ry)
           Value      0
           Min        0
           Max    32767
         Event code 5 (Rz)
           Value      0
           Min        0
           Max    32767
         Event code 6 (Throttle)
           Value      0
           Min        0
           Max    16383
         Event code 7 (Rudder)
           Value      0
           Min        0
           Max    16383
         Event code 40 (Misc)
           Value      1
           Min        0
           Max        1
         Event code 41 (?)
           Value      2
           Min        0
           Max        1
         Event code 42 (?)
           Value      1
           Min        0
           Max        2
       Event type 4 (Misc)
         Event code 4 (ScanCode)
     Testing ... (interrupt to exit)
     Event: time 1287784360.966997, type 1 (Key), code 320 (ToolPen), 
value 0
     Event: time 1287784360.967004, type 3 (Absolute), code 0 (X), value 
14717
     Event: time 1287784360.967006, type 3 (Absolute), code 1 (Y), value 
6211
     Event: time 1287784360.967014, type 3 (Absolute), code 2 (Z), value 
15680
     Event: time 1287784360.967016, type 3 (Absolute), code 3 (Rx), 
value 6211
     Event: time 1287784360.967019, type 3 (Absolute), code 42 (?), value 0
     Event: time 1287784360.967020, -------------- Report Sync ------------
     Event: time 1287784360.979997, type 3 (Absolute), code 0 (X), value 
14667
     Event: time 1287784360.980001, type 3 (Absolute), code 1 (Y), value 
6189
     Event: time 1287784360.980008, type 3 (Absolute), code 2 (Z), value 
15626
     Event: time 1287784360.980011, type 3 (Absolute), code 3 (Rx), 
value 6189
     Event: time 1287784360.980014, -------------- Report Sync ------------
     Event: time 1287784360.992997, type 3 (Absolute), code 0 (X), value 
14684
     Event: time 1287784360.993000, type 3 (Absolute), code 1 (Y), value 
6195
     Event: time 1287784360.993008, type 3 (Absolute), code 2 (Z), value 
15640
     Event: time 1287784360.993011, type 3 (Absolute), code 3 (Rx), 
value 6195
     Event: time 1287784360.993014, -------------- Report Sync ------------
     Event: time 1287784361.005998, type 3 (Absolute), code 0 (X), value 
14715
     Event: time 1287784361.006001, type 3 (Absolute), code 1 (Y), value 
6220
     Event: time 1287784361.006008, type 3 (Absolute), code 2 (Z), value 
15660
     Event: time 1287784361.006011, type 3 (Absolute), code 3 (Rx), 
value 6220
     Event: time 1287784361.006014, -------------- Report Sync ------------
     Event: time 1287784361.018000, type 3 (Absolute), code 0 (X), value 
14745
     Event: time 1287784361.018004, type 3 (Absolute), code 1 (Y), value 
6278
     Event: time 1287784361.018012, type 3 (Absolute), code 2 (Z), value 
15674
     Event: time 1287784361.018014, type 3 (Absolute), code 3 (Rx), 
value 6278
     Event: time 1287784361.018017, -------------- Report Sync ------------
     Event: time 1287784361.030997, type 3 (Absolute), code 0 (X), value 
14767
     Event: time 1287784361.031000, type 3 (Absolute), code 1 (Y), value 
6358
     Event: time 1287784361.031008, type 3 (Absolute), code 2 (Z), value 
15680
     Event: time 1287784361.031010, type 3 (Absolute), code 3 (Rx), 
value 6358
     Event: time 1287784361.031013, -------------- Report Sync ------------
     Event: time 1287784361.043996, type 4 (Misc), code 4 (ScanCode), 
value d0042
     Event: time 1287784361.043999, type 1 (Key), code 330 (Touch), value 1
     Event: time 1287784361.044001, type 1 (Key), code 320 (ToolPen), 
value 1
     Event: time 1287784361.044006, type 3 (Absolute), code 0 (X), value 
14777
     Event: time 1287784361.044008, type 3 (Absolute), code 1 (Y), value 
6451
     Event: time 1287784361.044012, type 1 (Key), code 321 (ToolRubber), 
value 1
     Event: time 1287784361.044016, type 3 (Absolute), code 2 (Z), value 
15682
     Event: time 1287784361.044019, type 3 (Absolute), code 3 (Rx), 
value 6451
     Event: time 1287784361.044021, type 3 (Absolute), code 42 (?), value 2
     Event: time 1287784361.044023, -------------- Report Sync ------------
     Event: time 1287784361.057000, type 3 (Absolute), code 0 (X), value 
14779
     Event: time 1287784361.057004, type 3 (Absolute), code 1 (Y), value 
6546
     Event: time 1287784361.057012, type 3 (Absolute), code 3 (Rx), 
value 6546
     Event: time 1287784361.057016, -------------- Report Sync ------------
     Event: time 1287784361.069998, type 3 (Absolute), code 0 (X), value 
14778
     Event: time 1287784361.070001, type 3 (Absolute), code 1 (Y), value 
6640
     Event: time 1287784361.070009, type 3 (Absolute), code 2 (Z), value 
15681
     Event: time 1287784361.070011, type 3 (Absolute), code 3 (Rx), 
value 6640
     Event: time 1287784361.070014, -------------- Report Sync ------------
     Event: time 1287784361.081989, type 3 (Absolute), code 0 (X), value 
14776
     Event: time 1287784361.081992, type 3 (Absolute), code 1 (Y), value 
6733
     Event: time 1287784361.082000, type 3 (Absolute), code 2 (Z), value 
15680
     Event: time 1287784361.082002, type 3 (Absolute), code 3 (Rx), 
value 6733
     Event: time 1287784361.082005, -------------- Report Sync ------------
     Event: time 1287784361.094987, type 3 (Absolute), code 0 (X), value 
14775
     Event: time 1287784361.094990, type 3 (Absolute), code 1 (Y), value 
6832
     Event: time 1287784361.094998, type 3 (Absolute), code 2 (Z), value 
15679
     Event: time 1287784361.095000, type 3 (Absolute), code 3 (Rx), 
value 6832
     Event: time 1287784361.095004, -------------- Report Sync ------------
     Event: time 1287784361.107986, type 3 (Absolute), code 0 (X), value 
14774
     Event: time 1287784361.107990, type 3 (Absolute), code 1 (Y), value 
6939
     Event: time 1287784361.107999, type 3 (Absolute), code 3 (Rx), 
value 6939
     Event: time 1287784361.108002, -------------- Report Sync ------------
     Event: time 1287784361.121001, type 3 (Absolute), code 1 (Y), value 
7042
     Event: time 1287784361.121011, type 3 (Absolute), code 3 (Rx), 
value 7042
     Event: time 1287784361.121014, -------------- Report Sync ------------
     Event: time 1287784361.132987, type 3 (Absolute), code 0 (X), value 
14779
     Event: time 1287784361.132991, type 3 (Absolute), code 1 (Y), value 
7138
     Event: time 1287784361.132999, type 3 (Absolute), code 3 (Rx), 
value 7138
     Event: time 1287784361.133003, -------------- Report Sync ------------
     Event: time 1287784361.145998, type 3 (Absolute), code 0 (X), value 
14794
     Event: time 1287784361.146001, type 3 (Absolute), code 1 (Y), value 
7221
     Event: time 1287784361.146010, type 3 (Absolute), code 3 (Rx), 
value 7221
     Event: time 1287784361.146014, -------------- Report Sync ------------
     Event: time 1287784361.158999, type 3 (Absolute), code 0 (X), value 
14815
     Event: time 1287784361.159003, type 3 (Absolute), code 1 (Y), value 
7284
     Event: time 1287784361.159010, type 3 (Absolute), code 2 (Z), value 
15684
     Event: time 1287784361.159012, type 3 (Absolute), code 3 (Rx), 
value 7284
     Event: time 1287784361.159016, -------------- Report Sync ------------
     Event: time 1287784361.183994, type 4 (Misc), code 4 (ScanCode), 
value d0042
     Event: time 1287784361.183996, type 1 (Key), code 330 (Touch), value 0
     Event: time 1287784361.184014, -------------- Report Sync ------------
     ^C

So you can see that the location of both fingers is reported for the
multi-touch operation (with one finger reported as X & Y, and the
second finger as Z & Rx).  But with one finger, it's a bunch of button
presses and then nearly instantaneous releases.


And one final bit of information.  Here is the relevant information from
the udev.log:
     -----------------------------
     UDEV  [1287664208.316717] add 
/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input4/event4 
(input)
     UDEV_LOG=3
     ACTION=add
 
DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input4/event4
     SUBSYSTEM=input
     DEVNAME=/dev/input/event4
     SEQNUM=1272
     ID_INPUT=1
     ID_INPUT_TABLET=1
     ID_VENDOR=Nexio_Touch_Device.
     ID_VENDOR_ENC=Nexio\x20Touch\x20Device.\x20\x20
     ID_VENDOR_ID=1870
     ID_MODEL=HID_Multi-Touch
     ID_MODEL_ENC=HID\x20Multi-Touch
     ID_MODEL_ID=0100
     ID_REVISION=0006
     ID_SERIAL=Nexio_Touch_Device._HID_Multi-Touch
     ID_TYPE=hid
     ID_BUS=usb
     ID_USB_INTERFACES=:030000:
     ID_USB_INTERFACE_NUM=00
     ID_USB_DRIVER=usbhid
     ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
     MAJOR=13
     MINOR=68
     DEVLINKS=/dev/char/13:68 
/dev/input/by-id/usb-Nexio_Touch_Device._HID_Multi-Touch-event-mouse 
/dev/input/by-path/pci-0000:00:1d.2-usb-0:2:1.0-event-mouse

     UDEV  [1287664208.316759] add 
/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input4/mouse1 
(input)
     UDEV_LOG=3
     ACTION=add
 
DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input4/mouse1
     SUBSYSTEM=input
     DEVNAME=/dev/input/mouse1
     SEQNUM=1273
     ID_INPUT=1
     ID_INPUT_TABLET=1
     ID_VENDOR=Nexio_Touch_Device.
     ID_VENDOR_ENC=Nexio\x20Touch\x20Device.\x20\x20
     ID_VENDOR_ID=1870
     ID_MODEL=HID_Multi-Touch
     ID_MODEL_ENC=HID\x20Multi-Touch
     ID_MODEL_ID=0100
     ID_REVISION=0006
     ID_SERIAL=Nexio_Touch_Device._HID_Multi-Touch
     ID_TYPE=hid
     ID_BUS=usb
     ID_USB_INTERFACES=:030000:
     ID_USB_INTERFACE_NUM=00
     ID_USB_DRIVER=usbhid
     ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
     MAJOR=13
     MINOR=33
     DEVLINKS=/dev/char/13:33 
/dev/input/by-id/usb-Nexio_Touch_Device._HID_Multi-Touch-mouse 
/dev/input/by-path/pci-0000:00:1d.2-usb-0:2:1.0-mouse
     -----------------------------

And if that isn't enough info, I'm happy to provide more.


     Thanks for whatever suggestions you can provide,
     Bill

-- 
Bill Sherman
Sr. Technology Advisor
Advanced Visualization Lab
Pervasive Technology Inst
Indiana University
shermanw@indiana.edu

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: usbhid: HP LD4200tm touchscreen ALMOST works
  2010-10-25 23:48 usbhid: HP LD4200tm touchscreen ALMOST works William Sherman
@ 2010-11-01 21:14 ` Dmitry Torokhov
  2010-11-01 21:22   ` Jiri Kosina
  0 siblings, 1 reply; 4+ messages in thread
From: Dmitry Torokhov @ 2010-11-01 21:14 UTC (permalink / raw)
  To: William Sherman; +Cc: linux-kernel, Linux Input, Jiri Kosina

On Mon, Oct 25, 2010 at 07:48:01PM -0400, William Sherman wrote:
> Hello,
> 
> I'm looking to dig into the usbhid driver code to get me the last
> mile and get my HP LD4200tm touchscreen working on my Linux system.
> [NOTE: I posted about this elsewhere, but as I think about it more,
> this is more of a linux-kernel issue than anything else, so I'm
> reprising that note here.]
> 

I think you'll have better luck on linux-input...

> So, in first connecting the HP touchscreen (with touchscreen hardware
> from Nexio) to the Linux system (running Ubuntu 10.10 -- 2.6.35-22 generic)
> things were looking up, as the unit almost worked right out of the box
> as a plug-and-play device.  Unfortunately, that last mile needs to be
> addressed in order for the unit to work in a useful way.  I think I've
> narrowed down the problem to the usbhid driver, as I'll explain in a
> moment, and while I expect I have the ability to debug and fix the issue,
> this would be my first dive into Linux driver coding, so I could probably
> use a pointer as to what steps are necessary to get the proper kernel
> sources, compile the needed parts and restart the system (hopefully
> just restart X-windows) to test my edits (especially since Ubuntu tends
> to not include a not of the necessary components).
> 
> I've collected gobs of data on what udev, hidraw, evtest and X-windows
> report, but before I get to any of that, here's the executive summary:
> 
> Plugging the HP LD4200tm into a Ubuntu 10.10 system will cause the
> device to be recognized, create a usbhid device, create an event device,
> activate the evdev driver for Xorg, and put it on the list of X's inputs.
> So far, so good.
> 
> Touching the device causes the mouse pointer to jump to that location,
> even better.
> 
> But when I'm touching the screen, what happens is that the system
> generates a continuous stream of button presses/releases -- as if
> I moved the mouse to a particular location and then went crazy
> tapping on the mouse button.  This is the part that makes the system
> unusable.
> 
> One more data point is that if I touch the screen with a second
> finger, the button barrage stops, and it will now gracefully report
> the movement of the first finger.
> 
> So all I need to do is modify the driver for this device's protocol
> to not send all the unnecessary release/press events.
> 
> 
> Here is the data that leads me to believe the issue is at the usbhid
> layer:
> 
> 
> 1) Running "evtest /dev/input/event4" reveals that the button barrage
> is already occurring at the HID event layer.
> 
> 2) Watching the raw data on /dev/usb/hiddev2 does report a stream of
> data as the touchscreen is touched (and no data when it's not touched),
> looking at the output suggests that the device is only reporting touch/
> release events when the screen is actually touched or released.  And of
> course, even if the device were reporting things poorly, I figure the
> usbhid driver could be written to overcome this.
> 
> Fortunately, the data seems to be a constant 14-byte stride, so I
> wrote a simple awk script ("nexio") to reformat the data as I was
> figuring out the raw protocol.  Here's a sample of the reformatted
> data, followed by my estimation of the protocol:
>         % sudo xxd -c 14 -g 1 /dev/hidraw2 | nexio
>         0000000: 01 03 01 12d8 3357  02 02 15e1 1f71  01
>         000000e: 01 03 01 12cc 332a  02 02 15e1 1f71  01
>         000001c: 01 03 01 12de 3335  00 02 15e1 1f71  01
>         000002a: 01 03 01 12f4 3346  00 02 15e1 1f71  01
>         0000038: 01 03 01 1304 3352  00 02 15e1 1f71  01
>         0000046: 01 03 01 130c 3358  00 02 15e1 1f71  01
>         [... (next I stop touching the screen, and then touch it again)]
>         00009a0: 01 03 01 12d8 3357  00 02 15e1 1f71  01
>         00009ae: 01 03 01 12d8 3357  00 02 15e1 1f71  01
>         00009bc: 01 02 01 12d8 3357  00 02 15e1 1f71  01
>         00009ca: 01 03 01 10af 3681  02 02 15e1 1f71  01
>         00009d8: 01 03 01 10a5 3651  02 02 15e1 1f71  01
>         00009e6: 01 03 01 10b7 3654  00 02 15e1 1f71  01
>         [... (next is a multi-touch event)]
>         0000c78: 01 03 01 1019 3627  00 02 15e1 1f71  01
>         0000c86: 01 03 01 1019 3627  00 02 15e1 1f71  01
>         0000c94: 01 00 01 100b 35f8  00 02 1585 3110  00
>         0000ca2: 01 00 01 100e 3604  00 02 158a 311b  00
>         0000cb0: 01 00 01 1013 3615  00 02 1591 312b  00
>         0000cbe: 01 00 01 1017 3622  00 02 1596 3136  00
>         0000ccc: 01 00 01 1019 3628  00 02 1598 313c  00
>         0000cda: 01 00 01 1019 3629  00 02 1599 313d  00
>         0000ce8: 01 03 01 1019 3629  03 02 1598 313d  02
>         0000cf6: 01 03 01 1019 3628  03 02 1598 313c  02
>         0000d04: 01 03 01 1019 3627  03 02 1598 313b  02
>         0000d12: 01 03 01 1018 3627  03 02 1597 313a  02
>         [... (next I release both fingers -- not quite simultaneously)]
>         0000df2: 01 03 01 1019 3627  03 02 1598 3132  02
>         0000e00: 01 03 01 1019 3627  03 02 1598 3132  02
>         0000e0e: 01 03 01 1019 3627  02 02 1598 3132  01
>         0000e1c: 01 03 01 1019 3626  02 02 1598 3132  01
>         0000e2a: 01 03 01 1019 3626  00 02 1598 3132  01
>         0000e38: 01 03 01 1019 3626  00 02 1598 3132  01
>         0000e46: 01 03 01 1019 3626  00 02 1598 3132  01
>         0000e54: 01 03 01 1019 3626  00 02 1598 3132  01
>         0000e62: 01 03 01 1019 3625  00 02 1598 3132  01
>         0000e70: 01 02 01 1019 3625  00 02 1598 3132  01
> 
> Decoding the above:
> - column 1: just a reprint of the xxd byte count
> - column 2: always 01 -- probably a data packet sync byte
> - column 3: usually 03 (which means an on-going touch event)
> 		- 02 seems to indicate a touch-release event
> 		- 00 seems to indicate a transition to a dual-touch event
> - column 4: always 01 -- probably an indicator that the next two
> 		words are the X/Y values for touch #1
> - column 5: value of X location of touch #1
> - column 6: value of Y location of touch #1
> - column 7: usually 00
> 		- 02 seems to mean initiation of a single-touch event
> 		- 03 seems to indicate an on-going dual-touch event
> - column 8: always 02 -- probably an indicator that the next two
> 		words are the X/Y values for touch #2
> - column 9: value of X location of touch #2
> - column 10:value of Y location of touch #2
> - column 11: usually 01 or 02 representing the number of contact points
> 		- will be 00 when transitioning from single to dual
> 		  contact touch event
> 
> The rest of this email is a sample of some of the data that I've
> collected about what the system reports.  I think this should be
> sufficient to get across all necessary information, but I have
> more if warrented.
> 
>         % xinput list --short 10
>         Nexio Touch Device.   HID Multi-Touch           id=10
> [slave  pointer  (2)]
>         % xinput test 10
>         motion a[0]=15177 a[1]=5581 a[2]=15479 a[3]=7829 a[4]=0 a[5]=0
>         motion a[6]=0 a[7]=0 a[8]=0 a[9]=0 a[10]=0
>         button press   1
>         button release 1
>         button press   1
>         button release 1
>         button press   1
>         button release 1
>         button press   1
>         button release 1
>         button press   1
>         button release 1
>         button press   1
>         button release 1
>         [...]
> 
> So you can see that at first contact the location of the touch is reported,
> but then there is the continual stream of button press/release.
> 
> Here is the output from "evtest" from a single finger interaction:
>     % sudo evtest /dev/input/event4
>     Input driver version is 1.0.1
>     Input device ID: bus 0x3 vendor 0x1870 product 0x100 version 0x111
>     Input device name: "Nexio Touch Device.   HID Multi-Touch"
>     Supported events:
>       Event type 0 (Sync)
>       Event type 1 (Key)
>         Event code 272 (LeftBtn)
>         Event code 273 (RightBtn)
>         Event code 274 (MiddleBtn)
>         Event code 320 (ToolPen)
>         Event code 321 (ToolRubber)
>         Event code 322 (ToolBrush)
>         Event code 330 (Touch)
>       Event type 3 (Absolute)
>         Event code 0 (X)
>           Value  15129
>           Min        0
>           Max    16383
>         Event code 1 (Y)
>           Value   6425
>           Min        0
>           Max    16383
>         Event code 2 (Z)
>           Value  14859
>           Min        0
>           Max    16383
>         Event code 3 (Rx)
>           Value   7160
>           Min        0
>           Max    16383
>         Event code 4 (Ry)
>           Value      0
>           Min        0
>           Max    32767
>         Event code 5 (Rz)
>           Value      0
>           Min        0
>           Max    32767
>         Event code 6 (Throttle)
>           Value      0
>           Min        0
>           Max    16383
>         Event code 7 (Rudder)
>           Value      0
>           Min        0
>           Max    16383
>         Event code 40 (Misc)
>           Value      1
>           Min        0
>           Max        1
>         Event code 41 (?)
>           Value      2
>           Min        0
>           Max        1
>         Event code 42 (?)
>           Value      1
>           Min        0
>           Max        2
>       Event type 4 (Misc)
>         Event code 4 (ScanCode)
>     Testing ... (interrupt to exit)
>     Event: time 1287784276.760109, type 4 (Misc), code 4 (ScanCode),
> value d0042
>     Event: time 1287784276.760112, type 1 (Key), code 330 (Touch), value 1
>     Event: time 1287784276.760119, type 3 (Absolute), code 0 (X),
> value 14976
>     Event: time 1287784276.760122, type 3 (Absolute), code 1 (Y),
> value 7291
>     Event: time 1287784276.760125, type 4 (Misc), code 4 (ScanCode),
> value d0042
>     Event: time 1287784276.760127, type 1 (Key), code 330 (Touch), value 0
>     Event: time 1287784276.760130, type 1 (Key), code 321
> (ToolRubber), value 1
>     Event: time 1287784276.760139, -------------- Report Sync ------------
>     Event: time 1287784276.773107, type 4 (Misc), code 4 (ScanCode),
> value d0042
>     Event: time 1287784276.773111, type 1 (Key), code 330 (Touch), value 1
>     Event: time 1287784276.773117, type 3 (Absolute), code 0 (X),
> value 14925
>     Event: time 1287784276.773120, type 3 (Absolute), code 1 (Y),
> value 7266
>     Event: time 1287784276.773123, type 4 (Misc), code 4 (ScanCode),
> value d0042
>     Event: time 1287784276.773124, type 1 (Key), code 330 (Touch), value 0
>     Event: time 1287784276.773135, -------------- Report Sync ------------
>     Event: time 1287784276.785094, type 4 (Misc), code 4 (ScanCode),
> value d0042
>     Event: time 1287784276.785099, type 1 (Key), code 330 (Touch), value 1
>     Event: time 1287784276.785105, type 3 (Absolute), code 0 (X),
> value 14937
>     Event: time 1287784276.785108, type 3 (Absolute), code 1 (Y),
> value 7269
>     Event: time 1287784276.785112, type 4 (Misc), code 4 (ScanCode),
> value d0042
>     Event: time 1287784276.785113, type 1 (Key), code 330 (Touch), value 0
>     Event: time 1287784276.785116, type 1 (Key), code 321
> (ToolRubber), value 0
>     Event: time 1287784276.785125, -------------- Report Sync ------------
>     ^C
> 
> And here is the output of "evtest" from when I touched the screen with
> two fingers:
>     % sudo evtest /dev/input/event4
>     Input driver version is 1.0.1
>     Input device ID: bus 0x3 vendor 0x1870 product 0x100 version 0x111
>     Input device name: "Nexio Touch Device.   HID Multi-Touch"
>     Supported events:
>       Event type 0 (Sync)
>       Event type 1 (Key)
>         Event code 272 (LeftBtn)
>         Event code 273 (RightBtn)
>         Event code 274 (MiddleBtn)
>         Event code 320 (ToolPen)
>         Event code 321 (ToolRubber)
>         Event code 322 (ToolBrush)
>         Event code 330 (Touch)
>       Event type 3 (Absolute)
>         Event code 0 (X)
>           Value  14937
>           Min        0
>           Max    16383
>         Event code 1 (Y)
>           Value   7269
>           Min        0
>           Max    16383
>         Event code 2 (Z)
>           Value  14859
>           Min        0
>           Max    16383
>         Event code 3 (Rx)
>           Value   7160
>           Min        0
>           Max    16383
>         Event code 4 (Ry)
>           Value      0
>           Min        0
>           Max    32767
>         Event code 5 (Rz)
>           Value      0
>           Min        0
>           Max    32767
>         Event code 6 (Throttle)
>           Value      0
>           Min        0
>           Max    16383
>         Event code 7 (Rudder)
>           Value      0
>           Min        0
>           Max    16383
>         Event code 40 (Misc)
>           Value      1
>           Min        0
>           Max        1
>         Event code 41 (?)
>           Value      2
>           Min        0
>           Max        1
>         Event code 42 (?)
>           Value      1
>           Min        0
>           Max        2
>       Event type 4 (Misc)
>         Event code 4 (ScanCode)
>     Testing ... (interrupt to exit)
>     Event: time 1287784360.966997, type 1 (Key), code 320 (ToolPen),
> value 0
>     Event: time 1287784360.967004, type 3 (Absolute), code 0 (X),
> value 14717
>     Event: time 1287784360.967006, type 3 (Absolute), code 1 (Y),
> value 6211
>     Event: time 1287784360.967014, type 3 (Absolute), code 2 (Z),
> value 15680
>     Event: time 1287784360.967016, type 3 (Absolute), code 3 (Rx),
> value 6211
>     Event: time 1287784360.967019, type 3 (Absolute), code 42 (?), value 0
>     Event: time 1287784360.967020, -------------- Report Sync ------------
>     Event: time 1287784360.979997, type 3 (Absolute), code 0 (X),
> value 14667
>     Event: time 1287784360.980001, type 3 (Absolute), code 1 (Y),
> value 6189
>     Event: time 1287784360.980008, type 3 (Absolute), code 2 (Z),
> value 15626
>     Event: time 1287784360.980011, type 3 (Absolute), code 3 (Rx),
> value 6189
>     Event: time 1287784360.980014, -------------- Report Sync ------------
>     Event: time 1287784360.992997, type 3 (Absolute), code 0 (X),
> value 14684
>     Event: time 1287784360.993000, type 3 (Absolute), code 1 (Y),
> value 6195
>     Event: time 1287784360.993008, type 3 (Absolute), code 2 (Z),
> value 15640
>     Event: time 1287784360.993011, type 3 (Absolute), code 3 (Rx),
> value 6195
>     Event: time 1287784360.993014, -------------- Report Sync ------------
>     Event: time 1287784361.005998, type 3 (Absolute), code 0 (X),
> value 14715
>     Event: time 1287784361.006001, type 3 (Absolute), code 1 (Y),
> value 6220
>     Event: time 1287784361.006008, type 3 (Absolute), code 2 (Z),
> value 15660
>     Event: time 1287784361.006011, type 3 (Absolute), code 3 (Rx),
> value 6220
>     Event: time 1287784361.006014, -------------- Report Sync ------------
>     Event: time 1287784361.018000, type 3 (Absolute), code 0 (X),
> value 14745
>     Event: time 1287784361.018004, type 3 (Absolute), code 1 (Y),
> value 6278
>     Event: time 1287784361.018012, type 3 (Absolute), code 2 (Z),
> value 15674
>     Event: time 1287784361.018014, type 3 (Absolute), code 3 (Rx),
> value 6278
>     Event: time 1287784361.018017, -------------- Report Sync ------------
>     Event: time 1287784361.030997, type 3 (Absolute), code 0 (X),
> value 14767
>     Event: time 1287784361.031000, type 3 (Absolute), code 1 (Y),
> value 6358
>     Event: time 1287784361.031008, type 3 (Absolute), code 2 (Z),
> value 15680
>     Event: time 1287784361.031010, type 3 (Absolute), code 3 (Rx),
> value 6358
>     Event: time 1287784361.031013, -------------- Report Sync ------------
>     Event: time 1287784361.043996, type 4 (Misc), code 4 (ScanCode),
> value d0042
>     Event: time 1287784361.043999, type 1 (Key), code 330 (Touch), value 1
>     Event: time 1287784361.044001, type 1 (Key), code 320 (ToolPen),
> value 1
>     Event: time 1287784361.044006, type 3 (Absolute), code 0 (X),
> value 14777
>     Event: time 1287784361.044008, type 3 (Absolute), code 1 (Y),
> value 6451
>     Event: time 1287784361.044012, type 1 (Key), code 321
> (ToolRubber), value 1
>     Event: time 1287784361.044016, type 3 (Absolute), code 2 (Z),
> value 15682
>     Event: time 1287784361.044019, type 3 (Absolute), code 3 (Rx),
> value 6451
>     Event: time 1287784361.044021, type 3 (Absolute), code 42 (?), value 2
>     Event: time 1287784361.044023, -------------- Report Sync ------------
>     Event: time 1287784361.057000, type 3 (Absolute), code 0 (X),
> value 14779
>     Event: time 1287784361.057004, type 3 (Absolute), code 1 (Y),
> value 6546
>     Event: time 1287784361.057012, type 3 (Absolute), code 3 (Rx),
> value 6546
>     Event: time 1287784361.057016, -------------- Report Sync ------------
>     Event: time 1287784361.069998, type 3 (Absolute), code 0 (X),
> value 14778
>     Event: time 1287784361.070001, type 3 (Absolute), code 1 (Y),
> value 6640
>     Event: time 1287784361.070009, type 3 (Absolute), code 2 (Z),
> value 15681
>     Event: time 1287784361.070011, type 3 (Absolute), code 3 (Rx),
> value 6640
>     Event: time 1287784361.070014, -------------- Report Sync ------------
>     Event: time 1287784361.081989, type 3 (Absolute), code 0 (X),
> value 14776
>     Event: time 1287784361.081992, type 3 (Absolute), code 1 (Y),
> value 6733
>     Event: time 1287784361.082000, type 3 (Absolute), code 2 (Z),
> value 15680
>     Event: time 1287784361.082002, type 3 (Absolute), code 3 (Rx),
> value 6733
>     Event: time 1287784361.082005, -------------- Report Sync ------------
>     Event: time 1287784361.094987, type 3 (Absolute), code 0 (X),
> value 14775
>     Event: time 1287784361.094990, type 3 (Absolute), code 1 (Y),
> value 6832
>     Event: time 1287784361.094998, type 3 (Absolute), code 2 (Z),
> value 15679
>     Event: time 1287784361.095000, type 3 (Absolute), code 3 (Rx),
> value 6832
>     Event: time 1287784361.095004, -------------- Report Sync ------------
>     Event: time 1287784361.107986, type 3 (Absolute), code 0 (X),
> value 14774
>     Event: time 1287784361.107990, type 3 (Absolute), code 1 (Y),
> value 6939
>     Event: time 1287784361.107999, type 3 (Absolute), code 3 (Rx),
> value 6939
>     Event: time 1287784361.108002, -------------- Report Sync ------------
>     Event: time 1287784361.121001, type 3 (Absolute), code 1 (Y),
> value 7042
>     Event: time 1287784361.121011, type 3 (Absolute), code 3 (Rx),
> value 7042
>     Event: time 1287784361.121014, -------------- Report Sync ------------
>     Event: time 1287784361.132987, type 3 (Absolute), code 0 (X),
> value 14779
>     Event: time 1287784361.132991, type 3 (Absolute), code 1 (Y),
> value 7138
>     Event: time 1287784361.132999, type 3 (Absolute), code 3 (Rx),
> value 7138
>     Event: time 1287784361.133003, -------------- Report Sync ------------
>     Event: time 1287784361.145998, type 3 (Absolute), code 0 (X),
> value 14794
>     Event: time 1287784361.146001, type 3 (Absolute), code 1 (Y),
> value 7221
>     Event: time 1287784361.146010, type 3 (Absolute), code 3 (Rx),
> value 7221
>     Event: time 1287784361.146014, -------------- Report Sync ------------
>     Event: time 1287784361.158999, type 3 (Absolute), code 0 (X),
> value 14815
>     Event: time 1287784361.159003, type 3 (Absolute), code 1 (Y),
> value 7284
>     Event: time 1287784361.159010, type 3 (Absolute), code 2 (Z),
> value 15684
>     Event: time 1287784361.159012, type 3 (Absolute), code 3 (Rx),
> value 7284
>     Event: time 1287784361.159016, -------------- Report Sync ------------
>     Event: time 1287784361.183994, type 4 (Misc), code 4 (ScanCode),
> value d0042
>     Event: time 1287784361.183996, type 1 (Key), code 330 (Touch), value 0
>     Event: time 1287784361.184014, -------------- Report Sync ------------
>     ^C
> 
> So you can see that the location of both fingers is reported for the
> multi-touch operation (with one finger reported as X & Y, and the
> second finger as Z & Rx).  But with one finger, it's a bunch of button
> presses and then nearly instantaneous releases.
> 
> 
> And one final bit of information.  Here is the relevant information from
> the udev.log:
>     -----------------------------
>     UDEV  [1287664208.316717] add
> /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input4/event4
> (input)
>     UDEV_LOG=3
>     ACTION=add
> 
> DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input4/event4
>     SUBSYSTEM=input
>     DEVNAME=/dev/input/event4
>     SEQNUM=1272
>     ID_INPUT=1
>     ID_INPUT_TABLET=1
>     ID_VENDOR=Nexio_Touch_Device.
>     ID_VENDOR_ENC=Nexio\x20Touch\x20Device.\x20\x20
>     ID_VENDOR_ID=1870
>     ID_MODEL=HID_Multi-Touch
>     ID_MODEL_ENC=HID\x20Multi-Touch
>     ID_MODEL_ID=0100
>     ID_REVISION=0006
>     ID_SERIAL=Nexio_Touch_Device._HID_Multi-Touch
>     ID_TYPE=hid
>     ID_BUS=usb
>     ID_USB_INTERFACES=:030000:
>     ID_USB_INTERFACE_NUM=00
>     ID_USB_DRIVER=usbhid
>     ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
>     MAJOR=13
>     MINOR=68
>     DEVLINKS=/dev/char/13:68
> /dev/input/by-id/usb-Nexio_Touch_Device._HID_Multi-Touch-event-mouse
> /dev/input/by-path/pci-0000:00:1d.2-usb-0:2:1.0-event-mouse
> 
>     UDEV  [1287664208.316759] add
> /devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input4/mouse1
> (input)
>     UDEV_LOG=3
>     ACTION=add
> 
> DEVPATH=/devices/pci0000:00/0000:00:1d.2/usb8/8-2/8-2:1.0/input/input4/mouse1
>     SUBSYSTEM=input
>     DEVNAME=/dev/input/mouse1
>     SEQNUM=1273
>     ID_INPUT=1
>     ID_INPUT_TABLET=1
>     ID_VENDOR=Nexio_Touch_Device.
>     ID_VENDOR_ENC=Nexio\x20Touch\x20Device.\x20\x20
>     ID_VENDOR_ID=1870
>     ID_MODEL=HID_Multi-Touch
>     ID_MODEL_ENC=HID\x20Multi-Touch
>     ID_MODEL_ID=0100
>     ID_REVISION=0006
>     ID_SERIAL=Nexio_Touch_Device._HID_Multi-Touch
>     ID_TYPE=hid
>     ID_BUS=usb
>     ID_USB_INTERFACES=:030000:
>     ID_USB_INTERFACE_NUM=00
>     ID_USB_DRIVER=usbhid
>     ID_PATH=pci-0000:00:1d.2-usb-0:2:1.0
>     MAJOR=13
>     MINOR=33
>     DEVLINKS=/dev/char/13:33
> /dev/input/by-id/usb-Nexio_Touch_Device._HID_Multi-Touch-mouse
> /dev/input/by-path/pci-0000:00:1d.2-usb-0:2:1.0-mouse
>     -----------------------------
> 
> And if that isn't enough info, I'm happy to provide more.
> 
> 
>     Thanks for whatever suggestions you can provide,
>     Bill
> 
> -- 
> Bill Sherman
> Sr. Technology Advisor
> Advanced Visualization Lab
> Pervasive Technology Inst
> Indiana University
> shermanw@indiana.edu
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
Dmitry

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: usbhid: HP LD4200tm touchscreen ALMOST works
  2010-11-01 21:14 ` Dmitry Torokhov
@ 2010-11-01 21:22   ` Jiri Kosina
  2010-11-02 13:46     ` William Sherman
  0 siblings, 1 reply; 4+ messages in thread
From: Jiri Kosina @ 2010-11-01 21:22 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: William Sherman, linux-kernel, Linux Input

On Mon, 1 Nov 2010, Dmitry Torokhov wrote:

> > I'm looking to dig into the usbhid driver code to get me the last
> > mile and get my HP LD4200tm touchscreen working on my Linux system.
> > [NOTE: I posted about this elsewhere, but as I think about it more,
> > this is more of a linux-kernel issue than anything else, so I'm
> > reprising that note here.]
> 
> I think you'll have better luck on linux-input...

Thanks for CC, Dmitry.

> > So, in first connecting the HP touchscreen (with touchscreen hardware
> > from Nexio) to the Linux system (running Ubuntu 10.10 -- 2.6.35-22 generic)
> > things were looking up, as the unit almost worked right out of the box
> > as a plug-and-play device.  Unfortunately, that last mile needs to be
> > addressed in order for the unit to work in a useful way.  I think I've
> > narrowed down the problem to the usbhid driver, as I'll explain in a
> > moment, and while I expect I have the ability to debug and fix the issue,
> > this would be my first dive into Linux driver coding, so I could probably
> > use a pointer as to what steps are necessary to get the proper kernel
> > sources, compile the needed parts and restart the system (hopefully
> > just restart X-windows) to test my edits (especially since Ubuntu tends
> > to not include a not of the necessary components).
> > 
> > I've collected gobs of data on what udev, hidraw, evtest and X-windows
> > report, but before I get to any of that, here's the executive summary:
> > 
> > Plugging the HP LD4200tm into a Ubuntu 10.10 system will cause the
> > device to be recognized, create a usbhid device, create an event device,
> > activate the evdev driver for Xorg, and put it on the list of X's inputs.
> > So far, so good.
> > 
> > Touching the device causes the mouse pointer to jump to that location,
> > even better.
> > 
> > But when I'm touching the screen, what happens is that the system
> > generates a continuous stream of button presses/releases -- as if
> > I moved the mouse to a particular location and then went crazy
> > tapping on the mouse button.  This is the part that makes the system
> > unusable.
> > 
> > One more data point is that if I touch the screen with a second
> > finger, the button barrage stops, and it will now gracefully report
> > the movement of the first finger.
> > 
> > So all I need to do is modify the driver for this device's protocol
> > to not send all the unnecessary release/press events.
> > 
> > 
> > Here is the data that leads me to believe the issue is at the usbhid
> > layer:
> > 
> > 
> > 1) Running "evtest /dev/input/event4" reveals that the button barrage
> > is already occurring at the HID event layer.
> > 
> > 2) Watching the raw data on /dev/usb/hiddev2 does report a stream of
> > data as the touchscreen is touched (and no data when it's not touched),
> > looking at the output suggests that the device is only reporting touch/
> > release events when the screen is actually touched or released.  And of
> > course, even if the device were reporting things poorly, I figure the
> > usbhid driver could be written to overcome this.
> > 
> > Fortunately, the data seems to be a constant 14-byte stride, so I
> > wrote a simple awk script ("nexio") to reformat the data as I was
> > figuring out the raw protocol.  Here's a sample of the reformatted
> > data, followed by my estimation of the protocol:
> >         % sudo xxd -c 14 -g 1 /dev/hidraw2 | nexio
> >         0000000: 01 03 01 12d8 3357  02 02 15e1 1f71  01
> >         000000e: 01 03 01 12cc 332a  02 02 15e1 1f71  01
> >         000001c: 01 03 01 12de 3335  00 02 15e1 1f71  01
> >         000002a: 01 03 01 12f4 3346  00 02 15e1 1f71  01
> >         0000038: 01 03 01 1304 3352  00 02 15e1 1f71  01
> >         0000046: 01 03 01 130c 3358  00 02 15e1 1f71  01
> >         [... (next I stop touching the screen, and then touch it again)]
> >         00009a0: 01 03 01 12d8 3357  00 02 15e1 1f71  01
> >         00009ae: 01 03 01 12d8 3357  00 02 15e1 1f71  01
> >         00009bc: 01 02 01 12d8 3357  00 02 15e1 1f71  01
> >         00009ca: 01 03 01 10af 3681  02 02 15e1 1f71  01
> >         00009d8: 01 03 01 10a5 3651  02 02 15e1 1f71  01
> >         00009e6: 01 03 01 10b7 3654  00 02 15e1 1f71  01
> >         [... (next is a multi-touch event)]
> >         0000c78: 01 03 01 1019 3627  00 02 15e1 1f71  01
> >         0000c86: 01 03 01 1019 3627  00 02 15e1 1f71  01
> >         0000c94: 01 00 01 100b 35f8  00 02 1585 3110  00
> >         0000ca2: 01 00 01 100e 3604  00 02 158a 311b  00
> >         0000cb0: 01 00 01 1013 3615  00 02 1591 312b  00
> >         0000cbe: 01 00 01 1017 3622  00 02 1596 3136  00
> >         0000ccc: 01 00 01 1019 3628  00 02 1598 313c  00
> >         0000cda: 01 00 01 1019 3629  00 02 1599 313d  00
> >         0000ce8: 01 03 01 1019 3629  03 02 1598 313d  02
> >         0000cf6: 01 03 01 1019 3628  03 02 1598 313c  02
> >         0000d04: 01 03 01 1019 3627  03 02 1598 313b  02
> >         0000d12: 01 03 01 1018 3627  03 02 1597 313a  02
> >         [... (next I release both fingers -- not quite simultaneously)]
> >         0000df2: 01 03 01 1019 3627  03 02 1598 3132  02
> >         0000e00: 01 03 01 1019 3627  03 02 1598 3132  02
> >         0000e0e: 01 03 01 1019 3627  02 02 1598 3132  01
> >         0000e1c: 01 03 01 1019 3626  02 02 1598 3132  01
> >         0000e2a: 01 03 01 1019 3626  00 02 1598 3132  01
> >         0000e38: 01 03 01 1019 3626  00 02 1598 3132  01
> >         0000e46: 01 03 01 1019 3626  00 02 1598 3132  01
> >         0000e54: 01 03 01 1019 3626  00 02 1598 3132  01
> >         0000e62: 01 03 01 1019 3625  00 02 1598 3132  01
> >         0000e70: 01 02 01 1019 3625  00 02 1598 3132  01

Thanks a lot for the detailed analysis. What would actually be interesting 
to see would be the HID debugfs output. Namely

1) mount debugfs
2) cat /sys/kernel/debug/<device>/rdesc
3) obtain output of /sys/kernel/debug/<device>/events and annotate it as 
you did for your previous output (i.e. "this happens when I do one-finger 
move", "this happens when I do two-finger trick to make it work").

This way, it'd be much easier to see what is actually hapenning on HID 
level.

Thanks,

-- 
Jiri Kosina
SUSE Labs, Novell Inc.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: usbhid: HP LD4200tm touchscreen ALMOST works
  2010-11-01 21:22   ` Jiri Kosina
@ 2010-11-02 13:46     ` William Sherman
  0 siblings, 0 replies; 4+ messages in thread
From: William Sherman @ 2010-11-02 13:46 UTC (permalink / raw)
  To: Jiri Kosina; +Cc: Dmitry Torokhov, linux-kernel, Linux Input, William Sherman

On 11/1/10 5:22 PM, Jiri Kosina wrote:
> On Mon, 1 Nov 2010, Dmitry Torokhov wrote:
>
>>> I'm looking to dig into the usbhid driver code to get me the last
>>> mile and get my HP LD4200tm touchscreen working on my Linux system.
>>> [NOTE: I posted about this elsewhere, but as I think about it more,
>>> this is more of a linux-kernel issue than anything else, so I'm
>>> reprising that note here.]
>>
>> I think you'll have better luck on linux-input...
>
> Thanks for CC, Dmitry.

Yes, thanks from me too for pointing this thread in the right direction.
I also sent a revised (updated) post to the linux-kernel list, but was
not aware of the linux-input list.

> Thanks a lot for the detailed analysis. What would actually be interesting
> to see would be the HID debugfs output. Namely
>
> 1) mount debugfs
> 2) cat /sys/kernel/debug/<device>/rdesc
> 3) obtain output of /sys/kernel/debug/<device>/events and annotate it as
> you did for your previous output (i.e. "this happens when I do one-finger
> move", "this happens when I do two-finger trick to make it work").
>
> This way, it'd be much easier to see what is actually hapenning on HID
> level.

Great.  I will do that as soon as I can -- which is when I arrive at
SuperComputing to setup our system.  The display (our only one) is currently
on a truck bound for New Orleans.

In the meantime, I wrote a very simple application that parses the
data directly from /dev/hidrawN, does a simple parse, and then
creates X events with the Xtest API.  Of course, I'm only doing
single touch, since that's all I need for the moment.

I also have a Dell SX2210T touch screen with the NextWindow interface.
We made some partial progress on our Ubuntu 10.10 system with the nwfermi
driver, but again, not quite all the way -- of course now that computer
is on the road, and I'm not having as much luck with that touchscreen
on my Fedora 13 system.

> Thanks,

	Thank you both, and more to come,
	Bill

--
Bill Sherman
Sr. Technology Advisor
Advanced Visualization Lab
Pervasive Technologies Inst
Indiana University
shermanw@indiana.edu


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-11-02 13:46 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-10-25 23:48 usbhid: HP LD4200tm touchscreen ALMOST works William Sherman
2010-11-01 21:14 ` Dmitry Torokhov
2010-11-01 21:22   ` Jiri Kosina
2010-11-02 13:46     ` William Sherman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox