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 62
write /sys/class/gpio/gpio62/direction out
chown system system /sys/class/gpio/gpio62/value
chmod 0666 /sys/class/gpio/gpio62/value
write /sys/class/gpio/gpio62/value 1

  执行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。

时间: 2024-07-30 21:58:15

Android(Linux)控制GPIO方法二的相关文章

Android(Linux)控制GPIO的方法及实时性分析

Linux下控制GPIO的方法有N种,详细请参考<RPi GPIO Code Samples>,文中用十多种语言演示了如何控制GPIO,非常全面详尽.因此,这里不再多做赘述,仅把调试过程中整理的脚本贴上并做简单的分析.特别说明,Linux必须有root权限!!!否则会出现/system/bin/sh: can't create /sys/class/gpio/export: Permission denied等错误. @echo off echo adb root adb root >%

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修改如下, # GPI

linux驱动-linux下写驱动控制gpio时的两种方法区别

问题描述 linux下写驱动控制gpio时的两种方法区别 linux下写驱动控制gpio时,见过两种方法: 用request_mem_region函数和ioremap等得到控制寄存器的地址,然后用iowrite32函数控制该gpio 用gpio_request 和 gpio_set_value函数来控制gpio引脚 请问:这两种方法有什么区别,分别适用什么场合? 解决方案 http://blog.csdn.net/mirkerson/article/details/8464290http://b

android同时控制EditText输入字符个数和禁止特殊字符输入的方法_Android

本文实例讲述了android同时控制EditText输入字符个数和禁止特殊字符输入的方法.分享给大家供大家参考.具体分析如下: 这里总结了三种方法如下: 方法一: 1. 引用两个命名空间: import android.text.TextWatcher; import android.text.Editable; 用于禁止特殊字符输入控制 定义EditText mEditText对象 2. 控制字符长度: 通过InputFilter过滤来实现字符长度控制,这样的好处是可以实现动态长度控制,而不是

Android开发控制ScrollView滑动速度的方法

本文实例讲述了Android开发控制ScrollView滑动速度的方法.分享给大家供大家参考,具体如下: 前言 由于各个Android平板触摸屏的材质不一样,滑动效果会有一些区别,有的比较灵敏,有的比较迟钝,这里就遇到了要求控制滑动速度的需求... 正文 翻阅查找ScrollView的文档并搜索了一下没有发现直接设置的属性和方法,这里通过继承来达到这一目的. /** * 快/慢滑动ScrollView * @author 农民伯伯 * */ public class SlowScrollView

Android中刷新界面的二种方法_Android

Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. Android界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面. 利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新:而在线程中通过sendMessag

Android中刷新界面的二种方法

Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中调用. Android界面刷新方法有两种,分别是利用Handler和利用postInvalidate()来实现在线程中刷新界面. 利用Handler刷新界面 实例化一个Handler对象,并重写handleMessage方法调用invalidate()实现界面刷新:而在线程中通过sendMessag

简单Linux代码移植方法(ZT)

介绍  用一个例子简单说明了从linux平台移植到windows平台上的一些需要注意的问题和解决方法. 例子仅用来说明移植过程产生的问题用. 正文  简单Linux代码移植方法 一.前言 Linux 拥有丰富各种源代码资源,但是大部分代码在Windows平台情况是无法正常编译的.Windows平台根本无法直接利用这些源代码资源.如果想要使用完整的代码,就要做移植工作.因为C/C++ Library的不同和其他的一些原因,移植C/C++代码是一项困难的工作.本文将以一个实际的例子(Tar)来说明如

I.MX6 Android Linux UART send receive with multi-thread and multi-mode demo

/******************************************************************************************* * I.MX6 Android Linux UART send receive with multi-thread and multi-mode demo * 声明: * 1. 本软件是为了测试Android底层的Linux驱动以及硬件是否存在缺陷而编写的测试软件: * 2. 本软件可以设置为发送.接收.发送并接