CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 13060|回复: 5

Android 用C语言文件读写控制gpio

[复制链接]
发表于 2013-7-31 16:28:15 | 显示全部楼层 |阅读模式
本帖最后由 yzbx 于 2013-7-31 16:33 编辑

C语言参考:C语言控制CB上的绿灯  
gpio配置:  CubieBoard通过GPIO控制步进电机-python
                或者:CubieBoard通过GPIO控制步进电机-python  
当然,要感谢CB的工程师们,他们已经将 gpio集成到Android 之中,我们只要修改script.bin配置就可以了。楼主lanybass的script.bin配置,大家可以和CB扩展口手册对比。(lanybass和超级版主windland应该是同一个人!照片一样,工作相关)
给出经修改的源码cb0.c
  1. //源码来自:http://cn.cubieboard.org/forum.php?mod=viewthread&tid=345  再次感谢楼主马甲一号的分享!
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <sys/ioctl.h>
  9. #include <sys/mman.h>
  10. #include <sys/time.h>
  11. #include <fcntl.h>

  12. /**
  13. *功能 Cubieboard Linux 下用C语言控制 GPIO ,实现对板载绿灯的控制
  14. * 此代码只要稍微更改一下PIN口的名称也可以控制其他的设备,如继电器,步进电机。。。
  15. * 更多知道请用关键字 cubieboard,gpio,script.bin进行搜索

  16. *博客 http://hi.baidu.com/smsspy/
  17. */

  18. int main()
  19. {
  20.     int fd;
  21.     int myfd[12];
  22.     char PinPath[]={"/sys/devices/virtual/misc/sun4i-gpio/pin/"};
  23.     char PinName[]={"pg"};
  24.     int PinNumber=0;
  25.     char fullpath[100];
  26.     char fullpath0[100];
  27.     char addname[3]= {'\0','\0','\0'};
  28.     int i,j;

  29.     strcpy(fullpath,PinPath);
  30.     //printf("fullpath=%s\n",fullpath);
  31.     strcat(fullpath,PinName);
  32.     //printf("fullpath=%s\n",fullpath);
  33.     //printf("addname=%s\n",addname);

  34.     strcpy(fullpath0,fullpath);

  35. //调试用代码
  36. /*
  37.     printf("eg PinPath+PinName+PinNumber: %s+%s+%d\n",PinPath,PinName,PinNumber);
  38.     printf("fullpath0=%s\n",fullpath0);
  39.     printf("fullpath=%s\n",fullpath);
  40.     for(i=0;i<12;i++)
  41.     {
  42.         PinNumber=i;
  43.         if(PinNumber<=9)
  44.         {
  45.             addname[0]='0'+PinNumber;
  46.         }
  47.         else
  48.         {
  49.             addname[0]='0'+PinNumber/10;
  50.             addname[1]='0'+PinNumber%10;
  51.         }

  52.         strcpy(fullpath0,fullpath);
  53.         strcat(fullpath0,addname);
  54.         printf("fullpath0=%s\n",fullpath0);
  55.     }
  56. */
  57. //如果不存在sun4i-gpio,那是驱动没安装好,请自行GOOGLE一下。
  58.     fd = open("/sys/devices/virtual/misc/sun4i-gpio/pin/pg0",O_RDWR|O_NOCTTY);
  59.     if(fd < 0)
  60.     {
  61.         printf("cannot open the file!\n");
  62.         return 0;
  63.     }

  64. //60个周期,一个周期一个“呼吸”动作

  65.     for(i=0; i<60; i++)
  66.     {
  67. //发送一个1,高电平,灯亮
  68.         write(fd,"1", 1);
  69.         sleep(1);
  70.         printf("change the V\n");
  71. //发送一个0,低电平,灯灭
  72.         write(fd,"0", 1);
  73.         sleep(1);
  74.     }

  75.     close(fd);

  76.     //open file pg0 to pg11;
  77.     for(i=0;i<12;i++)
  78.     {
  79.         PinNumber=i;
  80.         addname[0]='0'+PinNumber;
  81.         strcpy(fullpath0,fullpath);
  82.         strcat(fullpath0,addname);
  83.         printf("fullpath0=%s\n",fullpath0);
  84.         myfd[i]=open(fullpath0,O_RDWR|O_NOCTTY);
  85.     }
  86.     //write file pg0 to pg11
  87.     for(i=0;i<60;i++)
  88.     {
  89.         for(j=0;j<12;j++)
  90.         {
  91.             write(myfd[j],"1",1);
  92.         }
  93.         sleep(1);
  94.         printf("change the voltage!\n");
  95. //发送一个0,低电平,灯灭
  96.         for(j=0;j<12;j++)
  97.         {
  98.             write(myfd[j],"0",1);
  99.         }
  100.         sleep(1);
  101.     }

  102.     return 0;
  103. }
复制代码
在ubuntu的终端下使用如下命令:
  1. 1)//静态交叉编译,普通编译会导致出错  
  2. yzbx@:桌面$ arm-linux-gcc cb0.c -static -o cb0

  3. 2)//插上数据线,接OTG口.
  4. yzbx@:桌面$ lsusb
  5. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  6. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
  7. Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
  8. Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
  9. Bus 001 Device 003: ID 04b3:3107 IBM Corp. ThinkPad 800dpi Optical Travel Mouse
  10. Bus 001 Device 004: ID 04f2:b257 Chicony Electronics Co., Ltd
  11. Bus 002 Device 003: ID 18d1:0003 Google Inc.
  12. 3)//查看连接设备,adb的可以不用,只要将程序拷到CB上即可。不过推荐用adb,因为更方便。
  13. yzbx@:桌面$ adb devices
  14. List of devices attached
  15. 20080411    device
  16. 4)//传送文件到/data 目录之中,yzbx文件夹是我自己建立的工作目录,程序不是在任何位置都可以运行的,在/sdcard//之中似乎就不能运行。
  17. yzbx@:桌面$ adb push cb0 /data/yzbx
  18. * daemon not running. starting it now on port 5037 *
  19. * daemon started successfully *
  20. 3352 KB/s (587550 bytes in 0.171s)
  21. //进入android  shell环境之中
  22. yzbx@:桌面$ adb shell
  23. root@android:/ # cd /data/yzbx
  24. root@android:/data/yzbx # ls
  25. cb0
  26. cbjava.class
  27. cblight
  28. cbpg0
  29. test
  30. root@android:/data/yzbx # ./cb0
  31. change the V
  32. change the V
  33. change the V
  34. ...
复制代码
1)的参考  交叉编译后的C语言程序怎么运行
3)的参考  adb安装
再用万能表去测量,就可以发现示数随时间变化。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

参与人数 1威望 +7 金钱 +7 贡献 +7 收起 理由
醉月 + 7 + 7 + 7 我也准备发,一直忙啊,给力,顶一个!.

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-7-31 18:36:37 | 显示全部楼层
本帖最后由 yzbx 于 2013-7-31 18:42 编辑

以上代码还有bug, 注意到addname[3]在PinNumber>10时会出现问题,虽然调试的代码改过来了,但运行中的代码没有改过。相应修改就好。
现附上图片LED闪烁的图片。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2013-8-3 08:40:02 | 显示全部楼层
顶一个。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2013-8-9 15:45:07 | 显示全部楼层
android程序如何控制IO口呢,请出例子
回复 支持 反对

使用道具 举报

发表于 2013-8-9 15:46:06 | 显示全部楼层
up up +1支持一个,搞这个我搞了好几天呢,各种方法折腾,总算是搞出来了,不过还没时间写成文档,要么就明天大概整理下发出来吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-14 17:44:22 | 显示全部楼层
qiaoge 发表于 2013-8-9 15:45
android程序如何控制IO口呢,请出例子

android程序要么用runtime的exec()控制,要么用jni方式,感觉都很复杂,我没试过,反正安卓的权限是个问题,有的路径是不能访问的。感觉比较麻烦,你有时间可以试试 。我没有试过,不好多说。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-4-28 14:50 , Processed in 0.028323 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部