"Злые шаманы", часть первая, - "Один долбаный палец!"
Борьба за touch-screen...
Как много вижу я сообщений во всех форумах всех стран, от братского китая до злостной пиндостании - "не работает тач! помогите!".
Это повторяется раз за разом, из года в год, и для "ведроида", и для Linux. И нигде нет внятной, вменяемой инструкции о том, как же этот самый "тач" заставить работать. Часть инструкций ориентирована на конкретные дистрибутивы, и, зачастую, - неактуальна. Часть информации давно и безвозвратно устарела, часть вобще неприменима. Так что же делать?
Начнем, как обычно, с нашей любимой платформы: Allwinner. И с традиционной фразы: "друзья, у нас всё плохо".
Нет, у нас-то всё как раз не очень плохо, хотя могло бы быть значительно лучше.
Первая проблема, которая встаёт перед каждым профи, "переезжающим на планшет" - необходимость поиска этого самого долбаного драйвера тач-скрина. Где его искать, - это понятно. Поисковые системы, "гитхаб" и любительские форумы.
Допустим, Вам повезло - ваш тач-скрин - один из списка: gt801/gt811/gt818/ilitek_aimv3/st1232/ft5201 - если это так, то Вам крупно повезло, и можно дальше не читать, а использовать драйвер из стандартной поставки ядра и не знать никакого горя с ним.
Гораздо чаще случается, что у Вас в руках оказывается непонятная железяка с непонятным ведроидом и непонятным набором железок внтури. Начать стоит с изучения script.bin, сконвертив его предварительно # bin2fex script.bin >YourTabletName-script.fex
соответствующей командой из комплекта пакета sunxi-tools.
В этом файле зарыты практически все данные по вашей железяке, однако, нужно знать - что искать.
Так как нашей задачей является "поднять тач-скрин", а он у вас, наверняка, ёмкостный - сразу же в полученном fex-файле ищем секцию r - это параметры вашего тачскрина.
Если вы видите в этой секции что-то подобное
[ctp_para]
ctp_used = 1
ctp_name = "ft5x_ts"
ctp_twi_id = 2
ctp_twi_addr = 0x38
ctp_screen_max_x = 800
ctp_screen_max_y = 480
ctp_revert_x_flag = 1
ctp_revert_y_flag = 1
ctp_exchange_x_y_flag = 0
ctp_int_port = port:PH21<6><default><default><default>
ctp_wakeup = port:PB13<1><default><default><1>
ctp_io_port = port:PH21<0><default><default><default>
то задача по поиску драйвера здорово упрощается. Гораздо чаще вы увидите там куда более прискорбную картинку, например такую:
[ctp_para]
ctp_boxchip_type = 2579
ctp_twi_id = 1
ctp_used = 1
ctp_name = "ft5x_ts"
ctp_twi_addr = 0x38
ctp1_used = 1
ctp1_name = "Goodix-TS"
ctp1_twi_addr = 85
ctp2_used = 1
ctp2_name = "ssd253x-ts"
ctp2_twi_addr = 72
ctp2_ssd_type = 4302
ctp4_used = 1
ctp4_name = "zet622x-ts"
ctp4_twi_addr = 118
ctp5_used = 1
ctp5_name = "byd693x-ts"
ctp5_twi_addr = 82
cpt_screen_rotate = 0
ctp_screen_max_x = 480
ctp_screen_max_y = 272
ctp_revert_x_flag = 0
ctp_revert_y_flag = 0
ctp_exchange_x_y_flag = 0
ctp_havekey = 1
ctp_int_port = port:PG11<6><default><default><default>
ctp_wakeup = port:PB03<1><default><default><1>
ctp_io_port = port:PG11<6><default><default><default>
-- и вот это уже называется родным словом "ЖОПА".
Как легко видеть - есть некий идентификатор тачскрина ctp_boxchip_type = 2579, а дальше идет набор различных ctp*_used, и все они, 6^%дb!, выставлены в 1! То есть - в ведроиде присутствует некий универсальный драйвер-посредник, который выставляет некие параметры для ctp_boxchip_type = 2579 и загружает соответствующий драйвер из списка используемых.
Поведение ведра в этой ситуации нам совершенно неинтересно, нам нужно сделать так, чтобы это работало в родном linux'е.
Далее начинается квест (иногда - не на один день).
-
Первым делом нам нужно определить - так что же за устройство у нас-таки используется в качестве детектора касаний. Здесь есть два пути: - сложный - начинать ковыряться в системе при помощи i2cdetect и i2cdump, однако результат в данном случае может быть сложным и муторным - я его не рекомендую, хотя иногда этот путь и работает; - второй - очевидный - открыть этот долбаный китайский корпус при помощи отвертки, старой рекламной кредитки (с привлечением известной всем матери) - снять наклеенный милыми желтолицими братьями тряпичный или виниловый скотч с более узкого разъема, идущего от платы куда-то под модуль дисплея - и увидеть глазами этот самый чип (глаза здесь - слабый помощник, лучше воспользоваться цифровым фотоаппаратом, желательно - с хорошими линзами и наличием макро, в крайнем случае - хорошей лупой и хорошим боковым светом). Второй путь всегда гарантирует точное попадание "в точку" и позволяет сфокусироваться непосредственно на программной части, не тратя долгие часы на выяснение косвенных признаков присутствия в системе той или иной микросхемы тач-скрина (которые не всегда удаётся обнаружить, поскольку некоторые драйверы предварительно включают чип, после чего он может быть обнаружен, а до этого - даже точно зная его адрес на i2c шине - вы ничего не увидите).
-
Затем, нам нужно найти драйвер для обнаруженного чипа. В ранних allwinner'ах часто встречались goodix или focaltech чипы, в современных же устройствах Вы можете встретить зоопарк из всяких gslX680, ilitek, Gt9xx или SSD253x.
ВНИМАНИЕ! Даже если Вам повезло, и Вы-таки нашли подходящий драйвер - это не означает, что ваш квест завершен! Едем дальше...
- Следующим этапом нам придется проинициализировать чип при помощи драйвера. Зачастую это далеко нетривиальная задача: нужно дерево исходников ядра, поверх которого будет собран драйвер. Для полной совместимости с Вашей системой. Ваш драйвер успешно собран, всё прошло без осложнений (так не бывает, но всё же...) и пришло время сделать insmod на целевом устройстве...
"Золушок, вот тебе волшебный рашпиль, сделаешь себе шрам через всё лицо!.." (c) древний КВН
- ...Core dumped... Module is not loaded... и прочие радостные сообщения - в логе, в консоли, откуда Вы ставите драйвер... Радостно, сил нет! - Это означает только одно - Ваш драйвер не был корректно инициализирован. Следует разбираться с потрохами драйвера или найти другой, который хотя бы "встанет" без ошибок и будет висеть в системе...
- ...Полная тишина в консоли, но ругань в логе - драйвер был загружен, но по какой-то причине не смог корректно инициализировать чип тач-скрина: драйвер требует "доводки рашпилем", этот момент мы тоже пока отставим в сторону...
- ...Полная тишина в консоли, особой ругани в логе нет, устройство /dev/input/eventX создано, - можно тыкать в экран пальцами и смотреть вывод команды evtest. В крайнем случае - cat /dev/input/eventX, если evtest недоступен.
- ...Вам повезло, и evtest вывел параметры тача, однако не получает никаких событий при тычке в экран - у Вас в чип загружена неподходящая firmware, - об этм мы поговорим чуть ниже.
- ...Вам повезло, и evtest вывел параметры тача, при тычке пальцем в экран выводит какие-то события, - можно смотреть - какие, и разбираться с настройками драйвера и/или калибратора Xorg. Полдела сделано.
- ...Вам крупно повезло, evtest выводит корректные координаты при тычке пальцем в экран, - можно переходитьнепосредственно к настройке Xorg...
Дальше мы будем разбираться - что и как нам делать теперь, чтобы получить рабочий тачскрин в системе.
- Итак, evtest показал вам какие-то данные, приходящие с тачскрина. Допустим, что успех был Вами достигнут при помощи драйвера gslX680, который вы где-то взяли.
- gslX680 - очень популярный (и один из самых сложных в настройке) чипов, используемых в китайских устройствах. Именно поэтому - на его примере мы будем выстраивать алгоритмику наших действий и учиться "ломать китайцев" для работы под Linux
Далее мы проверяем три вещи:
-
корректность предоставляемых драйвером координат: при запущеном evtest, натравленном на /dev/input/eventX, - касаемся экрана, и проверяем, что мы видим что-то похожее на это:
Event: time 1377032989.427036, type 3 (EV_ABS), code 0 (ABS_X), value 171
Event: time 1377032989.427039, type 3 (EV_ABS), code 1 (ABS_Y), value 225
Event: time 1377032989.427044, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 3
Event: time 1377032989.427044, type 3 (EV_ABS), code 57 (ABS_MT_TRACKING_ID), value 3
Event: time 1377032989.427047, type 3 (EV_ABS), code 48 (ABS_MT_TOUCH_MAJOR), value 10
Event: time 1377032989.427050, type 3 (EV_ABS), code 53 (ABS_MT_POSITION_X), value 171
Event: time 1377032989.427054, type 3 (EV_ABS), code 54 (ABS_MT_POSITION_Y), value 225
Event: time 1377032989.427057, type 3 (EV_ABS), code 50 (ABS_MT_WIDTH_MAJOR), value 1
-- если мы не видим BTN_TOUCH/ABS_MT_TOUCH_MAJOR и ABS_X/ABS_Y - с высокой долей вероятности драйвер не будет распознан evinput-модулем xorg, - требуется разобраться в коде драйвера и добавить соответствующие события.
-
равномерность получаемых координат: при движении пальца от левого края экрана к правому - координата X относительно равномерно изменяется, а не скачет, как наскипидаренная блоха
- gslX680 - достаточно гибкая микросхема, и это её проблема - она может сканировать ёмкостный экран с различной последовательностью опроса линий. Это определяется используемой firmware, которая настраивает микросхему на определенный алгоритм назначения координат адресным линиям. Если X-координата "скачет" - нужно попробовать подобрать работающую firmware, или (да поможет вам святой коннектий!) изменить имеющуюся firmware под ваш чип (эта задача даааалеко нетривиальная). Также точно следует проверить Y-координату. Убедиться, что при касаниях экрана по обеим осям (X,Y), - нет "мертвых зон" - мест, откуда не передаются никакие координаты. Если такие зоны есть - это означает, что адресация сканируемых линий в этом месте также не определена, либо - некорректна. Это также требует работы с firmware драйвера. (Мы точно знаем, что этот самый тач-скрин чётко и понятно работает в ведроиде)
- координаты углов экрана. В случае, если предыдущие два пункта проверены, и результат однозначно удовлетворительный - мы выясняем угловые координаты экрана. Это необходимо, для того, чтобы xorg автоматически пересчитывал координаты касаний в координаты изображения на экране. Допустим, Вы выяснили, что углы у вас имеют координаты 1:1 и 3073:4097 соответственно (X:Y, - верхний левый и нижний правый угол в этом примере) Нам нужно создать файл 99-calibration.conf
Section "InputClass"
Identifier "calibration"
MatchProduct "gslX680"
Option "Calibration" "1 3073 1 4097"
EndSection
а затем - разместить этот файл в каталоге /etc/X11/xorg.conf.d на целевом устройстве. Далее - запускаем, или перезапускаем xorg (в XADADA Linux дефолтной поставки достаточно "прибить|кильнуть|замочить" процесс dwm - и иксы сами перезапустятся [хвала autox!]) и радуемся рабочему touch-screen.
WARNING! Для некоторых драйверов придется настроить соответственно FEX-файл вашего устройства! Исчерпывающие данные по данному вопросу вы можете получить из FEX GUIDE.
- Если что-то не работает, работает не так, как надо, или имеет проблемы - нужно тюнинговать драйвер и настраивать FEX.
Исходники драйверов тач-скринов, которые я собрал, проверил и "замучил" до рабочего (или "относительно рабочего") состояния, можно взять по этим ссылкам:
- gslx680 <- включена куча firmware для разных типов опроса экрана, самый популярный вариант - k70, подробности найдёте в коде драйвера...
- gt801_2plus1 <- трехчиповый вариант goodix touch, редкостное.... поделие... однако этот драйвер обычно работает как часы. Пока сами микросхемы не умирают от статики или старости...
- gt9xx <- приятный и понятный драйвер GT9xx, - будет работать практически везде, где есть эта микросхема, доработок практически не потребует.
- ilitek_aimvF <- редкостное Г. глючное, тупое, однако - хоть как-то работающее с экзотическими ilitek чипами...
- ssd2533 <- самый гадостный из всех изученных. Чип генерирует кучу "отрицательных событий", с которыми приходится бороться в коде драйвера...
** Всё вышеописанное - теория, описывающая шаги, которые Вам придётся пройти, если Вы действительно захотите получить работающий touch screen на своём Allwinner, а "из коробки" готового драйвера тача под рукой не окажется. **
** Шаги эти, прямо скажем, - мучительные, утомительные, зачастую - нудные и неинтересные... И в них вобще не было бы никакой нужды, соблюдай
производителипродавцы устройств все пункты GPL-лицензии. **
- По всем дополнительным вопросам - форма для комментариев - под данной "портянкой".
Удачи, злые шаманы! Она вам понадобится! ~>8-EЭ
2016-05-20 15-00
Комментарии [2] ::