似乎该问题归因于SELinux。虽然不是永久解决方案,但我运行了命令
$ /system/bin/setenforce 0
我已经开发了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注册中读取了信息:
使用/将/ dev / i2c-1文件的权限调整为666>
$ chmod 666 i2c-1
修改ueventd.rc文件以包括此行
/dev/i2c-1 0666 root root
杀死ueventd进程以使其重新加载。
$ pgrep ueventd
$ kill xxx
/ 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
似乎该问题归因于SELinux。虽然不是永久解决方案,但我运行了命令
$ /system/bin/setenforce 0