How to calibrate a touchscreen device

Identifying the touch device

Install the libinput snap:

$ sudo snap install libinput

Use the libinput snap to identify the device:

$ sudo libinput.list-devices | grep "Calibration:      [^n][^/][^a]" --before 11 --after 5 | grep -v n/a
Device:           QDtech MPI7003
Kernel:           /dev/input/event12
Group:            7
Seat:             seat0, default
Capabilities:     touch 
Calibration:      identity matrix
Scroll methods:   none
Click methods:    none

From this take the “Kernel” device path:

$ udevadm info -q property /dev/input/event21 | grep -e ID_VENDOR_ID -e ID_MODEL_ID
ID_VENDOR_ID=0483
ID_MODEL_ID=5750

We will need those IDs for the udev rule. (In this case we will have ATTRS{idVendor}=="0483",ATTRS{idProduct}=="5750",.)

Generating the calibration matrix

Now calibrate the touchscreen by pressing three target spots in turn:

$ libinput.calibrate-touchscreen 
Starting the calibrate-touchscreen app: touch the target spots.
(Or press <ESC> to quit!)
Calibration = 1.008, 0.001, -0.002, -0.012, 1.003, 0.002

Setting the udev rule

We now have the information needed to calibrate the touchscreen:

echo 'ATTRS{idVendor}=="0483",ATTRS{idProduct}=="5750", ENV{LIBINPUT_CALIBRATION_MATRIX}="0 1.035 -0.021 1.007 0 -0.018"' | \
sudo tee /etc/udev/rules.d/99-QDtech-MPI7003.rules

And ensure the new rule has been processed by udev:

sudo udevadm control --reload

Verifying the updated calibration

Now replug the touchscreen and see the changes:

$ sudo libinput.list-devices | grep "Calibration:      [^n][^/][^a]" --before 11 --after 5 | grep -v n/a
Device:           QDtech MPI7003
Kernel:           /dev/input/event12
Group:            7
Seat:             seat0, default
Capabilities:     touch 
Calibration:      0.00 1.03 -0.02 1.01 0.00 -0.02
Scroll methods:   none
Click methods:    none