[BUG] HID: ELAN active stylus has wrong button behavior

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

 



Hello,

The active pen of my ELAN touchscreen does not work as intended. Every
time I press the primary stylus button it generates events,
unfortunately not the correct ones. 
Device Name: ELAN2097:00 04F3:2766

So this is the output of evtest when pressing and releasing the primary
button:
	BTN_TOOL_PEN 0
	BTN_TOOL_PEN 1
	BTN_TOOL_RUBBER 1
	(releasing)
	BTN_TOOL_PEN 0
	BTN_TOOL_RUBBER 0
	BTN_TOOL_PEN 1
whereas it should be:
	BTN_TOOL_PEN0
	BTN_TOOL_RUBBER1
	BTN_TOOL_RUBBER0
	BTN_TOOL_PEN1

So I looked into it and found my device is using the i2c_hid driver for
transport and hid-multitouch for data handling. After realising those
two should work pretty much out of the box if the corresponding device
descriptors are correct. Examining /sys/kernel/debug/hid/.../events
showed me this behavior whereas every other fields behaved correctly:

Pen is not in range:
	Digitizers.InRange = 0
	Digitizers.TipSwitch = 0
	Digitizers.Invert = 0
	Digitizers.Eraser = 0

Pen is in range but NOT touching the display:
	Digitizers.InRange = 1
	Digitizers.TipSwitch = 0
	Digitizers.Invert = 0
	Digitizers.Eraser = 0

Pen is in range AND touching the display:
	Digitizers.InRange = 1
	Digitizers.TipSwitch = 1
	Digitizers.Invert = 0
	Digitizers.Eraser = 0

Pen is in range, NOT touching the display AND primary button (eraser)
is pressed:
	Digitizers.InRange = 1
	Digitizers.TipSwitch = 0
	Digitizers.Invert = 1
	Digitizers.Eraser = 0

Pen is in range, touching the display AND primary button (eraser) is
pressed:
	Digitizers.InRange = 1
	Digitizers.TipSwitch = 0 (yes this stays 0)
	Digitizers.Invert = 0
	Digitizers.Eraser = 1

This is the extracted hid report descriptor: 
https://pastebin.com/Tva802hT

Unfortunately, my knowledge of the linux kernel and especially the
drivers are not that proficient to fix this solely by myself. However,
I would be more than happy to write some code with a bit of help.

Thanks,
Julius




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux