分享一下我学到的和经历的:
如何捕获 iio 事件的简短答案是,它取决于传感器的内核驱动程序和 Android 上的 Sensor-HAL。
首先,iio 事件由基于硬件的中断驱动;例如,当有新数据时,连接到电路板并被电路板识别的传感器上的中断引脚会向电路板发送信号。
其次,传感器管理器/服务不直接与驱动程序通信。它监听的是 Sensor-HAL。Sensor-HAL 为 Sensor Service 生成事件,而不是直接为驱动程序自身生成事件。这意味着 SensorHAL 应从 sysfs(由驱动程序创建的文件接口)读取数据并将该数据返回给 Sensor Service 调用(请参阅 poll() 、 sensor_event https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h中的结构)
最后,catchevent 仅针对定义为中断设备(如触摸屏)的设备生成的“中断事件”。Interrupt、iio 和 hwmon 是 linux 内核中基于 sw 的不同类型的设备结构。
结论:如果您有一个新的传感器并想在 Android 中从中捕获/读取数据,您应该
1 .find/ 编写具有合适设备模型的驱动程序(输入、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