如何在应用程序级别和本地级别(例如从亚行外壳或通过现有的deamon)在Android本体上捕获iio传感器生成的?(例如,环境光传感器的in_intensity_falling_threshold事件)
我尝试了经典的方法: SensorManager侦听器(我为自己编写了一个测试应用程序,但也尝试了应用商店中的几个感官测试应用程序)。
然而,iio传感器似乎不会触发任何事件(尽管我可以从sysfs读取不断变化的数据)。
iio设备也会创建与Android中的输入设备相同的事件类型吗?我应该能够通过getevent命令看到事件吗?(如果需要,我可以提供更具体的系统/传感器信息。)
发布于 2017-10-24 12:08:41
让我分享我所学到的和经历的:
如何捕捉iio事件的简单答案是,它取决于传感器的内核驱动程序和Android上的传感器-HAL。
首先,iio事件由基于hw的中断驱动;例如,当有新的数据时,传感器上连接和识别的中断引脚向板发送信号。
其次,传感器管理器/服务不直接与驱动程序通信。它听到的是传感器-HAL。传感器-HAL为传感器服务生成事件,而不是驱动程序directly.That,这意味着SensorHAL应该从sysfs(由驱动程序创建的文件接口)读取数据,并将数据返回到传感器服务调用(参见轮询(),sensor_event结构在https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h中)
最后,.Interrupt、iio和hwmon是linux内核中不同类型的基于设备sw的结构,它们仅用于定义为中断设备(如触摸屏)的设备产生的“中断事件”。
结论:如果您有一个新的传感器,并且希望在Android中捕获/读取数据,您应该
1__.查找/编写具有适当设备模型的驱动程序(输入、iio、hwmon等)
2__.make板识别设备(通过向设备树或板配置添加信息)。(档案)
3__.find/write一个合适的传感器-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 https://stackoverflow.com/questions/45053521
复制相似问题