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

莫道桑榆晚,为霞尚满天。这篇文章主要讲述Android(Java)控制GPIO的方法及耗时分析相关的知识,希望能为你提供帮助。
【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/valueu:object_r:sysfs_gpio:s0 /sys/devices/soc/1010000.pinctrl/gpio/gpio63/valueu: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。
Android(Java)控制GPIO的方法及耗时分析

文章图片

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

    推荐阅读