Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 14 Aug 2021 15:44:09 +0300
From:      Vladimir Kondratyev <wulf@FreeBSD.org>
To:        Mark Kane <mark@kane.mn>
Cc:        usb@freebsd.org, hps@selasky.org
Subject:   Re: eGalax USB touchscreen issues
Message-ID:  <1c3ebd54-3686-ff5f-d5be-5a42ddcd5469@FreeBSD.org>
In-Reply-To: <3bfc252a7ef55b21d5e51c251a518d78@kane.mn>
References:  <324d49ca-1c0e-659d-194d-ece4d5f7f5e2@FreeBSD.org> <0ae3fec48e2c351d2c006f4ba4932cd7@kane.mn> <166dd4d4-24cd-c24b-d75e-9a34fa734358@FreeBSD.org> <eccaff2a99153fb44ffa8df3c93d7eb6@kane.mn> <36983ce5-8358-5a04-2377-46067d3c3c79@FreeBSD.org> <c9e68dbb-5382-976d-7302-d816d8636153@FreeBSD.org> <59ba07a0ecbdac36746fe18ea5f0559f@kane.mn> <92c855bf-a73a-bae5-fcdc-c5a88008739b@FreeBSD.org> <5e8cd8d75deff98e8db3352001ce8432@kane.mn> <858ac67e-14e2-730c-4a16-ca218e2c0bee@FreeBSD.org> <ee3c43f89df5dffd0b0dab7393f0c5b5@kane.mn> <168b368c-3258-6416-42c5-a722e45bf14b@FreeBSD.org> <a7e09a33593bc00c7ef525b47efcafa1@kane.mn> <12706f32-be2e-1cda-5d90-53b4e80b0b52@FreeBSD.org> <3bfc252a7ef55b21d5e51c251a518d78@kane.mn>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------98DBBA9ACAC8556429D80CE7
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

On 12.08.2021 06:37, Mark Kane wrote:
> On 2021-08-11 17:12, Vladimir Kondratyev wrote:
>> On 10.08.2021 07:03, Mark Kane wrote:
>>> # usbhid-dump
>>> 000:003:000:DESCRIPTOR         1628551474.564813
>>>  8D 0F 00 09 42 09 32 15 00 25 01 95 02 75 01 81
>>>  02 95 06 75 01 81 03 05 01 09 30 75 10 95 01 A4
>>>  55 00 65 00 36 00 00 46 00 00 16 1E 00 26 C8 0F
>>>  81 02 09 31 16 3C 00 26
>>    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> This one looks like corrupted fragment of touch device HID report
>> descriptor. Check wires, USB port, device itself and so on. Most
>> probably, it is a standard eGalax HID device with some USB transport
>> problems.
> 
> That is very interesting and a good catch. I have been using the same
> cable and USB port across all tests for consistency. This same #2 screen
> connected with the same cable to an identical machine running Linux
> 4.4.0-104 we get a much longer HID report descriptor:
> 
> linux# lsusb
> Bus 001 Device 005: ID 05e3:0608 Genesys Logic, Inc. Hub
> Bus 001 Device 004: ID 04ca:004f Lite-On Technology Corp. SK-9020 keyboard
> Bus 001 Device 003: ID 0eef:0001 D-WAV Scientific Co., Ltd eGalax
> TouchScreen
> Bus 001 Device 002: ID 8087:07e6 Intel Corp.
> Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
> linux# usbhid-dump
> 001:004:001:DESCRIPTOR         1628727550.064013
>  05 0C 09 01 A1 01 85 01 19 00 2A 3C 02 15 00 26
>  3C 02 95 01 75 10 81 00 C0 05 01 09 80 A1 01 85
>  02 19 81 29 83 25 01 75 01 95 03 81 02 95 05 81
>  01 C0
> 
> 001:004:000:DESCRIPTOR         1628727550.066916
>  05 01 09 06 A1 01 05 07 19 E0 29 E7 15 00 25 01
>  95 08 75 01 81 02 95 08 75 01 81 01 05 08 19 01
>  29 03 95 03 75 01 91 02 95 01 75 05 91 01 05 07
>  19 00 2A FF 00 15 00 26 FF 00 95 06 75 08 81 00
>  C0
> 
> 001:003:000:DESCRIPTOR         1628727550.070850
>  05 01 09 01 A1 01 85 01 09 01 A1 00 05 09 19 01
>  29 02 15 00 25 01 95 02 75 01 81 02 95 01 75 06
>  81 01 05 01 09 30 09 31 16 2A 00 26 BD 07 36 00
>  00 46 FF 0F 66 00 00 75 10 95 02 81 02 C0 C0 05
>  0D 09 04 A1 01 85 02 09 20 A1 00 09 42 09 32 15
>  00 25 01 95 02 75 01 81 02 95 06 75 01 81 03 05
>  01 09 30 75 10 95 01 A4 55 00 65 00 36 00 00 46
>  00 00 16 1E 00 26 C8 0F 81 02 09 31 16 3C 00 26
>  C3 0F 36 00 00 46 00 00 81 02 B4 C0 C0
> linux#
> 

This report descriptor looks good and differs from post 2014 one. It
belongs to device which uses legacy MS stylus protocol. I attached a
patch which implements support for it in hpen(4) driver. Also it is
applicable to post 2014 devices as they have stylus top level collection
too.

> Touch on this screen fully works on Linux using the binary EETI driver.
> Could there be something different about the USB controller in some of
> these screens that is causing the corruption on FreeBSD? If there is any
> other info to gather from either install I'm happy to.

I do not khow how to debug this issue. May be hselasky can help here.

I can offer a workaround. Simple tool to upload fixed pre-2014 report
descriptor in to HID core through hidraw(4) interface.
Just compile it and run using proper /dev/hidraw# device node path as
parameter:
# cc -o setrdesc setrdesc.c
# ./setrdesc /dev/hidraw0

Don't forget to kldload hidraw.ko before.

> Here are some other tests with the patches. All that don't work have the
> same shorter descriptor report.
> 
> Jul 2011 - doesn't work, same truncated report descriptor
> Sep 2011 - doesn't work, same truncated report descriptor
> Nov 2012 - doesn't work, same truncated report descriptor
> Mar 2013 - doesn't work, same truncated report descriptor
> Jul 2013 - doesn't work, same truncated report descriptor
> Sep 2014 - works with patches
> Sep 2014 #2 - works with patches
> Nov 2014 - works with patches
> Feb 2015 - works with patches
> Oct 2018 - works with patches
> Oct 2018 #2 - works with patches
> Feb 2020 - works with patches
> Feb 2020 - works with patches
> Feb 2021 - works with patches
> 
> And some more data from Linux in case it is helpful. event5 didn't hear
> events, event7 and event14 both did:
> 

event5 is dummy mouse which forces cursor appearance on Windows 7 and 8
event7 is real HID device. Something very similar would appear in
FreeBSD if both hpen.patch and setrdesc.c would work.
event14 - is something artificial created by binary driver.

> linux# evemu-record
> Available devices:
> /dev/input/event0:    Power Button
> /dev/input/event1:    Sleep Button
> /dev/input/event2:    Power Button
> /dev/input/event3:    Lite-On Technology Corp. USB Multimedia Keyboard
> /dev/input/event4:    Lite-On Technology Corp. USB Multimedia Keyboard
> /dev/input/event5:    eGalax Inc. USB TouchController
> /dev/input/event6:    Video Bus
> /dev/input/event7:    eGalax Inc. USB TouchController
> /dev/input/event8:    HDA Intel PCH Mic
> /dev/input/event9:    HDA Intel PCH Line Out
> /dev/input/event10:    HDA Intel PCH Headphone
> /dev/input/event11:    HDA Intel PCH HDMI/DP,pcm=3
> /dev/input/event12:    HDA Intel PCH HDMI/DP,pcm=7
> /dev/input/event13:    HDA Intel PCH HDMI/DP,pcm=8
> /dev/input/event14:    eGalaxTouch Virtual Device for Single
> Select the device event number [0-14]: 7
> # EVEMU 1.2
> # Input device name: "eGalax Inc. USB TouchController"
> # Input device ID: bus 0x03 vendor 0xeef product 0x01 version 0x210
> # Supported events:
> #   Event type 0 (EV_SYN)
> #     Event code 0 (SYN_REPORT)
> #     Event code 1 (SYN_CONFIG)
> #     Event code 2 (SYN_MT_REPORT)
> #     Event code 3 (SYN_DROPPED)
> #     Event code 4 ((null))
> #     Event code 5 ((null))
> #     Event code 6 ((null))
> #     Event code 7 ((null))
> #     Event code 8 ((null))
> #     Event code 9 ((null))
> #     Event code 10 ((null))
> #     Event code 11 ((null))
> #     Event code 12 ((null))
> #     Event code 13 ((null))
> #     Event code 14 ((null))
> #   Event type 1 (EV_KEY)
> #     Event code 320 (BTN_TOOL_PEN)
> #     Event code 330 (BTN_TOUCH)
> #   Event type 3 (EV_ABS)
> #     Event code 0 (ABS_X)
> #       Value   2069
> #       Min       30
> #       Max     4040
> #       Fuzz       0
> #       Flat       0
> #       Resolution 0
> #     Event code 1 (ABS_Y)
> #       Value   2503
> #       Min       60
> #       Max     4035
> #       Fuzz       0
> #       Flat       0
> #       Resolution 0
> #   Event type 4 (EV_MSC)
> #     Event code 4 (MSC_SCAN)
> # Properties:
> N: eGalax Inc. USB TouchController
> I: 0003 0eef 0001 0210
> P: 00 00 00 00 00 00 00 00
> B: 00 0b 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 01 04 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 02 00 00 00 00 00 00 00 00
> B: 03 03 00 00 00 00 00 00 00
> B: 04 10 00 00 00 00 00 00 00
> B: 05 00 00 00 00 00 00 00 00
> B: 11 00 00 00 00 00 00 00 00
> B: 12 00 00 00 00 00 00 00 00
> B: 14 00 00 00 00 00 00 00 00
> B: 15 00 00 00 00 00 00 00 00
> B: 15 00 00 00 00 00 00 00 00
> A: 00 30 4040 0 0 0
> A: 01 60 4035 0 0 0
> ################################
> #      Waiting for events      #
> ################################
> E: 0.000000 0004 0004 852034    # EV_MSC / MSC_SCAN             852034
> E: 0.000000 0001 014a 0001    # EV_KEY / BTN_TOUCH            1
> E: 0.000000 0003 0000 1533    # EV_ABS / ABS_X                1533
> E: 0.000000 0003 0001 2343    # EV_ABS / ABS_Y                2343
> E: 0.000000 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.006000 0003 0001 2345    # EV_ABS / ABS_Y                2345
> E: 0.006000 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.010005 0003 0000 1532    # EV_ABS / ABS_X                1532
> E: 0.010005 0003 0001 2358    # EV_ABS / ABS_Y                2358
> E: 0.010005 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.016010 0003 0000 1529    # EV_ABS / ABS_X                1529
> E: 0.016010 0003 0001 2370    # EV_ABS / ABS_Y                2370
> E: 0.016010 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.021998 0003 0000 1528    # EV_ABS / ABS_X                1528
> E: 0.021998 0003 0001 2378    # EV_ABS / ABS_Y                2378
> E: 0.021998 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.028003 0003 0000 1527    # EV_ABS / ABS_X                1527
> E: 0.028003 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.034000 0003 0000 1526    # EV_ABS / ABS_X                1526
> E: 0.034000 0003 0001 2382    # EV_ABS / ABS_Y                2382
> E: 0.034000 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.042003 0003 0001 2387    # EV_ABS / ABS_Y                2387
> E: 0.042003 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.050018 0003 0000 1525    # EV_ABS / ABS_X                1525
> E: 0.050018 0003 0001 2386    # EV_ABS / ABS_Y                2386
> E: 0.050018 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.058013 0003 0000 1524    # EV_ABS / ABS_X                1524
> E: 0.058013 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.074006 0003 0000 1523    # EV_ABS / ABS_X                1523
> E: 0.074006 0003 0001 2387    # EV_ABS / ABS_Y                2387
> E: 0.074006 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.089999 0003 0001 2388    # EV_ABS / ABS_Y                2388
> E: 0.089999 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.123988 0003 0000 1522    # EV_ABS / ABS_X                1522
> E: 0.123988 0003 0001 2395    # EV_ABS / ABS_Y                2395
> E: 0.123988 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.139999 0003 0001 2405    # EV_ABS / ABS_Y                2405
> E: 0.139999 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.156001 0003 0000 1523    # EV_ABS / ABS_X                1523
> E: 0.156001 0003 0001 2403    # EV_ABS / ABS_Y                2403
> E: 0.156001 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.172000 0003 0000 1524    # EV_ABS / ABS_X                1524
> E: 0.172000 0003 0001 2393    # EV_ABS / ABS_Y                2393
> E: 0.172000 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.187999 0003 0000 1527    # EV_ABS / ABS_X                1527
> E: 0.187999 0003 0001 2392    # EV_ABS / ABS_Y                2392
> E: 0.187999 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.211989 0004 0004 852034    # EV_MSC / MSC_SCAN             852034
> E: 0.211989 0001 014a 0000    # EV_KEY / BTN_TOUCH            0
> E: 0.211989 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> ^Clinux# evemu-record
> Available devices:
> /dev/input/event0:    Power Button
> /dev/input/event1:    Sleep Button
> /dev/input/event2:    Power Button
> /dev/input/event3:    Lite-On Technology Corp. USB Multimedia Keyboard
> /dev/input/event4:    Lite-On Technology Corp. USB Multimedia Keyboard
> /dev/input/event5:    eGalax Inc. USB TouchController
> /dev/input/event6:    Video Bus
> /dev/input/event7:    eGalax Inc. USB TouchController
> /dev/input/event8:    HDA Intel PCH Mic
> /dev/input/event9:    HDA Intel PCH Line Out
> /dev/input/event10:    HDA Intel PCH Headphone
> /dev/input/event11:    HDA Intel PCH HDMI/DP,pcm=3
> /dev/input/event12:    HDA Intel PCH HDMI/DP,pcm=7
> /dev/input/event13:    HDA Intel PCH HDMI/DP,pcm=8
> /dev/input/event14:    eGalaxTouch Virtual Device for Single
> Select the device event number [0-14]: 14
> # EVEMU 1.2
> # Input device name: "eGalaxTouch Virtual Device for Single"
> # Input device ID: bus 0x06 vendor 0xeef product 0x10 version 0x01
> # Supported events:
> #   Event type 0 (EV_SYN)
> #     Event code 0 (SYN_REPORT)
> #     Event code 1 (SYN_CONFIG)
> #     Event code 2 (SYN_MT_REPORT)
> #     Event code 3 (SYN_DROPPED)
> #     Event code 4 ((null))
> #     Event code 5 ((null))
> #     Event code 6 ((null))
> #     Event code 7 ((null))
> #     Event code 8 ((null))
> #     Event code 9 ((null))
> #     Event code 10 ((null))
> #     Event code 11 ((null))
> #     Event code 12 ((null))
> #     Event code 13 ((null))
> #     Event code 14 ((null))
> #   Event type 1 (EV_KEY)
> #     Event code 272 (BTN_LEFT)
> #     Event code 273 (BTN_RIGHT)
> #     Event code 276 (BTN_EXTRA)
> #   Event type 3 (EV_ABS)
> #     Event code 0 (ABS_X)
> #       Value    766
> #       Min        0
> #       Max     2047
> #       Fuzz       0
> #       Flat       0
> #       Resolution 0
> #     Event code 1 (ABS_Y)
> #       Value    875
> #       Min        0
> #       Max     2047
> #       Fuzz       0
> #       Flat       0
> #       Resolution 0
> #     Event code 3 (ABS_RX)
> #       Value      0
> #       Min        0
> #       Max     2047
> #       Fuzz       0
> #       Flat       0
> #       Resolution 0
> #     Event code 4 (ABS_RY)
> #       Value      0
> #       Min        0
> #       Max     2047
> #       Fuzz       0
> #       Flat       0
> #       Resolution 0
> # Properties:
> #   Property  type 1 (INPUT_PROP_DIRECT)
> N: eGalaxTouch Virtual Device for Single
> I: 0006 0eef 0010 0001
> P: 02 00 00 00 00 00 00 00
> B: 00 0b 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 13 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 01 00 00 00 00 00 00 00 00
> B: 02 00 00 00 00 00 00 00 00
> B: 03 1b 00 00 00 00 00 00 00
> B: 04 00 00 00 00 00 00 00 00
> B: 05 00 00 00 00 00 00 00 00
> B: 11 00 00 00 00 00 00 00 00
> B: 12 00 00 00 00 00 00 00 00
> B: 14 00 00 00 00 00 00 00 00
> B: 15 00 00 00 00 00 00 00 00
> B: 15 00 00 00 00 00 00 00 00
> A: 00 0 2047 0 0 0
> A: 01 0 2047 0 0 0
> A: 03 0 2047 0 0 0
> A: 04 0 2047 0 0 0
> ################################
> #      Waiting for events      #
> ################################
> E: 0.000000 0003 0000 0650    # EV_ABS / ABS_X                650
> E: 0.000000 0003 0001 1576    # EV_ABS / ABS_Y                1576
> E: 0.000000 0001 0110 0001    # EV_KEY / BTN_LEFT             1
> E: 0.000000 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.000018 0001 0110 0000    # EV_KEY / BTN_LEFT             0
> E: 0.000018 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.517999 0003 0000 1328    # EV_ABS / ABS_X                1328
> E: 0.517999 0003 0001 1461    # EV_ABS / ABS_Y                1461
> E: 0.517999 0001 0110 0001    # EV_KEY / BTN_LEFT             1
> E: 0.517999 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.518116 0001 0110 0000    # EV_KEY / BTN_LEFT             0
> E: 0.518116 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.968004 0003 0000 0788    # EV_ABS / ABS_X                788
> E: 0.968004 0003 0001 1335    # EV_ABS / ABS_Y                1335
> E: 0.968004 0001 0110 0001    # EV_KEY / BTN_LEFT             1
> E: 0.968004 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 0.968163 0001 0110 0000    # EV_KEY / BTN_LEFT             0
> E: 0.968163 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 1.405991 0003 0000 0998    # EV_ABS / ABS_X                998
> E: 1.405991 0003 0001 1254    # EV_ABS / ABS_Y                1254
> E: 1.405991 0001 0110 0001    # EV_KEY / BTN_LEFT             1
> E: 1.405991 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 1.406007 0001 0110 0000    # EV_KEY / BTN_LEFT             0
> E: 1.406007 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 2.077987 0003 0000 1097    # EV_ABS / ABS_X                1097
> E: 2.077987 0003 0001 1216    # EV_ABS / ABS_Y                1216
> E: 2.077987 0001 0110 0001    # EV_KEY / BTN_LEFT             1
> E: 2.077987 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 2.078097 0001 0110 0000    # EV_KEY / BTN_LEFT             0
> E: 2.078097 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 2.527981 0003 0000 1400    # EV_ABS / ABS_X                1400
> E: 2.527981 0003 0001 1393    # EV_ABS / ABS_Y                1393
> E: 2.527981 0001 0110 0001    # EV_KEY / BTN_LEFT             1
> E: 2.527981 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 2.527999 0001 0110 0000    # EV_KEY / BTN_LEFT             0
> E: 2.527999 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 2.879992 0003 0000 0791    # EV_ABS / ABS_X                791
> E: 2.879992 0003 0001 1276    # EV_ABS / ABS_Y                1276
> E: 2.879992 0001 0110 0001    # EV_KEY / BTN_LEFT             1
> E: 2.879992 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 2.880014 0001 0110 0000    # EV_KEY / BTN_LEFT             0
> E: 2.880014 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 3.402001 0003 0000 0890    # EV_ABS / ABS_X                890
> E: 3.402001 0003 0001 0894    # EV_ABS / ABS_Y                894
> E: 3.402001 0001 0110 0001    # EV_KEY / BTN_LEFT             1
> E: 3.402001 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> E: 3.402116 0001 0110 0000    # EV_KEY / BTN_LEFT             0
> E: 3.402116 0000 0000 0000    # ------------ SYN_REPORT (0) ----------
> linux#
> 
> -------
> 
> lsusb -v:
> 
> Bus 001 Device 003: ID 0eef:0001 D-WAV Scientific Co., Ltd eGalax
> TouchScreen
> Device Descriptor:
>   bLength                18
>   bDescriptorType         1
>   bcdUSB               1.10
>   bDeviceClass            0 (Defined at Interface level)
>   bDeviceSubClass         0
>   bDeviceProtocol         0
>   bMaxPacketSize0        64
>   idVendor           0x0eef D-WAV Scientific Co., Ltd
>   idProduct          0x0001 eGalax TouchScreen
>   bcdDevice            1.00
>   iManufacturer           1 eGalax Inc.
>   iProduct                2 USB TouchController
>   iSerial                 0
>   bNumConfigurations      1
>   Configuration Descriptor:
>     bLength                 9
>     bDescriptorType         2
>     wTotalLength           34
>     bNumInterfaces          1
>     bConfigurationValue     1
>     iConfiguration          1 eGalax Inc.
>     bmAttributes         0xa0
>       (Bus Powered)
>       Remote Wakeup
>     MaxPower              100mA
>     Interface Descriptor:
>       bLength                 9
>       bDescriptorType         4
>       bInterfaceNumber        0
>       bAlternateSetting       0
>       bNumEndpoints           1
>       bInterfaceClass         3 Human Interface Device
>       bInterfaceSubClass      0 No Subclass
>       bInterfaceProtocol      0 None
>       iInterface              0
>         HID Device Descriptor:
>           bLength                 9
>           bDescriptorType        33
>           bcdHID               2.10
>           bCountryCode            0 Not supported
>           bNumDescriptors         1
>           bDescriptorType        34 Report
>           wDescriptorLength     141
>          Report Descriptors:
>            ** UNAVAILABLE **
>       Endpoint Descriptor:
>         bLength                 7
>         bDescriptorType         5
>         bEndpointAddress     0x81  EP 1 IN
>         bmAttributes            3
>           Transfer Type            Interrupt
>           Synch Type               None
>           Usage Type               Data
>         wMaxPacketSize     0x0008  1x 8 bytes
>         bInterval               3
> Device Status:     0x0000
>   (Bus Powered)

-- 
WBR
Vladimir Kondratyev


--------------98DBBA9ACAC8556429D80CE7
Content-Type: text/x-patch; charset=UTF-8;
 name="hpen.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
 filename="hpen.patch"

diff --git a/sys/dev/hid/hidbus.c b/sys/dev/hid/hidbus.c
index 58d19a2a4d7..69f3d391163 100644
--- a/sys/dev/hid/hidbus.c
+++ b/sys/dev/hid/hidbus.c
@@ -172,6 +172,25 @@ hidbus_locate(const void *desc, hid_size_t size, int=
32_t u, enum hid_kind k,
 	return (0);
 }
=20
+bool
+hidbus_is_collection(const void *desc, hid_size_t size, int32_t usage,
+    uint8_t tlc_index)
+{
+	struct hid_data *d;
+	struct hid_item h;
+	bool ret =3D false;
+
+	d =3D hid_start_parse(desc, size, 0);
+	HIDBUS_FOREACH_ITEM(d, &h, tlc_index) {
+		if (h.kind =3D=3D hid_collection && h.usage =3D=3D usage) {
+			ret =3D true;
+			break;
+		}
+	}
+	hid_end_parse(d);
+	return (ret);
+}
+
 static device_t
 hidbus_add_child(device_t dev, u_int order, const char *name, int unit)
 {
diff --git a/sys/dev/hid/hidbus.h b/sys/dev/hid/hidbus.h
index 05911fff573..d4324a2dc39 100644
--- a/sys/dev/hid/hidbus.h
+++ b/sys/dev/hid/hidbus.h
@@ -152,6 +152,7 @@ int	hidbus_locate(const void *desc, hid_size_t size, =
int32_t u,
 	    enum hid_kind k, uint8_t tlc_index, uint8_t index,
 	    struct hid_location *loc, uint32_t *flags, uint8_t *id,
 	    struct hid_absinfo *ai);
+bool	hidbus_is_collection(const void *, hid_size_t, int32_t, uint8_t);
=20
 const struct hid_device_id *hidbus_lookup_id(device_t,
 		    const struct hid_device_id *, int);
diff --git a/sys/dev/hid/hidmap.c b/sys/dev/hid/hidmap.c
index 46e789fa7ce..d787b298b41 100644
--- a/sys/dev/hid/hidmap.c
+++ b/sys/dev/hid/hidmap.c
@@ -451,7 +451,8 @@ hidmap_probe_hid_descr(void *d_ptr, hid_size_t d_len,=
 uint8_t tlc_index,
 	bool do_free =3D false;
=20
 	if (caps =3D=3D NULL) {
-		caps =3D malloc(HIDMAP_CAPS_SZ(nitems_map), M_DEVBUF, M_WAITOK);
+		caps =3D malloc(HIDMAP_CAPS_SZ(nitems_map), M_DEVBUF,
+		    M_WAITOK | M_ZERO);
 		do_free =3D true;
 	} else
 		bzero (caps, HIDMAP_CAPS_SZ(nitems_map));
@@ -481,7 +482,10 @@ hidmap_probe_hid_descr(void *d_ptr, hid_size_t d_len=
, uint8_t tlc_index,
 	/* Check that all mandatory usages are present in report descriptor */
 	if (items !=3D 0) {
 		for (i =3D 0; i < nitems_map; i++) {
-			if (map[i].required && isclr(caps, i)) {
+			KASSERT(!(map[i].required && map[i].forbidden),
+			    ("both required & forbidden item flags are set"));
+			if ((map[i].required && isclr(caps, i)) ||
+			    (map[i].forbidden && isset(caps, i))) {
 				items =3D 0;
 				break;
 			}
diff --git a/sys/dev/hid/hidmap.h b/sys/dev/hid/hidmap.h
index 6ac23b3dc4e..62888109263 100644
--- a/sys/dev/hid/hidmap.h
+++ b/sys/dev/hid/hidmap.h
@@ -62,6 +62,8 @@ typedef int hidmap_cb_t(HIDMAP_CB_ARGS);
 /* These helpers can be used at any stage of any callbacks */
 #define	HIDMAP_CB_GET_STATE(...)					\
 	((hm =3D=3D NULL) ? HIDMAP_CB_IS_PROBING : hm->cb_state)
+#define	HIDMAP_CB_GET_DEV(...)						\
+	(hm =3D=3D NULL ? NULL : hm->dev)
 #define	HIDMAP_CB_GET_SOFTC(...)					\
 	(hm =3D=3D NULL ? NULL : device_get_softc(hm->dev))
 #define	HIDMAP_CB_GET_EVDEV(...)					\
@@ -98,7 +100,8 @@ struct hidmap_item {
 	bool			has_cb:1;
 	bool			final_cb:1;
 	bool			invert_value:1;
-	u_int			reserved:10;
+	bool			forbidden:1;	/* Forbidden by driver */
+	u_int			reserved:9;
 };
=20
 #define	HIDMAP_ANY(_page, _usage, _type, _code)				\
diff --git a/sys/dev/hid/hms.c b/sys/dev/hid/hms.c
index 94267b3fcd5..0f60eec86a4 100644
--- a/sys/dev/hid/hms.c
+++ b/sys/dev/hid/hms.c
@@ -109,6 +109,7 @@ static const struct hidmap_item hms_map_wheel_rev[] =3D=
 {
=20
 /* A match on these entries will load hms */
 static const struct hid_device_id hms_devs[] =3D {
+	{ HID_TLC(HUP_GENERIC_DESKTOP, HUG_POINTER) },
 	{ HID_TLC(HUP_GENERIC_DESKTOP, HUG_MOUSE) },
 };
=20
diff --git a/sys/dev/hid/hpen.c b/sys/dev/hid/hpen.c
index 1d505e14089..8a86b95b102 100644
--- a/sys/dev/hid/hpen.c
+++ b/sys/dev/hid/hpen.c
@@ -72,44 +72,43 @@ static hidmap_cb_t	hpen_final_pen_cb;
 	HIDMAP_ABS_CB(HUP_DIGITIZERS, HUD_##usage, &cb)
=20
 /* Generic map digitizer page map according to hut1_12v2.pdf */
-static const struct hidmap_item hpen_map_digi[] =3D {
+static const struct hidmap_item hpen_map_pen[] =3D {
     { HPEN_MAP_ABS_GD(X,		ABS_X),		  .required =3D true },
     { HPEN_MAP_ABS_GD(Y,		ABS_Y),		  .required =3D true },
     { HPEN_MAP_ABS(   TIP_PRESSURE,	ABS_PRESSURE) },
     { HPEN_MAP_ABS(   X_TILT,		ABS_TILT_X) },
     { HPEN_MAP_ABS(   Y_TILT,		ABS_TILT_Y) },
+    { HPEN_MAP_ABS(   CONTACTID,	0), 		  .forbidden =3D true },
+    { HPEN_MAP_ABS(   CONTACTCOUNT,	0), 		  .forbidden =3D true },
     { HPEN_MAP_ABS_CB(BATTERY_STRENGTH,	hpen_battery_strenght_cb) },
     { HPEN_MAP_BUT(   TOUCH,		BTN_TOUCH) },
     { HPEN_MAP_BUT(   TIP_SWITCH,	BTN_TOUCH) },
     { HPEN_MAP_BUT(   SEC_TIP_SWITCH,	BTN_TOUCH) },
-    { HPEN_MAP_BUT(   IN_RANGE,		BTN_TOOL_PEN) },
     { HPEN_MAP_BUT(   BARREL_SWITCH,	BTN_STYLUS) },
     { HPEN_MAP_BUT(   INVERT,		BTN_TOOL_RUBBER) },
     { HPEN_MAP_BUT(   ERASER,		BTN_TOUCH) },
     { HPEN_MAP_BUT(   TABLET_PICK,	BTN_STYLUS2) },
     { HPEN_MAP_BUT(   SEC_BARREL_SWITCH,BTN_STYLUS2) },
-    { HIDMAP_FINAL_CB(			&hpen_final_digi_cb) },
+    { HIDMAP_FINAL_CB(			&hpen_final_pen_cb) },
 };
=20
-/* Microsoft-standardized pen support */
-static const struct hidmap_item hpen_map_pen[] =3D {
-    { HPEN_MAP_ABS_GD(X,		ABS_X),		  .required =3D true },
-    { HPEN_MAP_ABS_GD(Y,		ABS_Y),		  .required =3D true },
-    { HPEN_MAP_ABS(   TIP_PRESSURE,	ABS_PRESSURE),	  .required =3D true =
},
-    { HPEN_MAP_ABS(   X_TILT,		ABS_TILT_X) },
-    { HPEN_MAP_ABS(   Y_TILT,		ABS_TILT_Y) },
-    { HPEN_MAP_ABS_CB(BATTERY_STRENGTH,	hpen_battery_strenght_cb) },
-    { HPEN_MAP_BUT(   TIP_SWITCH,	BTN_TOUCH),	  .required =3D true },
-    { HPEN_MAP_BUT(   IN_RANGE,		BTN_TOOL_PEN),	  .required =3D true },
-    { HPEN_MAP_BUT(   BARREL_SWITCH,	BTN_STYLUS) },
-    { HPEN_MAP_BUT(   INVERT,		BTN_TOOL_RUBBER), .required =3D true },
-    { HPEN_MAP_BUT(   ERASER,		BTN_TOUCH),	  .required =3D true },
-    { HIDMAP_FINAL_CB(			&hpen_final_pen_cb) },
+static const struct hidmap_item hpen_map_stylus[] =3D {
+    { HPEN_MAP_BUT(   IN_RANGE,		BTN_TOOL_PEN) },
+};
+static const struct hidmap_item hpen_map_finger[] =3D {
+    { HPEN_MAP_BUT(   IN_RANGE,		BTN_TOOL_FINGER) },
 };
=20
 static const struct hid_device_id hpen_devs[] =3D {
 	{ HID_TLC(HUP_DIGITIZERS, HUD_DIGITIZER) },
 	{ HID_TLC(HUP_DIGITIZERS, HUD_PEN) },
+	{ HID_TLC(HUP_DIGITIZERS, HUD_TOUCHSCREEN),
+	  HID_BVP(BUS_USB, USB_VENDOR_EGALAX, USB_PRODUCT_EGALAX_TPANEL) },
+};
+
+/* Do not autoload legacy pen driver for all touchscreen */
+static const struct hid_device_id hpen_devs_no_load[] =3D {
+	{ HID_TLC(HUP_DIGITIZERS, HUD_TOUCHSCREEN) },
 };
=20
 static int
@@ -134,25 +133,18 @@ hpen_battery_strenght_cb(HIDMAP_CB_ARGS)
 	return (0);
 }
=20
-static int
-hpen_final_digi_cb(HIDMAP_CB_ARGS)
-{
-	struct evdev_dev *evdev =3D HIDMAP_CB_GET_EVDEV();
-
-	if (HIDMAP_CB_GET_STATE() =3D=3D HIDMAP_CB_IS_ATTACHING)
-		evdev_support_prop(evdev, INPUT_PROP_POINTER);
-
-	/* Do not execute callback at interrupt handler and detach */
-	return (ENOSYS);
-}
-
 static int
 hpen_final_pen_cb(HIDMAP_CB_ARGS)
 {
 	struct evdev_dev *evdev =3D HIDMAP_CB_GET_EVDEV();
=20
-	if (HIDMAP_CB_GET_STATE() =3D=3D HIDMAP_CB_IS_ATTACHING)
-		evdev_support_prop(evdev, INPUT_PROP_DIRECT);
+	if (HIDMAP_CB_GET_STATE() =3D=3D HIDMAP_CB_IS_ATTACHING) {
+		if (hidbus_get_usage(HIDMAP_CB_GET_DEV()) =3D=3D
+		    HID_USAGE2(HUP_DIGITIZERS, HUD_DIGITIZER))
+			evdev_support_prop(evdev, INPUT_PROP_POINTER);
+		else
+			evdev_support_prop(evdev, INPUT_PROP_DIRECT);
+	}
=20
 	/* Do not execute callback at interrupt handler and detach */
 	return (ENOSYS);
@@ -185,24 +177,39 @@ static int
 hpen_probe(device_t dev)
 {
 	struct hidmap *hm =3D device_get_softc(dev);
+	const char *desc;
+	void *d_ptr;
+	hid_size_t d_len;
 	int error;
-	bool is_pen;
=20
-	error =3D HIDBUS_LOOKUP_DRIVER_INFO(dev, hpen_devs);
-	if (error !=3D 0)
-		return (error);
+	if (HIDBUS_LOOKUP_DRIVER_INFO(dev, hpen_devs_no_load) !=3D 0) {
+		error =3D HIDBUS_LOOKUP_DRIVER_INFO(dev, hpen_devs);
+		if (error !=3D 0)
+			return (error);
+	}
=20
 	hidmap_set_dev(hm, dev);
=20
-	/* Check if report descriptor belongs to a HID tablet device */
-	is_pen =3D hidbus_get_usage(dev) =3D=3D HID_USAGE2(HUP_DIGITIZERS, HUD_=
PEN);
-	error =3D is_pen
-	    ? HIDMAP_ADD_MAP(hm, hpen_map_pen, NULL)
-	    : HIDMAP_ADD_MAP(hm, hpen_map_digi, NULL);
+	/* Check if report descriptor belongs to a HID pen device */
+	error =3D HIDMAP_ADD_MAP(hm, hpen_map_pen, NULL);
 	if (error !=3D 0)
 		return (error);
=20
-	hidbus_set_desc(dev, is_pen ? "Pen" : "Digitizer");
+	if (hid_get_report_descr(dev, &d_ptr, &d_len) !=3D 0)
+		return (ENXIO);
+
+	if (hidbus_is_collection(d_ptr, d_len,
+	    HID_USAGE2(HUP_DIGITIZERS, HUD_FINGER), hidbus_get_index(dev))) {
+		HIDMAP_ADD_MAP(hm, hpen_map_finger, NULL);
+		desc =3D "TouchScreen";
+	} else {
+		HIDMAP_ADD_MAP(hm, hpen_map_stylus, NULL);
+		desc =3D "Pen";
+	}
+	if (hidbus_get_usage(dev) =3D=3D HID_USAGE2(HUP_DIGITIZERS, HUD_DIGITIZ=
ER))
+		desc =3D "Digitizer";
+
+	hidbus_set_desc(dev, desc);
=20
 	return (BUS_PROBE_DEFAULT);
 }

--------------98DBBA9ACAC8556429D80CE7
Content-Type: text/x-csrc; charset=UTF-8;
 name="setrdesc.c"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
 filename="setrdesc.c"

#include <sys/ioctl.h>

#include <errno.h>
#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <dev/hid/hidraw.h>

static char rdesc[] =3D {
0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
0x09, 0x01,        // Usage (Pointer)
0xA1, 0x01,        // Collection (Application)
0x85, 0x01,        //   Report ID (1)
0x09, 0x01,        //   Usage (Pointer)
0xA1, 0x00,        //   Collection (Physical)
0x05, 0x09,        //     Usage Page (Button)
0x19, 0x01,        //     Usage Minimum (0x01)
0x29, 0x02,        //     Usage Maximum (0x02)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x01,        //     Logical Maximum (1)
0x95, 0x02,        //     Report Count (2)
0x75, 0x01,        //     Report Size (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred St=
ate,No Null Position)
0x95, 0x01,        //     Report Count (1)
0x75, 0x06,        //     Report Size (6)
0x81, 0x01,        //     Input (Const,Array,Abs,No Wrap,Linear,Preferred=
 State,No Null Position)
0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
0x09, 0x30,        //     Usage (X)
0x09, 0x31,        //     Usage (Y)
0x16, 0x2A, 0x00,  //     Logical Minimum (42)
0x26, 0xBD, 0x07,  //     Logical Maximum (1981)
0x36, 0x00, 0x00,  //     Physical Minimum (0)
0x46, 0xFF, 0x0F,  //     Physical Maximum (4095)
0x66, 0x00, 0x00,  //     Unit (None)
0x75, 0x10,        //     Report Size (16)
0x95, 0x02,        //     Report Count (2)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred St=
ate,No Null Position)
0xC0,              //   End Collection
0xC0,              // End Collection
0x05, 0x0D,        // Usage Page (Digitizer)
0x09, 0x04,        // Usage (Touch Screen)
0xA1, 0x01,        // Collection (Application)
0x85, 0x02,        //   Report ID (2)
0x09, 0x20,        //   Usage (Stylus)
0xA1, 0x00,        //   Collection (Physical)
0x09, 0x42,        //     Usage (Tip Switch)
0x09, 0x32,        //     Usage (In Range)
0x15, 0x00,        //     Logical Minimum (0)
0x25, 0x01,        //     Logical Maximum (1)
0x95, 0x02,        //     Report Count (2)
0x75, 0x01,        //     Report Size (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred St=
ate,No Null Position)
0x95, 0x06,        //     Report Count (6)
0x75, 0x01,        //     Report Size (1)
0x81, 0x03,        //     Input (Const,Var,Abs,No Wrap,Linear,Preferred S=
tate,No Null Position)
0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
0x09, 0x30,        //     Usage (X)
0x75, 0x10,        //     Report Size (16)
0x95, 0x01,        //     Report Count (1)
0xA4,              //     Push
0x55, 0x00,        //       Unit Exponent (0)
0x65, 0x00,        //       Unit (None)
0x36, 0x00, 0x00,  //       Physical Minimum (0)
0x46, 0x00, 0x00,  //       Physical Maximum (0)
0x16, 0x1E, 0x00,  //       Logical Minimum (30)
0x26, 0xC8, 0x0F,  //       Logical Maximum (4040)
0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred =
State,No Null Position)
0x09, 0x31,        //       Usage (Y)
0x16, 0x3C, 0x00,  //       Logical Minimum (60)
0x26, 0xC3, 0x0F,  //       Logical Maximum (4035)
0x36, 0x00, 0x00,  //       Physical Minimum (0)
0x46, 0x00, 0x00,  //       Physical Maximum (0)
0x81, 0x02,        //       Input (Data,Var,Abs,No Wrap,Linear,Preferred =
State,No Null Position)
0xB4,              //     Pop
0xC0,              //   End Collection
0xC0,              // End Collection
};

int
main(int argc, char *argv[])
{
	static const struct hidraw_gen_descriptor hd =3D {
		.hgd_data =3D rdesc,
		.hgd_maxlen =3D sizeof(rdesc),
	};
	int fd, res;
	char *cdev;

	cdev =3D argc > 1 ? argv[1] : "/dev/hidraw0";

	fd =3D open(cdev, O_WRONLY);
	if (fd < 0) {
		perror("open failed");
		exit(1);
	}
	res =3D ioctl(fd, HIDRAW_SET_REPORT_DESC, &hd);
	close(fd);
	if (res < 0) {
		perror("ioctl failed");
		exit(1);
	}

	return(0);
}

--------------98DBBA9ACAC8556429D80CE7--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1c3ebd54-3686-ff5f-d5be-5a42ddcd5469>