Android i2c权限被拒绝

Android i2c权限被拒绝,android,linux,linux-kernel,i2c,Android,Linux,Linux Kernel,I2c,我开发了一个NDK应用程序,可以通过i2c开发接口访问i2c设备。该应用程序运行在Android开发工具包上,我们通过i2c在该工具包上连接了一个MPU6050设备 我已经为设备设置了DT绑定,如下所示 i2c@78b5000 { MPU6050@68 { compatible = "qcom, i2c-msm-v2"; reg = <

我开发了一个NDK应用程序,可以通过i2c开发接口访问i2c设备。该应用程序运行在Android开发工具包上,我们通过i2c在该工具包上连接了一个MPU6050设备

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

i2c@78b5000 {                                                           
    MPU6050@68 {
        compatible = "qcom, i2c-msm-v2";
        reg = <0x68>;
    };
};
问题是,当我试图通过open()打开应用程序中的i2c-1文件时

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

我只通过以下步骤成功读取过一次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 
    
    有关此过程的更多详细信息,请访问此链接:

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

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

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

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

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


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

    问题似乎是由SELinux引起的。虽然不是一个永久的解决方案,但我执行了命令

    $ /system/bin/setenforce 0
    
    从adb外壳内部,应用程序现在可以访问i2c-1并成功读取设备

    更持久的解决方案是创建一个新的SEPolicy规则,并将新策略设置为在引导时加载。这篇文章提供了有关该主题的更多信息:

    [更新]我已成功地将SELinux设置为permissive,并通过编辑BoardConfig.mk文件并添加行,在重新启动后保持该设置

    BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
    

    重建启动映像并将新映像闪存到设备。

    使用内核驱动程序中的IIO——这将是正确的做法。我查看了IIO,不确定它是否适合我的要求。我应该在我的帖子中指出,我确实注意到需要快速读取/写入i2c设备。MPU6050被用作通过i2c总线进行读/写能力的简单测试。未来,我们将用ASIC取代MPU6050,这需要通过向芯片写入一系列配置字节来进行设置。IIO用于传感器(MPU6050有一个驱动程序),通常I2C和fast是互斥的。但大多数性能只能通过内核驱动程序或RTO来实现。我同意你的说法,我的观点是我需要一个I2C通信的通用实现,它可以在启动时发送大约30个字节。MPU6050只是临时的,我们要连接的设备(MIPI-DSI到RGB ASIC)将没有驱动程序。如果我们连接的设备没有已经编写的驱动程序,那么使用IIO有多困难?我遇到的大多数资源似乎都在谈论IIO,以及如何将其用于已经编写好并可供使用的驱动程序。好的,IIO仅适用于您的传感器案例(MPU6050),其余的则适用于内核驱动程序。
    $ /system/bin/setenforce 0
    
    BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive