Android系统下的GPOI控制

5 1649
本帖最后由 guoxiaokai527 于 2015-12-21 15:23 编辑

最近需要用到banana的gpio读取红外传感器的状态,在linux下测试已经通过,谁知道放在android下,就犯难了,没有GPIO的驱动....
最后在英文区找到了突破口,可以参考链接:http://forum.lemaker.org/forum.php?mod=viewthread&tid=11652&highlight=gpio,具体实现过程如下:
1. 推荐一个很好用的android软件:http://pan.baidu.com/s/1mh1Hy0w
  • sshd-2.1.2-44.apk,android下的ssh服务器,可以让你用电脑连接香蕉派的终端;
2. 看到A20-Tool工具的源码里面关于gpio控制的部分,原文请看:https://github.com/OLIMEX/OLINUX ... a20/tools/Pins.java
其实上面代码里的原理很简单,就是
   第一步:你需要知道你要控制的管脚在那个寄存器,以“IO-1”为例,它接在PH2;
   第二步:查看板子上/sys/class/gpio/下面哪个是PH寄存器,下面只是举个栗子(因为写这个是在公司写的,东西在家里没法截图=。=)
       先取得GPIO信息,在终端中敲入以下命令
         1  cd /sys/class/gpio
         2  for i in gpiochip* ; do echo `cat $i/label`: `cat $i/base` ; done
      终端中显示如下 (得到各个寄存器起始号码,下面的只有GPH是我记得的,其他的不正确)
         1 GPA: 0
         2 GPE: 128
         3 GPF: 160
         4 GPG: 192
         5 GPH: 167
         6 GPB: 32
         7 GPC: 64
         8 GPD: 96
   第三步:计算要控制的gpio的号码:GPH0是167,那么PH2就是167+2=169;
   第四步: echo 139 > /sys/class/gpio/export,然后会出现一个gpio169的文件说明成功了
   第五步: echo out > /sys/class/gpio/gpio169/direction ,设置gpio方向,“out”输出,“in”输入;
   第六部: echo 1 > /sys/class/gpio/gpio169/value,写入或者读取GPIO值,读取gpio用命令:cat /sys/class/gpio/gpio169/value

3. 实际操作过程很简单:
  •    下面以“IO-1”为例说明,下一步需要在Banana Pro Schematic.pdf文档中找到这个IO接到了CPU上的哪个管脚:

       因为贴图,超限制了,所以自己去找吧,这个“IO-1”对应的是“PH2”。
  • 下面我根据上面贴的那个文档在ssh中测试了下,确实是可行的,但是奇怪的是我直接把这个文件放在我的项目里,执行没有出现异常但是每次执行都失败,让我百思不得其解,后来无意中发现,咱们的香蕉派android系统本身就已经有root权限了,所以就把前面的“su -c”参数去掉,然后把“echo"和其他的参数分别放在数组中就行了,结果发现神奇的好用了,万岁~~~~
  1. java
  2. //其他的类似
  3. public int exportPin() {
  4.                 try {
  5.                         Process process = Runtime.getRuntime().exec(
  6.                                         new String[] {
  7.                                                         "echo",
  8.                                                         String.valueOf(this.number),
  9.                                                         ">",
  10.                                                         this.export });
  11.                         process.waitFor();
  12.                         if (process.exitValue() == 0)
  13.                                 return 0;
  14.                 } catch (IOException e) {
  15.                         e.printStackTrace();
  16.                 } catch (InterruptedException e) {
  17.                         e.printStackTrace();
  18.                 }
  19.                 return -1;
  20.         }
复制代码
调用方法也比较简单:
  1. Pins mGpio = new Pins("gpio1:PH2",169);
  2. mGpio.exportPin();
  3. mGpio.setDirection("out");
  4. mGpio.setLevel("1");
复制代码
完成,哈哈,第一次发帖子,有些的不好的地方大家多包涵....话说为啥英文版的不让发言,无语了!!

补充一点,貌似程序直接echo 169 > /sys/class/gpio/export是不行的,需要用下su,将上面的改成如下即可:
  1. public int exportPin() {
  2.                 String command = "echo "+this.number+" > "+this.export;
  3.                 try {
  4.                         Process        process = Runtime.getRuntime().exec("su");
  5.                         DataOutputStream os = new DataOutputStream(process.getOutputStream());
  6.                         os.writeBytes(command + "\n");
  7.                         os.writeBytes("exit\n");
  8.                         os.flush();
  9.                         process.waitFor();
  10.                         
  11.                         if (process.exitValue() == 0)
  12.                                 return 0;
  13.                 } catch (IOException e) {
  14.                         e.printStackTrace();
  15.                 } catch (InterruptedException e) {
  16.                         e.printStackTrace();
  17.                 }
  18.                 return -1;
  19.         }
复制代码

楼主可以用其他方法控制GPIO吗?command的方式?

SimonLong 发表于 2016-1-7 10:59
楼主可以用其他方法控制GPIO吗?command的方式?

什么叫command方式?

SimonLong 发表于 2016-1-7 10:59
楼主可以用其他方法控制GPIO吗?command的方式?

SSH连接板子以后,也可以调用上面代码里面的命令:

执行的命令可以参考 三、四、五、六步骤


您需要登录后才可以回帖 登录 | 注册

本版积分规则