I am trying to calibrate a 3.5" pitft touchscreen on a Raspberry Pi 3 using xinput.

I have the display rotated so it uses a landscape orientation, with the power connector facing "up" so it can rest on my desk - this means a 270 degree rotation from default. The first challenge was rotating the input to match the screen orientation, which I acheived with:

xinput --set-prop 'stmpe-ts' 'Coordinate Transformation Matrix' 0 -1 1 1 0 0 0 0 1

Now I need to match my touch area to the screen area - currently it uses only the inner 80% or so, so as touches move out from center they become increasingly inaccurate, and things like a scrollbar on the screen edge are completely unreachable.

How can I adjust the command above to calibrate touch area size and offset, without losing my rotation or introducing shear, and without going back to school for a linear algebra degree?


I found this:


which talks about using xinput_calibrator to generate a transformation matrix. Unfortunately none of the scripts referenced there actually work - they don't appear to take rotation into consideration. The calibrator tool on it's own generates something like this:

Section "InputClass"
    Identifier  "calibration"
    MatchProduct    "stmpe-ts"
    Option  "MinX"  "24507"
    Option  "MaxX"  "24507"
    Option  "MinY"  "43599"
    Option  "MaxY"  "43599"
    Option  "SwapXY"    "1" # unless it was already set to 1
    Option  "InvertX"   "0"  # unless it was already set
    Option  "InvertY"   "0"  # unless it was already set

The scripts on that wiki are able to get me a matrix like this:

-144.03296703296703296703 0 52.63736263736263736263 
0 -49.08988764044943820224 33.53333333333333333333 
0 0 1

But that seems to still be a bit off, and comparing to the "simple" rotation above seems to be conspicuously missing some values.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.