Датчики Android IIO

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

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

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

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

1 ответ

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

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

Прежде всего, событие iio управляется прерыванием на основе hw; контакт прерывания на датчике, подключенном и распознанном платой, посылает сигнал плате, когда, например, появляются новые данные.

Во-вторых, Менеджер датчиков / Сервис не связывается с драйвером напрямую. То, что он слушает, это 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 
Другие вопросы по тегам