• Android(Java)控制GPIO的方法及耗时分析


      前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO。实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限。本文重点介绍Android6.0权限的配置并对在Java层控制GPIO的耗时做简单分析。

      以高通平台为例,权限配置主要修改HLOS/device/qcom/sepolicy/common目录下的file.te、file_contexts和system_app.te三个文件。

      file.te修改如下,

    # GPIO accessed by system app
    type sysfs_gpio, fs_type, sysfs_type;

      file_contexts修改如下,

    /sys/devices/soc/1010000.pinctrl/gpio/gpio62/value           u:object_r:sysfs_gpio:s0
    /sys/devices/soc/1010000.pinctrl/gpio/gpio63/value           u:object_r:sysfs_gpio:s0

      system_app.te修改如下,

    allow system_app sysfs_gpio:file rw_file_perms;

      修改完成后执行make bootimage命令,生成boot.img并使用fastboot烧录。

      Android应用修改AndroidManifest.xml文件,在manifest节点中添加android:sharedUserId="android.uid.system。修改Android.mk文件,添加LOCAL_CERTIFICATE := platform设置签名。Java控制GPIO的示例代码如下,

        void IOCtrl(int pin, int level) {
            String path;
    
            path = "/sys/class/gpio/gpio" + pin + "/value";
            try {
                FileOutputStream out = new FileOutputStream(path);
                out.write(level);
                out.flush();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
        }
    
        if (trigger == 0x01) {
            trigger = 0x00;
            IOCtrl(62, '1');
            IOCtrl(63, '1');
        } else {
            trigger = 0x01;
            IOCtrl(62, '0');
            IOCtrl(63, '0');
        }

      以上代码执行结果如下图所示,可以看到,两个IO被拉高前后相差约2.5ms。

      说明:如果只是做测试,可以使用setenforce 0命令设置SELinux为permissive模式,就可以用Android Studio编译测试应用控制GPIO,更为方便。

  • 相关阅读:
    图书排列
    L1-059 敲笨钟 (20 分)
    区间移位
    取球博弈
    poj 2456 Aggressive cows
    对局匹配
    发现环
    数字划分
    哥德巴赫分解
    把数组排成最小的数
  • 原文地址:https://www.cnblogs.com/we-hjb/p/6072357.html
Copyright © 2020-2023  润新知