userspace touchscreen support

Trevor Woerner twoerner at gmail.com
Thu Jan 28 05:12:36 PST 2016


Hi,

I have one of those 7" touchscreens that has both an HDMI port and a USB
port. I'm writing code in userspace to handle the touch events:

1. using libudev to detect/find the device and its associated device
node (/dev/hidrawX)

2. creating a virtual uinput device to send the interpreted touch events
to the OS

When I plug in the screen's USB port to my system I get:

hid-generic 0003:0EEF:0005.0004: hiddev0,hidraw2: USB HID v1.10 Device
[RPI_TOUCH By ZH851] on usb-0000:00:14.0-2/input0

Reading and interpreting the touch events works great. I barely have to
touch the screen with anywhere from 1 to 5 fingers, I receive the events
and are able to interpret them just fine.

The odd part is sending them to the uinput side. Sending just one set of
events for any one touch is never enough. I always have to touch and
hold for about half-a-second before the cursor moves, which means about
7-10 events are generated and sent. Sometimes the cursor will move with
as few as 3-4 events, but usually more are needed. Originally I had
added code to detect and ignore duplicates, but I had to remove that
code since things won't work if only one event set is generated.

Here's what one touch event set looks like:

{hdmi-usb-touch.c:0797} aa 01 00 ed 01 38 bb 01 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 cc
{hdmi-usb-touch.c:0837} x0:237   y0:312   
{hdmi-usb-touch.c:0262} => uinput event: type:EV_ABS 
code:ABS_MT_SLOT          value:0
{hdmi-usb-touch.c:0262} => uinput event: type:EV_ABS 
code:ABS_MT_TRACKING_ID   value:0
{hdmi-usb-touch.c:0262} => uinput event: type:EV_ABS 
code:ABS_MT_POSITION_X    value:237
{hdmi-usb-touch.c:0262} => uinput event: type:EV_ABS 
code:ABS_MT_POSITION_Y    value:312
{hdmi-usb-touch.c:0262} => uinput event: type:EV_SYN 
code:SYN_MT_REPORT        value:0
{hdmi-usb-touch.c:0306}
{hdmi-usb-touch.c:0797} aa 00 00 00 00 00 bb 01 01 e0 03 20 01 e0 03 20
01 e0 03 20 01 e0 03 20 cc
{hdmi-usb-touch.c:0837} x0:0     y0:0     
{hdmi-usb-touch.c:0262} => uinput event: type:EV_SYN 
code:SYN_MT_REPORT        value:0
{hdmi-usb-touch.c:0306}
{hdmi-usb-touch.c:0797} aa 00 00 00 00 00 bb 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00
{hdmi-usb-touch.c:0262} => uinput event: type:EV_ABS 
code:ABS_MT_SLOT          value:0
{hdmi-usb-touch.c:0262} => uinput event: type:EV_ABS 
code:ABS_MT_TRACKING_ID   value:-1
{hdmi-usb-touch.c:0262} => uinput event: type:EV_SYN 
code:SYN_MT_REPORT        value:0
{hdmi-usb-touch.c:0306}
{hdmi-usb-touch.c:0797} aa 00 00 00 00 00 bb 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00
{hdmi-usb-touch.c:0425}   => (duplicate)
{hdmi-usb-touch.c:0262} => uinput event: type:EV_SYN 
code:SYN_MT_REPORT        value:0
{hdmi-usb-touch.c:0306}
{hdmi-usb-touch.c:0797} aa 00 00 00 00 00 bb 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00
{hdmi-usb-touch.c:0425}   => (duplicate)
{hdmi-usb-touch.c:0262} => uinput event: type:EV_SYN 
code:SYN_MT_REPORT        value:0
{hdmi-usb-touch.c:0306}

The above, of course, wouldn't be successful. In order to succeed the
first 8 lines would need to be repeated several more times, followed by
the rest of the above block.

Here are some of the components I'm running:
    libudev0_182
    xserver-xorg_2:1.18.0
    xf86-video-intel_2:2.99.917
    xf86-input-evdev_2:2.10.1
    xinput_1.6.2
    metacity_2.34.13

I have other questions but I'll just ask the one for now. I realize this
issue might be related to a number of different pieces of code, but
hopefully someone has some ideas?

The USB data from some such 7" displays masquerade as mouse events (e.g.
one of the screens from Adafruit). Those displays work "out of the box"
with Linux; just plug and play. Mine, however, doesn't; mine shows up as
hidraw.

Thanks and best regards,
    Trevor


More information about the xorg mailing list