--}}
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем

Вопрос по input device подсистеме в Linux-е

Серьёзная тема
49
6
С друзьями на NN.RU
В социальных сетях
Поделиться
Collins
22.05.2017
Всем привет. Пишу драйвер для небольшого input устройства и столкнулся с проблемой, которая на первый взгляд имеет элементарное решение, но от способа решения оной зависит дизайн как драйвера, так и консьюмера event-ов. Суть проблемы: в устройстве ввода имеется несколько органов управления, которые генерируют один тип event-а, причем это не кнопки. Пусть для простоты и обобщения это будет EV_ABS. Смотрите, данный тип события может быть сгенерирован как аналаговым тригером, имеющим одну ось, так и imu, мышкой или тачпадом, работающими с несколькими осями. Примерно тоже самое применимо и к EV_REL. Все драйвера, которые просмотрел, реализуют одно устройство ввода на один тип события. А как правильно зарегистрировать устройство и посылать input events в случае, когда есть пересечение по типу event-ов между различными органами управления?

Понятно, что существует EV_MSC, куда можно впихнуть любой формат сообщений, ну и затем в консьюмере на стороне приложения разгребать эту структуру, но хотелось бы все же использовать что-то более стандартизованное и структурированное.

И еще один момент: можно было бы разбить пересекающиеся контролы на различные /dev/input/eventX, и работать с каждым из них по отдельности. Но на мой взгляд, с точки зрения дизайна это было бы еще менее правильным решением, чем использование EV_MSC, т.к. по сути устройство управления одно, а значит и регистрировать в input системе ядра следует лишь одно устройство.

PS:
* EV_REL:
- Used to describe relative axis value changes, e.g. moving the mouse 5 units
to the left.

* EV_ABS:
- Used to describe absolute axis value changes, e.g. describing the
coordinates of a touch on a touchscreen.

* EV_MSC:
- Used to describe miscellaneous input data that do not fit into other types.
Meg@VaD
22.05.2017
В след. году буду заниматься этим. Очень мало абстракции в описании. У меня будут данные счётчика на входе и сообщения об управлении на выходе, и будет фиксированный буфер, для каждого типа счётчика или состояния входа-выхода будет в нём своё заранее предопределённое место. Это пока концепция, ближе к реализации будут уточнения. Буфер обновляется всегда, с наивысшим приоритетом, даже если событий не было.
Что значит - пересекающиеся контролы - не понятно.
В общем - я к чему - расскажешь, как оно делается-то правильно :) Будет кого спросить, чувствую :)
andytolst
23.05.2017
т.е. есть некий "джойстик" который регистрирует отклониние по 2м осям от 0 до 100 (EV_ABS) и имеет Scroll Wheel который свободно крутится вперед-назад (EV_REL)

вот например нечто подобное:
github.com/torvalds/linux/bl...t/joystick/a3d.c


int axes[] = { ABS_X, ABS_Y, ABS_THROTTLE, ABS_RUDDER };
input_dev->evbit[0] |= BIT_MASK(EV_ABS) | BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);
input_dev->relbit[0] |= BIT_MASK(REL_X) | BIT_MASK(REL_Y);
input_dev->absbit[0] |= BIT_MASK(ABS_X) | BIT_MASK(ABS_Y) | BIT_MASK(ABS_THROTTLE);
...
input_report_rel(dev, REL_X, ((data[ 9] << 6) | (data[10] << 3) | data[11]) - ((data[ 9] & 4) << 7));
input_report_rel(dev, REL_Y, ((data[12] << 6) | (data[13] << 3) | data[14]) - ((data[12] & 4) << 7));
input_report_abs(dev, ABS_X, ((signed char)((data[15] << 6) | (data[16] << 3) | (data[17]))) + 128);
input_report_abs(dev, ABS_Y, ((signed char)((data[18] << 6) | (data[19] << 3) | (data[20]))) + 128);


похоже ничто не мешает так делать
Collins
23.05.2017
Спасибо, Кэп! Меня несколько выручило обилие различных осей. Для одного контрола не совсем корректно получилось, т.к. пришлось указывать ABS MultiTouch оси, хотя в действительности это никакой ни MT, т.е. притянул за уши. Добавил еще одну недостающую мне ось прямо в общем Линуксовом хидаре и необходимую мне кнопку, т.к. ни одна из существующих кнопок не подходила по смыслу. Вообще был неприятно удивлен, обнаружив в достаточно хорошо структурированном коде ядра такое месиво, причем в одной из самых простых его подсистем - input devices. В любом случае при наличии нескольких органов управления одинакового типа возникает очевидный конфлик, и если для них наиболее логичным является именно ось ABS_X/Y/Z, то нужно либо добавлять свои новые оси, либо притягивать за уши какие-либо из существующих. Допускаю, что возможно я просто что-то с первого взгляда недопонял, но это вряд ли.
andytolst
23.05.2017
да, все правильно, отдельную ось на отдельный контрол (например педали газа/тормоза это один EV_ABS инпут с 2 осями ABS_GAS и ABS_BRAKE)
если оно по смыслу похоже на мультитач, то норм (например некий коврик по которому ходят ногами и он репортит координаты каждой ноги).
если совсем что-то специфичное, то наверно лучше ABS_MISC, и там закодировать все что угодно, хоть 10 координат в одном эвенте.

новые оси конечно можно добавлять, там даже есть промежуток между ABS_VOLUME 0x20 и ABS_MISC 0x28

может еще со стороны user space посмотреть как этот инпут будет использоваться, есть ли Wayland / X11 который будет это разруливать (а там есть некая логика про multitouch), нужно ли новую кнопку заводить, или лучше замапить на существующую (чтоб юзеры могли обычную клавиатуру пользовать для отладки) и т.д.

а вообще я видел touchscreen от наших восточных друзей, который создавал 10 input девайсов, по одному на каждый палец
Collins
24.05.2017
Аккуратнее с осями для джойстика. Я сегодня одну из этих осей решил использовать в своем устройстве (ее название по смыслу было близко), в результате все регистрируемые моим драйвером устройства ввода стали иметь название js0, js1 и т.д. В качестве бесплатного бонуса появилась ругань об отсутствии данных о вендоре устройства и полный дизастер в ядре, например, перестала работать шина, по которой общаюсь с сенсорами. Я уже включил осциллоскоп, чтобы опробировать сигналы и свериться с тем, что я вижу в коде, т.к. не находил логичных объяснений происходящему, когда в голову пришла идея заменить одну из стандартных осей (кажется abs_throttle) на свою собственную. Все проблемы решились одним махом. С какого-то перепугу input система решила без моего на то ведома автоматически забайндить мое устройство к драйверам, к которым оно не имеет отношения. Вообщем это еще то месиво, все свалено в одну кучу. На мой скромный взгляд, система событий должна быть если и не полный, то как минимум ортогональной, и точно без самодеятельности вроде автоматического назначения устройства джойстиком и т.п. без явного указания на то разработчиком. Что касается 10 дивайсов по одному на каждый палец, то опять же на мой взгляд, если устройство ввода одно, то и регистрировать нужно один input device. В своем коде я поступил именно так, хотя учитывая сложность устройства и обилие контролов, соблазн зарегистрировать по одному input device-у на каждый контрол был большой.
Новая тема
Вы не можете создавать новые темы.
Т.к. вы неавторизованы на сайте. Пожалуйста назовите себя или зарегистрируйтесь.
Список тем
Последние темы форумов
Полипропилен Бален 030, ПП 250/270. Первичное сырьё Распродажа склада.

Полипропилен Бален 030, ПП 250/270. Распродажа склада. Распродажа первичных полимеров: - Красители суперконцентраты (СКП), мастербатч...
Цена: 120 руб.

Комплексная автоматизация и цифровизация бизнеса под ключ.

Добро пожаловать в новую эру автоматизации бизнеса! Поможем вашему бизнесу стать более успешным, организованным и...
Цена: 500 000 руб.

Гидравлика сервис.

Гидравлика сервис ООО на протяжении 13 лет занимается ремонтом гидронасосов, гидромоторов и гидрораспределителей. За время работы наше...

Быстровозводимые здания под ключ

Добрый день! Предлагаем Вам быстровозводимые здания для Вашего бизнеса! Мы проектируем и...
Цена: 800 000 руб.

Программист 1С НПП ПРО-М
от 110 000 руб.
Высшее образование, стаж работы 3-5 лет, полная занятость
Программист-разработчик Full-Stack ГК "Kolobox"
70000 -
100000 руб.
Высшее образование, стаж работы более 5 лет, полная занятость
Разработчик .net Profit Search
70000 -
100000 руб.
Неполное среднее образование, стаж работы 3-5 лет, полная занятость
Frontend-разработчик Profit Search
40000 -
50000 руб.
Стаж работы 3-5 лет, частичная занятость