Android(Linux)控制GPIO方法二
前文《Android(Linux)控制GPIO的方法及实时性分析》主要使用Linux shell命令控制GPIO,该方法可在调试过程中快速确定GPIO硬件是否有问题,即对应的GPIO是否受控。实际项目中,一般需要对GPIO做特殊控制,如车载导航系统开机就给GPS模块上电,或在daemon程序中控制GPIO给一个脉冲以Reset蓝牙模块等,就不便用shell 命令来控制,而需要另想办法。
http://elinux.org/RPi_GPIO_Code_Samples#sysfs介绍了如何在C代码中导出GPIO、设置方向以及控制GPIO,这是完全可以工作的。如果只是需要在系统开机时给GPS模块上电,那单独写一个应用或者把相关代码放在daemon里,虽然也行,但稍显麻烦,可采用如下方法简便实现。
以msm8996的Android6.0为例,修改device/qcom/msm8996/init.target.rc文件,在on post-fs部分添加如下代码,
write /sys/class/gpio/export
write /sys/class/gpio/gpio62/direction out
chown system system /sys/class/gpio/gpio62/value
chmod /sys/class/gpio/gpio62/value
write /sys/class/gpio/gpio62/value
执行make bootimage命令生成boot.img,使用fastboot烧录boot.img,系统重新启动即可实现开机自动给GPS模块上电。类似导出一个GPIO,用于控制蓝牙模块的RESET引脚,就可以在Bluetooth的daemon程序里直接打开/sys/class/gpio/gpio63/value,并对其进行控制,可省去代码中对export和direction的配置。
特别说明,如果可通过shell脚本导出GPIO并进行控制,而修改init.target.rc却无反映,则很可能是内核中GPIO的配置有冲突!我在实际调试过程中,就掉到这个坑里了,折腾好久才最终发现问题的根本原因,GPIO62和GPIO63在内核中被用作了CAM_RST和CAM_STANDBY,线索在dmesg的log里,如下,
[ 18.590187] msm_camera_request_gpio_table:751 gpio 63:CAM_RESET1 request fails
[ 18.590193] msm_camera_request_gpio_table:751 gpio 62:CAM_STANDBY1 request fails
后来通过make kernelconfig,去除camera相关的驱动,重新编译内核就可以了。
另外,使用chown和chmod命令主要是为了后面Android的APP可访问/sys/class/gpio/gpio62/value,如果只在Linux的daemon里访问,chown和chmod应该可省,一如export和direction可直接write。
Android(Linux)控制GPIO方法二的更多相关文章
- Android(Linux)控制GPIO的方法及实时性分析
Linux下控制GPIO的方法有N种,详细请参考<RPi GPIO Code Samples>,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中 ...
- Android(Java)控制GPIO的方法及耗时分析
前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO.实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Android权限.本文重点介绍 ...
- android jni控制gpio (rk3288)
1.添加驱动程序 2.编写jni c程序编译为库给java调用 3.app调用jni静态链接库操作底层驱动 1.添加驱动程序 修改/work/rk3288/firefly-rk3288_android ...
- Android抓包方法(二)之Tcpdump命令+Wireshark
Android抓包方法(二) 之Tcpdump命令+Wireshark 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等.学会抓包分 ...
- 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二
/** ****************************************************************************** * @author 暴走的小 ...
- Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c
Android系统--输入系统(二)必备Linux知识_实现inotify_epoll.c 课后作业 1. 编写 inotify_epoll.c, 用它来监测tmp/目录: 有文件被创建/删除, 有文 ...
- openwrt 控制gpio口的方法
利用i2c来控制gpio口 1.编译驱动或者安装驱动 # opkg update # opkg install kmod-i2c-gpio-custom kmod-i2c-core# 加载驱动 # i ...
- Spring Security教程之基于方法的权限控制(十二)
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- 【Android】一种提高Android应用进程存活率新方法
[Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...
随机推荐
- C#知识点-委托
一.什么是委托 委托和类一样,是一种用户自定义类型: 类表示的是数据和方法的集合,而委托则持有一个或多个方法: 二.委托的使用 1.声明委托类型 委托是类型,与类一样,委托类型必须在被用来创建变量以及 ...
- ios 文件操作(NSFileManager)
IOS的沙盒机制,应用只能访问自己应用目录下的文件,iOS不像android,没有SD卡概念,不能直接访问图像.视频等内容. iOS应用产生的内容,如图像.文件.缓存内容等都必须存储在自己的沙盒内. ...
- Mybats中字符串判断
<if test=" name=='你好' "> <if> 这样会有问题,换成 <if test=' name=="你好" ' ...
- nginx root和alias指令的区别
# alias location /js/{ alias /static/;}#上述配置,访问/js/目录的时候,nginx自动会去找/static/下面的文件 # rootlocation /js/ ...
- 初学C++ 之 auto关键字(IDE:VS2013)
/*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...
- 计蒜客_计数和数数(C语言实现)
“伯爵说”序列如下:1, 11, 21, 1211, 111221, ...1 读作 "one 1" 或者 11.11 读作 "two 1s" 或者21.21 ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(一)GIS一张图的系统开发环境以及flexviewer框架
系统的GIS功能实现是基于arcgis api for flex,首先附上系统的主界面图,接下来的是对主界面的模块功能详细讲解: 一.GIS环境软件安装 (1)arcgis desktop的安装,要是 ...
- SAP RFC
什么是RFC? RFC是SAP系统和其他(SAP或非SAP)系统间的一个重要而常用的双向接口技术,也被视为SAP与外部通信的基本协议.简单地说,RFC过程就是系统调用当前系统外的程序模块,从而实现某个 ...
- 心无旁骛,向死而生:WGDC2016给创企上的一堂课
"这是最好的时代,也是最坏的时代:这是希望的春天,也是失望的冬天." ------狄更斯 WGDC2016落幕已经一月有余,我仍然记得会议结束后,穿过高大宽敞的国家会议中心大厅,走 ...
- ArcGIS JS 学习笔记4 实现地图联动
1.开篇 守望屁股实在太好玩了,所以最近有点懒,这次就先写个简单的来凑一下数.这次我的模仿目标是天地图的地图联动. 天地的地图联动不仅地图有联动,而且鼠标也有联动,我就照着这个目标进行山寨. 2.准备 ...