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 注册信息:
使用
调整/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
此过程的更多详细信息在此 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
正在重建启动映像并将新映像刷入设备。
我开发了一个 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 注册信息:
使用
调整/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
此过程的更多详细信息在此 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
正在重建启动映像并将新映像刷入设备。