Android i2c 权限被拒绝

Android i2c permission denied

我开发了一个 NDK 应用程序来通过 i2c-dev 接口访问 i2c 设备。此应用程序 运行 在 Android 开发套件上运行,我们通过 i2c 连接了 MPU6050 设备。

我已经为设备设置了DT绑定,如下图

i2c@78b5000 {                                                           
    MPU6050@68 {
        compatible = "qcom, i2c-msm-v2";
        reg = <0x68>;
    };
};

并启用 i2c-1 总线——这是设备连接的 i2c 总线——通过将以下行从“禁用”更改为“正常”

 &i2c_1 {                                                                    
     status = "okay";
 };

问题是当我尝试通过 open() 在我的应用程序中打开 i2c-1 文件时

char *filename = "dev/i2c-1";
const int file = open(filename, O_RDWR);

我收到返回的权限被拒绝错误代码。

我只有一次通过以下步骤成功读取 WHO-AM-I 注册信息:

  1. 使用

    调整/dev/i2c-1文件的权限为666
    $ chmod 666 i2c-1
    
  2. 修改 ueventd.rc 文件以包含此行

    /dev/i2c-1                0666   root       root
    
  3. 终止 ueventd 进程以允许其重新加载。

    $ pgrep ueventd
    $ kill xxx
    

运行 /dev 文件夹中的 ls -la 显示 i2c-1 的权限为

crw-rw-rw- root root 

此过程的更多详细信息在此 link:Android: how to grant 666 privs to a device via ueventd.rc

应用此过程的问题是每次设备重新启动时,ueventd 文件都将恢复到原始状态并且权限会恢复。 从那以后,我尝试重复这个确切的过程,使用更改后的 files/permissions 重建启动映像并将新的启动映像闪存到设备。这似乎不起作用,因为我仍然收到相同的 "permission denied" 错误。

为了解决这个问题,我将 i2ctools 添加到系统映像中(没有库存)。当尝试 运行 i2cdetect 时,我最初的权限被拒绝,所以我遵循了上面概述的相同程序。此过程成功允许 i2ctools 访问 /dev/i2c-1 并检测到我的设备。

问题是 NDK 应用程序 - 使用 /dev/i2c-1 - 即使在应用程序后仍然返回权限被拒绝。

我可能会修改我的应用程序以使用 i2ctools,但我的想法是,如果 i2ctools 在修改权限后可以访问 i2c-1,那么我的应用程序应该能够访问 - 如果我错了请纠正我。

更新: 如果我以 root 身份 运行ning a shell,我似乎只能使用 i2ctool;这是将 i2c-1 的权限设置为全局 read/write。我也试过将 i2c-1 所在的父文件夹的权限设置为 777 - 仍然是同样的问题。

谁能告诉我我做错了什么或者我该如何停止权限被拒绝的错误?

看来问题出在 SELinux 上。虽然不是永久解决方案,但我 运行 命令

$ /system/bin/setenforce 0

从 adb shell 中,应用程序现在可以访问 i2c-1 并从设备成功读取。

一个更永久的解决方案是创建一个新的 SEPolicy 规则并将新策略设置为在启动时加载。此 post 包含有关该主题的更多信息:https://android.stackexchange.com/questions/207484/how-to-fix-selinux-avc-denied-errors-when-launching-dnscrypt-as-init-d-script/207647#207647

[更新] 我已成功将 SELinux 设置为宽容模式,并且通过编辑 BoardConfig.mk 文件并添加

行,它在重启后保持不变
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive

正在重建启动映像并将新映像刷入设备。