the previous method was removed from the docs because it was outdated and didn't work anymore this method is working for me in debian 12 bookworm
215 lines
6.4 KiB
Markdown
215 lines
6.4 KiB
Markdown
# Touchscreen issues
|
|
|
|
If the screen is connected over USB, issues with the cable may cause similar symptoms. For that, please see [this guide](Physical_Install.md#cable-issues).
|
|
|
|
## Touch not working on RaspberryOS and derivatives
|
|
|
|
Some DSI screens have issues where touch doesn't work with the default configuration.
|
|
The current workaround/temporary fix involves changing the kernel driver module used for these displays.
|
|
|
|
Open `/boot/config.txt` for editing using `sudo nano /boot/config.txt` and change
|
|
|
|
```sh
|
|
dtoverlay=vc4-kms-v3d
|
|
```
|
|
|
|
to
|
|
|
|
```sh
|
|
dtoverlay=vc4-fkms-v3d
|
|
```
|
|
|
|
Close the nano editor using `ctrl`+`x` (exit), then `y` for yes (save).
|
|
|
|
**Reboot** to apply changes.
|
|
|
|
If that doesn't fix it, you can try commenting these lines out, resulting in:
|
|
|
|
```sh
|
|
# dtoverlay=vc4-kms-v3d
|
|
# max_framebuffers=2
|
|
```
|
|
|
|
**Reboot** to apply changes.
|
|
|
|
## Touch rotation and matrix
|
|
|
|
If the touch works but registers touch input in a different location from the input, then you may need to apply an input transformation matrix.
|
|
|
|
First you will need your device name. On a terminal, run:
|
|
|
|
```sh
|
|
DISPLAY=:0 xinput
|
|
```
|
|
|
|
Output:
|
|
|
|
```text
|
|
⎡ Virtual core pointer id=2 [master pointer (3)]
|
|
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
|
|
⎜ ↳ ADS7846 Touchscreen id=6 [slave pointer (2)]
|
|
⎣ Virtual core keyboard id=3 [master keyboard (2)]
|
|
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
|
|
```
|
|
|
|
In this case the device is the ADS7846 Touchscreen, yours may be different
|
|
|
|
You can test a change by running:
|
|
|
|
```sh
|
|
DISPLAY=:0 xinput set-prop "<device name>" 'Coordinate Transformation Matrix' <matrix>
|
|
```
|
|
|
|
Where the matrix can be one of the following options:
|
|
|
|
| Rotation | Matrix |
|
|
|-----------------------------------------|-----------------------|
|
|
| 0° | `1 0 0 0 1 0 0 0 1` |
|
|
| 90° Clockwise | `0 -1 1 1 0 0 0 0 1` |
|
|
| 90° Counter-Clockwise | `0 1 0 -1 0 1 0 0 1` |
|
|
| 180° (Inverts X and Y) | `-1 0 1 0 -1 1 0 0 1` |
|
|
| invert Y | `-1 0 1 1 1 0 0 0 1` |
|
|
| invert X | `-1 0 1 0 1 0 0 0 1` |
|
|
| expand to twice the size horizontally | `0.5 0 0 0 1 0 0 0 1` |
|
|
|
|
For more in-depth guidance on using Coordinate Transformation Matrices:
|
|
|
|
* [Ubuntu wiki InputCoordinateTransformation](https://wiki.ubuntu.com/X/InputCoordinateTransformation)
|
|
* [Libinput docs](https://wayland.freedesktop.org/libinput/doc/1.9.0/absolute_axes.html)
|
|
|
|
To make this **permanent**, modify `/etc/udev/rules.d/51-touchscreen.rules`:
|
|
|
|
```bash
|
|
sudo nano /etc/udev/rules.d/51-touchscreen.rules
|
|
```
|
|
|
|
```sh title="51-touchscreen.rules"
|
|
ACTION=="add", ATTRS{name}=="<device name>", ENV{LIBINPUT_CALIBRATION_MATRIX}="<matrix>"
|
|
```
|
|
|
|
Close the nano editor using `ctrl`+`x` (exit), then `y` for yes (save).
|
|
|
|
!!! example
|
|
|
|
Test:
|
|
|
|
```sh
|
|
DISPLAY=:0 xinput set-prop "ADS7846 Touchscreen" 'Coordinate Transformation Matrix' -1 0 1 0 -1 1 0 0 1
|
|
```
|
|
|
|
Permanent modification:
|
|
|
|
```bash
|
|
sudo nano /etc/udev/rules.d/51-touchscreen.rules
|
|
```
|
|
|
|
```sh title="51-touchscreen.rules"
|
|
ACTION=="add", ATTRS{name}=="ADS7846 Touchscreen", ENV{LIBINPUT_CALIBRATION_MATRIX}="-1 0 1 0 -1 1 0 0 1"
|
|
```
|
|
|
|
Close the nano editor using `ctrl`+`x` (exit), then `y` for yes (save).
|
|
|
|
|
|
!!! example "Alternative"
|
|
|
|
As an alternative **if the above doesn't work**:
|
|
|
|
```bash
|
|
sudo nano /usr/share/X11/xorg.conf.d/40-libinput.conf
|
|
```
|
|
|
|
```sh title="40-libinput.conf"
|
|
Section "InputClass"
|
|
Identifier "libinput touchscreen catchall"
|
|
MatchIsTouchscreen "on"
|
|
MatchDevicePath "/dev/input/event*"
|
|
Driver "libinput"
|
|
Option "TransformationMatrix" "0 -1 1 1 0 0 0 0 1"
|
|
EndSection
|
|
```
|
|
Close the nano editor using `ctrl`+`x` (exit), then `y` for yes (save).
|
|
|
|
|
|
## Touch calibration
|
|
|
|
This is optional, and you should only do it if you are having problems.
|
|
|
|
Download and build xtcal:
|
|
|
|
```sh
|
|
sudo apt-get install libxaw7-dev
|
|
cd
|
|
git clone https://github.com/KurtJacobson/xtcal
|
|
cd xtcal
|
|
make
|
|
cd ..
|
|
```
|
|
|
|
First you will need your touchscreen device name. On a terminal, run:
|
|
|
|
```sh
|
|
DISPLAY=:0 xinput
|
|
```
|
|
|
|
Output:
|
|
|
|
```text
|
|
⎡ Virtual core pointer id=2 [master pointer (3)]
|
|
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
|
|
⎜ ↳ ADS7846 Touchscreen id=6 [slave pointer (2)]
|
|
⎣ Virtual core keyboard id=3 [master keyboard (2)]
|
|
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
|
|
```
|
|
|
|
In this case the device is the ADS7846 Touchscreen, yours may be different
|
|
|
|
Reset the old calibration: (set the 0° roation matrix: 1 0 0 0 1 0 0 0 1)
|
|
```sh
|
|
DISPLAY=:0 xinput set-prop "ADS7846 Touchscreen" 'Coordinate Transformation Matrix' 1 0 0 0 1 0 0 0 1
|
|
```
|
|
Run the calibrator - if it's not fullscreen cancel with `ctrl`+`c`
|
|
```sh
|
|
DISPLAY=:0 xtcal/xtcal
|
|
```
|
|
if the previous command was not fullscreen, adjust the geometry to cover the screen, for example:
|
|
```sh
|
|
DISPLAY=:0 xtcal/xtcal -geometry 480x320
|
|
```
|
|
|
|
!!! important
|
|
KlipperScreen or a desktop environment should be on the screen to launch the calibrator
|
|
|
|
Touch the center of the crosses in order, they should turn white.
|
|
|
|

|
|
|
|
### Test the calibration
|
|
|
|
Copy the output of the calibration and test it, For example:
|
|
```sh
|
|
DISPLAY=:0 xinput set-prop "ADS7846 Touchscreen" 'Coordinate Transformation Matrix' -0.016267 -0.952804 0.978336 -1.010164 0.065333 0.998316 0 0 1
|
|
```
|
|
if it's not correct reset the matrix and run xtcal again.
|
|
|
|
### Make it permanent
|
|
Open calibration file:
|
|
```sh
|
|
sudo nano /usr/share/X11/xorg.conf.d/40-libinput.conf
|
|
```
|
|
Paste a section like this at the bottom,
|
|
replacing the transformation matrix numbers with the numbers of the calibrator output:
|
|
```sh title="40-libinput.conf"
|
|
Section "InputClass"
|
|
Identifier "libinput touchscreen catchall"
|
|
MatchIsTouchscreen "on"
|
|
MatchDevicePath "/dev/input/event*"
|
|
Driver "libinput"
|
|
Option "TransformationMatrix" "-0.016267 -0.952804 0.978336 -1.010164 0.065333 0.998316 0 0 1"
|
|
EndSection
|
|
```
|
|
Close the nano editor using `ctrl`+`x` (exit), then `y` for yes (save).
|
|
|
|
test the persistency of the settings by rebooting
|
|
```sh
|
|
sudo reboot
|
|
``` |