看了这么多的资料,现在决定上手了,下面将用两种方式来实现对GPIO 117的控制
1,用直接添加到内核的方式,实现MISC的驱动(misc_register)
2,用手工安装的方式,实现简单字符设备驱动(register_chrdev)

实现前提:当前所用的GPIO没有被其它设备所使用,大家可以用我前面BLOG说的方式查看GPIO的使用情况,当前我所用的GPIO本来是bluetooth的开关,需要屏蔽一个函数。不然后面的驱动申请IO都会失败。
函数为Board-am335xevm.c 中的wl12xx_bluetooth_enable();

一,MISC驱动的实现
1,参考linux SDK for AM335x Ver 1.1.pdf P28,添加kernel 配置选项
  打开/driver/input/misc/Kconfig并添加:

  1. config INPUT_GPIOTEST
  2. bool "Gpio 117 test"
  3. help
  4. Just test the Gpio 117 status

打开/driver/input/misc/Makefile并添加:

  1. obj-$(CONFIG_INPUT_GPIOTEST)+=GpioTestDriver.o

2,实现GpioTestDriver.c

  1. #include <linux/gpio.h>
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/moduleparam.h>
  5. #include <linux/delay.h>
  6. #include <linux/types.h>
  7. #include <linux/miscdevice.h>
  8. #include <linux/device.h>
  9. #include <linux/fs.h>
  10. #include <linux/init.h>
  11. #define TEST_IO_NUM(117)
  12. #define NAME_MISC"GpioTest"
  13. #define NAME_MOUDULE"GpioTest1"
  14. #define USE_MISC_MODE1
  15. static int major = 251;
  16. void GpioTest(void);
  17. static long GpioIOctl(struct file *filp, unsigned cmd, unsigned long arg)
  18. {
  19. GpioTest();
  20. return 1;
  21. }
  22. void GpioTest(void)
  23. {
  24. int iCount = 0;
  25. for(iCount = 0; iCount <=20; iCount++ )
  26. {
  27. if(iCount%2 == 0)
  28. {
  29. gpio_direction_output(TEST_IO_NUM, 1);
  30. printk(KERN_INFO"#######IO117 statu is high.\r\n");
  31. }
  32. else
  33. {
  34. gpio_direction_output(TEST_IO_NUM, 0);
  35. printk(KERN_INFO"#######IO117 statu is low.\r\n");
  36. }
  37. mdelay(3000);
  38. }
  39. printk(KERN_INFO"#######App run over!");
  40. }
  41. static int GpioOpen(struct inode *inode, struct file *file)
  42. {
  43. int iRen = -1;
  44. iRen = gpio_request(TEST_IO_NUM, "IO117");
  45. if(iRen < 0)
  46. {
  47. printk(KERN_INFO"#######Failed to request the IO117!");
  48. }else
  49. {
  50. printk(KERN_INFO"#######Success to request the IO117");
  51. }
  52. return iRen;
  53. }
  54. static int GpioClose(struct inode *inode, struct file *file)
  55. {
  56. printk(KERN_INFO"#######Free the IO117");
  57. gpio_free(TEST_IO_NUM);
  58. return 1;
  59. }
  60. //****entry point for TEST GPIO module
  61. static const struct file_operations gpio_test_driver = {
  62. .owner = THIS_MODULE,
  63. .unlocked_ioctl= GpioIOctl,
  64. .llseek = no_llseek,
  65. .open = GpioOpen,
  66. .release = GpioClose,
  67. };
  68. #if USE_MISC_MODE
  69. static struct miscdevice gpiotest_misc_device = {
  70. .minor    = MISC_DYNAMIC_MINOR,
  71. .name     = NAME_MISC,
  72. .fops     = &gpio_test_driver,
  73. };
  74. #endif
  75. static int __init GpioTestInit(void)
  76. {
  77. int iRet;
  78. printk(KERN_INFO"#######GpioTest modules is install!\r\n");
  79. #if USE_MISC_MODE
  80. iRet = misc_register(&gpiotest_misc_device);
  81. if (iRet) {
  82. printk(KERN_INFO"#######unable to register a misc device\r\n");
  83. return iRet;
  84. }
  85. #else
  86. iRet = register_chrdev(major, NAME_MOUDULE, &gpio_test_driver);
  87. if (iRet < 0) {
  88. printk(KERN_INFO"#######unable to register a chr device\r\n");
  89. return iRet;
  90. }
  91. #endif
  92. return iRet;
  93. }
  94. static void __exit GpioTestExit(void)
  95. {
  96. #if USE_MISC_MODE
  97. misc_deregister(&gpiotest_misc_device);
  98. #else
  99. unregister_chrdev(major, NAME_MOUDULE);
  100. #endif
  101. printk(KERN_INFO"#######GpioTest modules is exit!\r\n");
  102. }
  103. module_init(GpioTestInit);
  104. module_exit(GpioTestExit);
  105. MODULE_AUTHOR("david.hu<343556608@qq.com>");
  106. MODULE_LICENSE("GPL");
  107. MODULE_DESCRIPTION("Gpio117 Test driver");

3,直接编译:
make uImage
拷到小板上升级运行
注意启动的过程有打印:
[    3.730712] #######GpioTest modules is install!
这里表示我们的驱动已经合入NK里去了,当然我们也可以命令:ls /dev,可以看到有GpioTest这个存在
4,写测试APP

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/ioctl.h>
  4. #include <unistd.h>
  5. #include <sys/stat.h>
  6. #include <linux/input.h>
  7. #include <fcntl.h>
  8. int main(int argc, charchar *argv)
  9. {
  10. int fd;
  11. fd = open("/dev/GpioTest", O_RDWR);
  12. if(fd < 0)
  13. {
  14. printf("***Can't open the gpiotest!\r\n");
  15. return -1;
  16. }
  17. ioctl(fd, 0, 0);
  18. close(fd);
  19. printf("***App run over!\r\n");
  20. return 1;
  21. }

将编译的.out文件拷到小机上面运行,看是不是会打印正确的结果。

二,字符设备驱动的实现
1,代码的实现,请将上面MISC的代码里#define USE_MISC_MODE1改成0
2,makefile的实现

  1. KERNEL_DIR := /home/ding/workdir/david/EVMBoard/board-support/linux-3.2
  2. PLATFORM := "am335x-evm"
  3. MACHINE_NAME := "am335x"
  4. # If CROSS_COMPILE is not set by Rules.make then set a sane default
  5. CROSS_COMPILE ?= arm-arago-linux-gnueabi-
  6. export CROSS_COMPILE
  7. obj-m := GpioTestDriver.o
  8. MAKE_ENV = ARCH=arm
  9. PWD := $(shell pwd)
  10. all:
  11. $(MAKE) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" -C $(KERNEL_DIR) $(MAKE_ENV) \
  12. M=$(PWD) modules
  13. clean:
  14. rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers

3,将编译的ko拷入小机,然后命令:

  1. insmod ./GpioTestDriver.ko
  2. lsmod
  3. mknod /dev/GpioTestDriver c 251 0

4,实现APP的代码
将上面MISC的代码作如下修改:

  1. fd = open("/dev/GpioTestDriver", O_RDWR);

5,运行APP查看结果

总结:两个驱动代码实现差不多,但是步骤不一样,主要体现在模块需要安装。MISC会自动创建设备文件,它的主设备号是10,字符设备需要我们来指定。
可安装的字符设备对驱动的编写测试是非常有帮助的。

http://blog.csdn.net/hudaweikevin/article/details/16826995

Am335x 下GPIO控制实例-驱动程序(转)的更多相关文章

  1. linux设备驱动程序--gpio控制

    gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...

  2. python环境下实现OrangePi Zero寄存器访问及GPIO控制

    最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...

  3. Linux下GPIO驱动

    编写驱动程序,首先要了解是什么类型的设备.linux下的设备分为三类,分别为:字符设备,块设备和网络设备.字符设备类型是根据是否以字符流为数据的交换方式,大部分设备都是字符设备,如键盘,串口等,块设备 ...

  4. sys下gpio操作

    gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射 * 控制GPIO的目录位于/sys/class/gpio * /sys/class/gpio/export文 ...

  5. 树莓派Zero W GPIO控制

    作者:陈拓 chentuo@ms.xab.ac.cn 2018.06.09/2018.07.05 0.  概述 本文介绍树莓派 Zero W的GPIO控制,并用LED看效果. 0.1 树莓派GPIO编 ...

  6. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  7. Java设计模式09:单例模式的强化(控制实例个数n)

    1. 单例模式的本质: 控制实例数目(目的节约资源) 2. 单例模式体现的一些思想: (1)延迟装载(Lazy Load):懒汉式 (2)缓存:饿汉式 3. 单例模式的变形使用: 控制使用实例个数为3 ...

  8. linux下socket编程实例

    linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...

  9. 解决 RecyclerView 在Android Studio已经导入情况下还无法实例引用问题

    系统:Windows 10 IDE::android studio 1. 问题:RecyclerView 在Android Studio已经导入情况下还无法实例引用问题 由于RecyclerView是 ...

随机推荐

  1. 【转载】Java动态代理之JDK实现和CGlib实现(简单易懂)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是 ...

  2. Python面试题目之打乱打乱有序列表

    # 要求打乱一个有序列表 # 待处理列表 L1 = [11,22,33,44,55,66,77,] 方法: # 引入random模块,该模块的shuffle方法见下图 import random L1 ...

  3. maven和gradle中,dependency和plugin的区别

    dependency引入的东西 作用:代码编译/运行时所需要的东西 打包:项目打包后这些东西基本都在(一般都在). 例如:JSON工具包GSON(com.google.code.gson),不仅开发时 ...

  4. UVa 10534 波浪子序列(快速求LIS)

    https://vjudge.net/problem/UVA-10534 题意:给定一个长度为n的整数序列,求一个最长子序列(不一定连续),使得该序列的长度为2k+1,前k+1个数严格递增,后k+1个 ...

  5. Codeforces Round #394 (Div. 2) E. Dasha and Puzzle(dfs)

    http://codeforces.com/contest/761/problem/E 题意:给出一棵树,现在要把这棵树上的结点放置在笛卡尔坐标上,使得每一条边与x轴平行或者与y轴平行.输出可行解,即 ...

  6. java中interrupt、join、sleep、notify、notifyAll、wait详解

    首先介绍一下中断概念:举个例子容易理解一点 例子:假如你正在给朋友写信,电话铃响了.这时,你放下手中的笔,去接电话.通话完毕,再继续写信.这个例子就表现了中断及其处理过程:电话铃声使你暂时中止当前的工 ...

  7. Mysql中FIND_IN_SET和REPLACE函数简介

    一  FIND_IN_SET() SELECT * from u_user where FIND_IN_SET('32',tags) 上面的sql是精确查找,查找表中tags中含有32的记录(注意这里 ...

  8. oracle会自动收集统计信息-记住哦

    oracle自动收集统计信息,周一至周五  时间:22:00:00 oracle自动收集统计信息,周六.周日  时间:06:00:00

  9. gruntjs开发实例

    Grunt是基于Node.js的项目构建工具.它可以自动运行你所设定的任务,如编译less,sass,压缩js,合拼文件等等. (一)安装nodejs环境,Grunt 0.4.x要求Node.js的版 ...

  10. Mybatis generator 配置

    mybatis-generator.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...