Датчики Android IIO

Как я могу поймать iio_events, сгенерированный датчиками iio, на уровне приложения и на собственном уровне (например, из оболочки adb или через существующий демон) на Android Nougat? (например, событие in_intensity_falling_threshold датчика внешней освещенности)

Я попробовал классический способ: SensorManager Listener (я написал себе тестовое приложение, но также попробовал несколько приложений для сенсорных тестов из магазина приложений).

Однако кажется, что датчики iio не вызывают никаких событий (хотя я могу читать изменяющиеся данные из sysfs).

Устройства iio также создают события того же типа, что и устройства ввода в Android? Должен ли я видеть события с помощью команды getevent? (При необходимости я могу предоставить более конкретную информацию о системе/датчике.)


person Kaplan    schedule 12.07.2017    source источник


Ответы (1)


Позвольте мне поделиться тем, что я узнал и испытал:

Короткий ответ на вопрос, как перехватывать события iio, зависит от драйвера ядра сенсора и Sensor-HAL на Android.

Во-первых, событие iio вызывается аппаратным прерыванием; Контакт прерывания на датчике, подключенном к плате и распознаваемом платой, отправляет сигнал на плату, когда, например, появляются новые данные.

Во-вторых, Sensor Manager/Service не взаимодействует с драйвером напрямую. То, что он слушает, это Sensor-HAL. Sensor-HAL генерирует события для службы датчиков, а не для самого драйвера напрямую. Это означает, что SensorHAL должен считывать данные из sysfs (файловые интерфейсы, созданные драйвером) и возвращать эти данные вызовам службы датчиков (см. poll() , sensor_event структура в https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h )

Наконец, catchevent предназначен только для «событий прерывания», которые генерируются устройствами, определенными как устройство прерывания (например, сенсорный экран). Interrupt , iio и hwmon — это разные типы структур устройств на основе sw в ядре Linux.

Вывод. Если у вас есть новый датчик и вы хотите перехватывать/считывать данные с него в Android, вам следует

1. Найдите/ напишите драйвер с подходящей моделью устройства (input, iio, hwmon и т. д.)

2. заставить плату распознавать устройство (путем добавления информации в дерево устройств или файл конфигурации платы)

3. Найдите/запишите подходящий Sensor-HAL или добавьте датчик в существующий HAL.

Только после этих шагов приложение может получить данные датчика через SensorListener.

как поймать/проверить перехват событий на собственном уровне: не удается найти прямой способ перехвата событий. Общий способ доступа к данным датчика (после добавления соответствующего драйвера и получения платой распознавания устройства) заключается в использовании интерфейсов sysfs.

Например, из оболочки устройства Android (как root):

#sys/bus/iio/devices/iio:device0/ls
in_accel_x_raw   in_accel_y_raw   in_accel_z_raw   in_accel_scale ....
#cat in_accel_x_raw 
person Kaplan    schedule 24.10.2017