【问题标题】:Android IIO sensorsAndroid IIO 传感器
【发布时间】:2019-08-31 01:50:57
【问题描述】:

如何在 Android Nougat 上捕获由 iio 传感器在应用级别和本机级别(例如从 adb shell 或通过现有的守护程序)生成的iio_events? (例如环境光传感器的 in_intensity_falling_threshold 事件)

我尝试了经典方式:SensorManager Listener(我自己编写了一个测试应用程序,但也尝试了来自应用商店的几个 sensortest 应用程序)。

但是 iio 传感器似乎没有触发任何事件(尽管我可以从 sysfs 读取变化的数据)。

iio 设备是否也创建与 Android 中的输入设备相同类型的事件?我应该能够通过 getevent 命令查看事件吗? (如果需要,我可以提供更具体的系统/传感器信息。)

【问题讨论】:

    标签: events android-sensors android-7.1-nougat iio


    【解决方案1】:

    让我分享一下我所学到和经历的:

    关于如何捕获 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 设备 shell(以 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 
    

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多