libinput vs evdev — тачскрин

Posted: 2017-12-26 in IT
Метки:,

Бывают случаи, когда на новых версиях системы (после крупного обновления) калибровка тачскрина через Evdev Axis Calibration не работает.
Причина — тачскрины на новых системах обслуживаются с помощью libinput, а не с помощью evdev.

Как откалибровать в этом случае тачскрин на линуксе — читаем дальше.

Параметр же «Evdev Axis Calibration» является драйвероспецифичным, и если ваш тачскрин обслуживается с помощью libinput — то и evdev-калибровка не применится. Симптомы — при движении пальцами по тачскрину курсор перемещается лишь в очень маленькой области в левом верхнем углу.

Проверяем, чем обслуживается тачскрин:

# grep -e "Using input driver " /var/log/Xorg.0.log

Видим такое:

[ 23.974] (II) Using input driver 'libinput' for 'MASTouch TouchSystems MASTouch USB Touchscreen'

Откурочивать libinput не хочется, лучше разобраться с калибровкой под этот новый драйвер (это гораздо более мягкое изменение, чем менять работающий системный драйвер на что-то иное и возможно менее поддерживаемое в текущей системе).

Сперва надо получить значения калибровочных точек (опция -v для калибратора):

xinput_calibrator --device "MASTouch TouchSystems MASTouch USB Touchscreen" -v > /var/tmp/xinput_calibr.txt

В файле мы увидим примерно следующее:

DEBUG: Adding click 0 (X=5, Y=159)
DEBUG: Adding click 1 (X=36, Y=168)
DEBUG: Adding click 2 (X=7, Y=357)
DEBUG: Adding click 3 (X=38, Y=351)

Разброс будет обязательно — идеально попасть в крохотный пиксель пальцем нереально. Нам нужны данные точек 0 и 3.

Также ниже будет рекомендация прописать параметры калибровки в /etc/hal/fdi/policy/touchscreen.fdi , но у меня этот фокус на минимизированной федоре с голыми иксами не прокатил.

Так что наш красноглазый путь — через генерацию настройки «libinput Calibration Matrix». Есть вот такая статейка: https://wiki.archlinux.org/index.php/Talk:Calibrating_Touchscreen
в которой сперва из значений разрешения экрана и данных от калибровочных точек надо вычислить четыре калибровочных коэффициента по таким формулам:

a = (6*w/8) / (x3 — x0)
c = ((w/8) — (a*x0)) / w
e = (6*h/8) / (y3 — y0)
f = ((h/8) — (e*y0)) / h

Где w и h — значения ширины и высоты экрана (1280 и 1024, например), а x0 — координата X для калибровочной точки Click-0.

Сама калибровочная матрица для тачскрина в libinput выглядит так:

[ a, 0, c ]
[ 0, e, f ]
[ 0, 0, 1 ]

То есть для калибровки задаются 4 параметра. Наиболее важны параметры a и e — они задают, на сколько надо умножить полученные от тасчкрина координаты (по обоим осям соответственно), чтобы получить координаты курсора на экране.
Применяется эта настройка вот такой командой из ~/.xinitrc:

/usr/bin/xinput set-prop "Touch-Screen-Name" "libinput Calibration Matrix" \
30.2 0 .004032 0 37.25 -0.437500 0 0 1

(строчки матрицы просто пишутся подряд)

Важные мелочи: именно set-prop, а не set-int-prop, поскольку значения в матрице калибровки — с плавающей точкой. Если курсор недостаточно синхронно двигается за пальцем, то можно немного подкрутить коэффициенты a и e, отвечающие за масштабирование координат.

Не забудьте в ~/.xserverrc временно убрать опцию -nocursor из выражения «exec X :0 …», её лучше вернуть по завершению калибровки.

Коэффициенты c и f у меня получились небольшие.

Если калибровка сделана при 1280*1024, а рабочий режим — 1024*768 (калибратор при 1024*768 не показывает все точки), то для расчёта коэффициентов надо брать именно разрешение 1280*1024, при котором работал калибратор — цифры будут ближе к истине.
Но никто не мешает посчитать и попробовать оба варианта.

При работе через SSH логинимся / su-шимся в того пользователя, под которым запущен X-сервер, и пробуем ставить параметры калибровки прямо «на горячую», без перезапусков и ребутов, вот такой командой:

env DISPLAY=":0" xinput set-int-prop "Touch-Screen-Name" "libinput Calibration Matrix" 30.25 0 0.004032 0 37.3 -0.44 0 0 1

Сразу же при этом проверяя, что курсор позиционируется где надо.

Если вычисленные параметры сработали не идеально, можно слегка подкорректировать параметры a и e с шагом примерно 0.03 — 0.05.
После подбора настроек прописываем правильные цифры в файл ~/.xinitrc для автоматического применения при старте иксов.

Такой способ калибровки тачскрина актуален для линуксовых дистрибов с софтом свежее 2015 года (федора 25 и выше точно) и насколько я понимаю, является более универсальным, чем старый метод через evdev.

Если эта заметка была вам полезна — ставьте лайки, пишите дельные комменты.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.