Odys Winpad 10 Debian Linux touch problems resolved (used as KlipperScreen)

I am currently using an old Odys Winpad 10 tablet with Intel Atom SOC to control my 3D-printer setup with an Ender 3 and Klipper Screen. Since the tablet is not able to easily boot 64bit OSes (without workaround) I just fetched the latest 32bit Debian.

If you find this and want to install a 64bit OS you can follow the following instructions:

A sorta-beginner’s guide to installing Ubuntu Linux on 32-bit UEFI machines.
Update 2018 — since around Fedora 27-ish, it has natively supported 32-bit UEFI for 64 bit installs. This guide still applies for other…

I set up my Klipper+Moonraker+Mainsail+Klipperscreen config using KIAUH, which is currently my favorite 3dprinting project. It is really easy to get working and since my old Ender3 has an old 8bit MCU, offloading the work to the tablet with Klipper is really a good solution.

GitHub - th33xitus/kiauh: Klipper Installation And Update Helper
Klipper Installation And Update Helper. Contribute to th33xitus/kiauh development by creating an account on GitHub.

Now to the problem: The touch input sometimes hangs. (reboot needed)

Ofcourse if using the touchsscreen as an input for KlipperScreen to control my 3D-printer it is really anoing if the input is gone and you cannot control the printer anymore.

In the dmesg -wH log I could find entries like these:

[  +0.001792] i2c_hid i2c-FTSC1000:00: i2c_hid_get_input: incomplete report (66/65295)

To get more info on this I added the following line to my `/etc/default/grub`:

GRUB_CMDLINE_LINUX_DEFAULT="quiet i2c-hid.debug=1 hid.debug=1"

This enables a more verbose output of the hid driver. After the change I got the following:

[  +0.008855] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 4b 00 4b 00 6c 00 6c 00 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 2c 01 01
[  +0.009039] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 4b 00 4b 00 6c 00 6c 00 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 90 01 01
[  +0.008906] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 4b 00 4b 00 6c 00 6c 00 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 f4 01 01
[  +0.010036] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 4b 00 4b 00 6c 00 6c 00 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 58 02 01
[  +0.009525] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 4b 00 4b 00 6c 00 6c 00 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 bc 02 01
[  +0.009597] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 4b 00 4b 00 6c 00 6c 00 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 20 03 01
[  +0.009797] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 00 00 4b 00 4b 00 6c 00 6c 00 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 84 03 01
[  +1.288691] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 9b 04 9b 04 ae 01 ae 01 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 3e 00 01 01 00 9b 04 9b 04 ae 01 ae 01 30 00 30
[  +0.001792] i2c_hid i2c-FTSC1000:00: i2c_hid_get_input: incomplete report (66/65295)
[  +0.008895] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 9b 04 9b 04 ae 01 ae 01 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 2c 01 01
[  +0.009852] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 9b 04 9b 04 ae 01 ae 01 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 90 01 01
[  +0.009977] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 9b 04 9b 04 ae 01 ae 01 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 f4 01 01
[  +0.010379] i2c_hid i2c-FTSC1000:00: input: 3e 00 01 01 00 9b 04 9b 04 ae 01 ae 01 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 00 0f ff 0f ff 0f ff 0f ff 0f 30 00 30 00 58 02 01

After reproducing the problem a few times I noticed that the last byte of the i2c_hid i2c-FTSC1000:00: input: ........... 01  lines contains the number of detected touch inputs (1 finger in this example).

The tablet seems to be able to detect 0-4 finger inputs at once. If I add more it just toggles between 0-4.

If you check the logline directly before the error incomplete report (66/65295) you can see that 0x30 hex (48 dec) inputs were detected. i2c_hid i2c-FTSC1000:00: input: 3e ... 30.

This is ofcourse a problem of the touchscreen. Since the input report is not long enough for 48 input values the kernel module complains about mssing data i2c_hid i2c-FTSC1000:00: i2c_hid_get_input: incomplete report (66/65295)

Since  I was not able to find a fitting soultion online (most likely a kernel patch or firmware update would be needed) I created a small workaround to automatically restart the touch input.

First I created a small bash script which reloads the corresponding kernel module nano restart_touch.sh

#!/bin/bash
rmmod i2c_hid && sleep 1 && sudo modprobe i2c_hid >/dev/null 2>&1

I saved this as restart_touch.sh and gave the corresponding permissions: sudo chmod +x restart_touch.sh

Now if you run sudo ./restart_touch.sh the touch input will start working againg. But this is just part of the workaround, since you dont want to trigger this script manually every time touch stops working.

To run this automatically I used the rsyslog service, which manages logs on most debian based linux distros. It has the ability to run a command when a spcific logline is found. To activate this behaviour you have to add a line at the end of your /etc/rsyslog.conf

:msg, regex, "i2c_hid_get_input: incomplete report" ^/home/fred/restart_touch.sh

Now reboot your system.

from now on, everytime the touch input crashes with the incomplete report error message, rsyslog will trigger a reload of the i2c_hid module and touch will work again.