android - 如何从/dev/iio :deviceX?中读取LSM330的数据

标签 android linux linux-kernel android-sensors iio

我正在尝试将 LSM330 加速度计/陀螺仪模块连接到 i.MX6 板上。模块连接到I2C总线,设备树文件相关部分如下:

&i2c1 {
    clock-frequency = <100000>;
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_i2c1_2>;
    status = "okay";

    /* LSM330 motion detector (accelerometer) */
    lsm330_accel: lsm330_accel@0x1e {
        compatible = "st,lsm330-accel";
        st,drdy-int-pin = <1>;
        reg = <0x1e>;
    };

    /* LSM330 motion detector (gyroscope) */
    lsm330_gyro: lsm330_gyro@0x6a {
        compatible = "st,lsm330-gyro";
        st,drdy-int-pin = <2>;
        reg = <0x6a>;
    };
};

模块显示为加速度计的 /dev/iio:device0 和陀螺仪的 /dev/iio:device1。它们还显示为 /sys/bus/iio/devices/iio:device0/sys/bus/iio/devices/iio:device1。我可以通过 cat in_accel_x_raw 等获取传感器读数。但是,运行 cat/dev/iio:device0 会立即返回并且不会产生任何输出。

在网上搜索了一下,也试了下命令:

cd /sys/bus/iio/devices/iio_sysfs_trigger
echo 0 > add_trigger
cd /sys/bus/iio/devices/iio:device0
echo 1 > scan_elements/in_accel_x_en
echo 1 > scan_elements/in_accel_y_en
echo 1 > scan_elements/in_accel_z_en
echo 1 > scan_elements/in_timestamp_en
echo sysfstrig0 > trigger/current_trigger
echo 100 > buffer/length
echo 1 > buffer/enable
echo 1 > /sys/bus/iio/devices/trigger0/trigger_now

这应该设置 channel ,启用缓冲区并将一些读数放入缓冲区。据我所知,cat/dev/iio:device0 应该显示缓冲区,但它给我 Device or resource busy。使用 cat/sys/bus/iio/devices/iio:device0/in_accel_x_raw 从内核进一步读取不再有效并给出相同的错误消息。

我是 linux 内核的新手,我的目标是将传感器数据公开给 Android 系统,以便用户可以旋转屏幕等。如何让 Android 从模块获取传感器读数?

最佳答案

查看android logcat 后发现Android HAL 没有权限读取或写入sysfs 中的目录。我最终在 init.rc 文件中放置了一堆 chmod 命令,以便 Android 可以访问传感器数据。

# Change permissions for the LSM330 sysfs entries (accelerometer)
chmod 0666 /sys/bus/iio/devices/iio\:device0/sampling_frequency
chmod 0666 /sys/bus/iio/devices/iio\:device0/buffer/enable
chmod 0666 /sys/bus/iio/devices/iio\:device0/buffer/length
chmod 0666 /sys/bus/iio/devices/iio\:device0/trigger/current_trigger
chmod 0666 /sys/bus/iio/devices/iio\:device0/scan_elements/in_accel_x_en
chmod 0666 /sys/bus/iio/devices/iio\:device0/scan_elements/in_accel_y_en
chmod 0666 /sys/bus/iio/devices/iio\:device0/scan_elements/in_accel_z_en
chmod 0666 /sys/bus/iio/devices/iio\:device0/scan_elements/in_timestamp_en
chmod 0666 /dev/iio\:device0

希望这对某人有帮助。

关于android - 如何从/dev/iio :deviceX?中读取LSM330的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45221825/

相关文章:

linux - 从压缩的内核镜像中获取内核版本

Android gmail 未出现在 Nexus 设备(平板电脑和手机)上的邮件 Intent 共享列表中

Android Google Drive API 集成无法在调试 APK 上添加帐户

linux - 使用 salt-minion 管理 ESXi

file - 无法从 Linux 内核版本 4.2.3 上的内核模块打开/读取文本文件

linux - PC引导过程一步一步

java - 在方法外部使用变量值

android - 解决textview转位图时黑屏

linux - 如何检测 Bash/Shell 中 GUI 的可用性?

linux - 应该为每个应用程序进行 FIPS 自测试吗?