воскресенье, 30 июня 2013 г.

Olinuxino A13: приручаем touchscreen

Те, кто работал с одноплатным компьютером Olinuxino A13 от болгарской компании Olimex, наверняка сталкивались с проблемой настройки сенсорного экрана, установленного на готовые LCD-модули вроде A13-LCD4.3, в операционной системе Debian GNU/Linux. Решение проблемы было давно описано в официальном блоге компании, но, к сожалению, потеряло актуальность из-за обновления библиотеки tslib и драйвера xf86-input-tslib. В этой статье я расскажу, каким образом мне удалось заставить touchscreen работать.


Для начала, я решил попробовать последовать инструкции из официального блога, но в некоторых местах возникли проблемы, связанные с изменениями в файлах с исходным кодом. Я приведу полный алгоритм подготовки и сборки необходимых пакетов.

Нам понадобятся:
  • исходники tslib - берём с github командой:
    git clone https://github.com/kergoth/tslib.git
  • исходники xf86-input-tslib - берём из репозитория Debian:
    git clone git://git.debian.org/git/collab-maint/xf86-input-tslib
Теперь самое время заняться сборкой. (Все команды выполняются от имени root-а).

tslib

tslib - это библиотека, обеспечивающая доступ программ к данным с сенсорных экранов. Сама она лишь преобразует "сырые" данные с устройства и предоставляет API, но не является драйвером, например, для Xorg (для этого есть пакет xf86-input-tslib, об этом дальше).

Для большинства экранов библиотека отрабатывает корректно без изменений в исходном коде. Однако, по каким-то странным причинам, touchscreen для Olinuxino оказался исключением. Поэтому ничего не поделать - будем патчить.

Скачиваем исходный код tslib, переходим в директорию с ним:

# git clone https://github.com/kergoth/tslib.git
# cd tslib

Скачиваем патч для этой библиотеки. В файле содержится список вносимых в исходный код изменений. Применяем патч с помощью стандартной утилиты GNU/Linux:

# wget https://raw.github.com/webconn/OLINUXINO/master/SOFTWARE/A13/TOUCHSCREEN/tslib.patch
# patch -p0 < tslib.patch

Собираем и устанавливаем:

# autoreconf -vi
# ./configure --prefix=/usr
# make
# make install

После этого загрузим модуль ядра, отвечающий за обработку данных с нашего touchscreen и проверим работоспособность:

# modprobe sun4i-ts
# dmesg | grep sun4i-ts

Если всё сделано правильно, то в dmesg должны появиться записи вроде этих:

[    9.010000] sun4i-ts.c: sun4i_ts_init: start ...
[    9.020000] sun4i-ts: tp_screen_size is 5 inch.
[    9.030000] sun4i-ts: tp_regidity_level is 5.
[    9.030000] sun4i-ts: tp_press_threshold_enable is 0.
[    9.040000] sun4i-ts: rtp_sensitive_level is 15.
[    9.050000] sun4i-ts: rtp_exchange_x_y_flag is 0.
[    9.060000] sun4i-ts.c: sun4i_ts_probe: start...
[    9.080000] input: sun4i-ts as /devices/platform/sun4i-ts/input/input1
[    9.100000] sun4i-ts.c: sun4i_ts_probe: end

Выделенная цифра 1 в предпоследней строке - номер устройства ввода нашего экрана. В дальнейшем мы будем обращаться к нему как /dev/input/event1 (потребуется заменить выделенную цифру значением из вашего случая).

Для того, чтобы модуль ядра загружался автоматически при запуске системы, внесём строку в файл /etc/modules:

# echo sun4i-ts >> /etc/modules

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

Запишем конфигурацию библиотеки tslib (заменяем выделенную цифру на номер устройства экрана):

# export TSLIB_TSEVENTTYPE=raw
# export TSLIB_CONSOLEDEVICE=none
# export TSLIB_FBDEVICE=/dev/fb0
# export TSLIB_TSDEVICE=/dev/input/event1
# export TSLIB_CALIBFILE=/usr/etc/pointercal
# export TSLIB_CONFFILE=/usr/etc/ts.conf
# export TSLIB_PLUGINDIR=/usr/lib/ts

Теперь нужно настроить tslib. Открываем файл конфигурации библиотеки /usr/etc/ts.conf и раскомментируем строчку, содержащую module_raw input.

После этого библиотека должна корректно обрабатывать сигналы с touchscreen. Сразу откалибруем его и проверим.

# ts_calibrate
# ts_test

При выполнении первой команды на экране будут появляться точки, в которые нужно будет максимально точно нажать стилусом. Второй командой можно будет проверить корректность обработки событий - там можно перемещать курсор, рисовать на экране. Выход из команды проверки экрана происходить по нажатию кнопки Quit на экране, либо сочетанием клавиш Ctrl+C, если
настройка по каким-либо причинам не была корректной.

Для того, чтобы конфигурация библиотеки загружалась при запуске системы, запишем несколько строк в /etc/environment:
 
TSLIB_TSEVENTTYPE=raw
TSLIB_CONSOLEDEVICE=none
TSLIB_FBDEVICE=/dev/fb0
TSLIB_TSDEVICE=/dev/input/event1
TSLIB_CALIBFILE=/etc/pointercal
TSLIB_CONFFILE=/usr/etc/ts.conf
TSLIB_PLUGINDIR=/usr/lib/ts

Теперь осталось модифицировать и установить драйвер для Xorg.

xf86-input-tslib

xf86-input-tslib, он же xserver-xorg-input-tslib - это драйвер ввода для Xorg, использующий библиотеку tslib. Он позволяет использовать сенсорный экран в качестве устройства ввода (мыши) в оконном менеджере системы.

Драйвер почему-то достаточно давно не обновлялся, поэтому его работа с новой версией X-сервера приводила к вылету последнего из-за отсутствующей функции xf86InputSetScreen, которую драйвер пытается вызвать. Возможно, удаление этого вызова из кода было дилетантским решением (я обязательно проверю его назначение), но после этого всё заработало без видимых проблем. (Скорее всего, проблемы начались бы при мульти-дисплейной конфигурации системы.)

Вот пошаговая инструкция.

Скачиваем исходный код драйвера, переходим в его директорию.

# git clone git://git.debian.org/git/collab-maint/xf86-input-tslib
# cd xf86-input-tslib

Скачиваем и применяем необходимые патчи.

# wget https://raw.github.com/webconn/OLINUXINO/master/SOFTWARE/A13/TOUCHSCREEN/1-xf86tslib-sigfault.patch https://raw.github.com/webconn/OLINUXINO/master/SOFTWARE/A13/TOUCHSCREEN/xf86-input-tslib-port-ABI-12-r48.patch https://github.com/webconn/OLINUXINO/blob/master/SOFTWARE/A13/TOUCHSCREEN/xf86tslib-xorg-update.patch
# patch -p0 < 1-xf86tslib-sigfault.patch
# patch -p0 < xf86-input-tslib-port-ABI-12-r48.patch
# patch -p0 < xf86tslib-xorg-update.patch

Конфигурируем драйвер для установки в /usr, собираем и устанавливаем:

# ./configure --prefix=/usr
# make
# make install

Теперь описываем устройство в конфигурационном файле xorg.conf. (Лично я записал конфигурацию в /usr/share/X11/xorg.conf.d/20-ts.conf, так как в сборке Debian для Olinuxino файла /etc/X11/xorg.conf нет).

Section "InputClass"
    Identifier "Sun4i-Touchscreen"
    MatchDevicePath "/dev/input/event*"
    MatchProduct "sun4i-ts"
    Driver "tslib"
EndSection

Тем самым мы сообщаем Х-серверу, что при обнаружении устройства с названием sun4i-ts (то есть нашего touchscreen) для взаимодействия с ним нужно загрузить драйвер tslib.

Если экран уже был откалиброван, то при запуске Xorg командой

# startx

сенсорный экран должен заработать. Также работать он должен и при запуске менеджера рабочего стола (например, LightDM).

Оговорюсь, что на момент публикации на моём экземпляре Olinuxino A13 была установлена ОС Debian 7.0 (Wheezy). Последний коммит в git-репозиторий tslib был 158ee49, актуальная версия пакета xf86-input-tslib была 0.0.6.

Комментариев нет:

Отправить комментарий