... BAT BLOG: posts/2016-05-20_evil-shamans-1.md
блог старой летучей мыши. /m/ /v/ /β/
   2016-05-20 20:21

“Злые шаманы”, часть первая, - “Один долбаный палец!”

Борьба за 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'е.

Далее начинается квест (иногда - не на один день).

“Золушок, вот тебе волшебный рашпиль, сделаешь себе шрам через всё лицо!..” © древний КВН

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

Далее мы проверяем три вещи:

  1. корректность предоставляемых драйвером координат: при запущеном 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, - требуется разобраться в коде драйвера и добавить соответствующие события.

  2. равномерность получаемых координат: при движении пальца от левого края экрана к правому - координата X относительно равномерно изменяется, а не скачет, как наскипидаренная блоха

    • gslX680 - достаточно гибкая микросхема, и это её проблема - она может сканировать ёмкостный экран с различной последовательностью опроса линий. Это определяется используемой firmware, которая настраивает микросхему на определенный алгоритм назначения координат адресным линиям. Если X-координата “скачет” - нужно попробовать подобрать работающую firmware, или (да поможет вам святой коннектий!) изменить имеющуюся firmware под ваш чип (эта задача даааалеко нетривиальная). Также точно следует проверить Y-координату. Убедиться, что при касаниях экрана по обеим осям (X,Y), - нет “мертвых зон” - мест, откуда не передаются никакие координаты. Если такие зоны есть - это означает, что адресация сканируемых линий в этом месте также не определена, либо - некорректна. Это также требует работы с firmware драйвера. (Мы точно знаем, что этот самый тач-скрин чётко и понятно работает в ведроиде)
  3. координаты углов экрана. В случае, если предыдущие два пункта проверены, и результат однозначно удовлетворительный - мы выясняем угловые координаты экрана. Это необходимо, для того, чтобы 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.

Исходники драйверов тач-скринов, которые я собрал, проверил и “замучил” до рабочего (или “относительно рабочего”) состояния, можно взять по этим ссылкам:

Всё вышеописанное - теория, описывающая шаги, которые Вам придётся пройти, если Вы действительно захотите получить работающий touch screen на своём Allwinner, а “из коробки” готового драйвера тача под рукой не окажется.

Шаги эти, прямо скажем, - мучительные, утомительные, зачастую - нудные и неинтересные… И в них вобще не было бы никакой нужды, соблюдай производители продавцы устройств все пункты GPL-лицензии.

Удачи, злые шаманы! Она вам понадобится! ~>8-EЭ


2016-05-20 15-00



Комментарии [1] ::
  2016-06-14 09:49
  Billy Bones
  Нужна помощь. Напиши мне в вайбер.

 Высказаться...