Значения калибровки сенсорного экрана, как это делается в Android / Kernel? - PullRequest
4 голосов
/ 17 сентября 2011

Я портирую Android Gingerbread на свою пользовательскую плату (с процессором Samsung S5PV210).У меня сенсорный экран с чипом ESC7000.Я нашел драйвер в /kernel/drivers/input/touchscreen/usbtouchscreen.c.Это почти сработало, но битовый диапазон, порядок и порядок следования байтов в пакетах USB были плохими.Я изменил код, чтобы получить правильную позицию RAW (использовал printk на консоли, чтобы увидеть его), и теперь он почти работает.Мои данные варьируются от xmin, ymin до xmax, ymax от 420 430 до 3650, 3650, в то время как в теории это должно быть от 0,0 до 4095,4095.Это неудивительно, поскольку емкостный сенсор требует калибровки.Это простая калибровка, например, y = mx + b для каждой оси (простая линейная калибровка).Я посмотрел вокруг в драйверах, и я не могу понять, где обрабатывается калибровка.Он должен быть программируемым, так как он зависит от устройства и должен быть откалиброван для каждого устройства один раз при производстве системы.Я хочу сделать это чисто, как и другие устройства Android.Кто-нибудь знает, где хранится информация о калибровке в системе Android?Где код, выполняющий расчет компенсации.Любой поиск в Интернете дает информацию о людях, желающих откалибровать свой телефон.Так что для меня это бесполезно.

1 Ответ

3 голосов
/ 21 сентября 2011

Посмотрите на следующую ветку: https://groups.google.com/forum/#!msg/rowboat/jlbwnmCIDg0/makHFil31pQJ

На EVM мы передаем калиброванные значения (или, скажем, жестко закодированные значения для разрешения Xmin / max, Ymin / max и XY) от драйвера к пользователю пространство.

Здесь обрабатываются необработанные события frameworks/base/libs/ui/InputReader.cpp

SingleTouchInputMapper::process(const RawEvent* rawEvent) будет обрабатывать необработанные события для устройства с одним касанием. ABS_X и ABS_Y - значения передается от драйвера, и это абсолютные координаты в наших дело, как я уже говорил в моей предыдущей почте.

Поправьте меня, если я не прав, afaik на телефонах Android нет механизма, чтобы сделать калибровка из пользовательского пространства. Это своего рода стандарт в Android телефоны для отправки калиброванных значений от самого драйвера.

Что я предлагаю, так это используйте tslib для калибровки и дайте ему сохранить значения в / etc / pointercal. В SingleTouchInputMapper::sync(nsecs_t when) вычислите абсолютные координаты, анализируя значения из файла / etc / pointercal.

...