Android i2c权限被拒绝

问题描述 投票:2回答:1

我已经开发了NDK应用程序,可以通过i2c-dev界面访问i2c设备。该应用程序在Android开发套件上运行,我们已经通过i2c在其上连接了MPU6050设备。

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

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

通过将以下行从“ disabled”更改为“ okay”,并启用了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
    
  4. / dev文件夹中的ls -la运行显示为i2c-1的权限为>>

    crw-rw-rw- root root 
    

    此过程的更多详细信息,请点击以下链接:Android: how to grant 666 privs to a device via ueventd.rc

    应用此过程的问题是,每次设备重新启动时,将将ueventd文件恢复为原始状态,并还原权限。从那以后,我尝试重复此确切过程,使用更改的文件/权限重建启动映像,并将新的启动映像刷新到设备。这似乎不起作用,因为我仍然收到相同的“权限被拒绝”错误。

为了解决这个问题,我将i2ctools包含在系统映像中(没有库存)。尝试运行i2cdetect时,最初获得的权限被拒绝,因此我遵循上述相同的步骤。此过程成功允许i2ctools访问/ dev / i2c-1并检测我的设备。

问题是,即使使用该进程,使用/ dev / i2c-1的NDK应用程序仍在返回拒绝的权限。

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

更新:看来,仅当我以root用户身份运行shell时,才能使用i2ctool。这是将i2c-1的权限设置为全局读/写。我还尝试将i2c-1所在的父文件夹的权限设置为777-仍然是相同的问题。

有人可以告诉我我做错了什么,或者如何停止许可被拒绝的错误?

我已经开发了NDK应用程序,可以通过i2c-dev界面访问i2c设备。该应用程序在Android开发套件上运行,我们已通过i2c在其上连接了MPU6050设备。我是...

似乎该问题归因于SELinux。虽然不是永久解决方案,但我运行了命令

$ /system/bin/setenforce 0

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

更永久的解决方案是添加新规则并将新策略设置为在引导时加载。这篇文章包含有关该主题的更多信息:https://android.stackexchange.com/questions/207484/how-to-fix-selinux-avc-denied-errors-when-launching-dnscrypt-as-init-d-script/207647#207647

android linux linux-kernel i2c
1个回答
0
投票

似乎该问题归因于SELinux。虽然不是永久解决方案,但我运行了命令

$ /system/bin/setenforce 0
© www.soinside.com 2019 - 2024. All rights reserved.