Am335x 下GPIO控制实例-驱动程序(转)
看了这么多的资料,现在决定上手了,下面将用两种方式来实现对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并添加:
- config INPUT_GPIOTEST
- bool "Gpio 117 test"
- help
- Just test the Gpio 117 status
打开/driver/input/misc/Makefile并添加:
- obj-$(CONFIG_INPUT_GPIOTEST)+=GpioTestDriver.o
2,实现GpioTestDriver.c
- #include <linux/gpio.h>
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/moduleparam.h>
- #include <linux/delay.h>
- #include <linux/types.h>
- #include <linux/miscdevice.h>
- #include <linux/device.h>
- #include <linux/fs.h>
- #include <linux/init.h>
- #define TEST_IO_NUM(117)
- #define NAME_MISC"GpioTest"
- #define NAME_MOUDULE"GpioTest1"
- #define USE_MISC_MODE1
- static int major = 251;
- void GpioTest(void);
- static long GpioIOctl(struct file *filp, unsigned cmd, unsigned long arg)
- {
- GpioTest();
- return 1;
- }
- void GpioTest(void)
- {
- int iCount = 0;
- for(iCount = 0; iCount <=20; iCount++ )
- {
- if(iCount%2 == 0)
- {
- gpio_direction_output(TEST_IO_NUM, 1);
- printk(KERN_INFO"#######IO117 statu is high.\r\n");
- }
- else
- {
- gpio_direction_output(TEST_IO_NUM, 0);
- printk(KERN_INFO"#######IO117 statu is low.\r\n");
- }
- mdelay(3000);
- }
- printk(KERN_INFO"#######App run over!");
- }
- static int GpioOpen(struct inode *inode, struct file *file)
- {
- int iRen = -1;
- iRen = gpio_request(TEST_IO_NUM, "IO117");
- if(iRen < 0)
- {
- printk(KERN_INFO"#######Failed to request the IO117!");
- }else
- {
- printk(KERN_INFO"#######Success to request the IO117");
- }
- return iRen;
- }
- static int GpioClose(struct inode *inode, struct file *file)
- {
- printk(KERN_INFO"#######Free the IO117");
- gpio_free(TEST_IO_NUM);
- return 1;
- }
- //****entry point for TEST GPIO module
- static const struct file_operations gpio_test_driver = {
- .owner = THIS_MODULE,
- .unlocked_ioctl= GpioIOctl,
- .llseek = no_llseek,
- .open = GpioOpen,
- .release = GpioClose,
- };
- #if USE_MISC_MODE
- static struct miscdevice gpiotest_misc_device = {
- .minor = MISC_DYNAMIC_MINOR,
- .name = NAME_MISC,
- .fops = &gpio_test_driver,
- };
- #endif
- static int __init GpioTestInit(void)
- {
- int iRet;
- printk(KERN_INFO"#######GpioTest modules is install!\r\n");
- #if USE_MISC_MODE
- iRet = misc_register(&gpiotest_misc_device);
- if (iRet) {
- printk(KERN_INFO"#######unable to register a misc device\r\n");
- return iRet;
- }
- #else
- iRet = register_chrdev(major, NAME_MOUDULE, &gpio_test_driver);
- if (iRet < 0) {
- printk(KERN_INFO"#######unable to register a chr device\r\n");
- return iRet;
- }
- #endif
- return iRet;
- }
- static void __exit GpioTestExit(void)
- {
- #if USE_MISC_MODE
- misc_deregister(&gpiotest_misc_device);
- #else
- unregister_chrdev(major, NAME_MOUDULE);
- #endif
- printk(KERN_INFO"#######GpioTest modules is exit!\r\n");
- }
- module_init(GpioTestInit);
- module_exit(GpioTestExit);
- MODULE_AUTHOR("david.hu<343556608@qq.com>");
- MODULE_LICENSE("GPL");
- MODULE_DESCRIPTION("Gpio117 Test driver");
3,直接编译:
make uImage
拷到小板上升级运行
注意启动的过程有打印:
[ 3.730712] #######GpioTest modules is install!
这里表示我们的驱动已经合入NK里去了,当然我们也可以命令:ls /dev,可以看到有GpioTest这个存在
4,写测试APP
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/ioctl.h>
- #include <unistd.h>
- #include <sys/stat.h>
- #include <linux/input.h>
- #include <fcntl.h>
- int main(int argc, charchar *argv)
- {
- int fd;
- fd = open("/dev/GpioTest", O_RDWR);
- if(fd < 0)
- {
- printf("***Can't open the gpiotest!\r\n");
- return -1;
- }
- ioctl(fd, 0, 0);
- close(fd);
- printf("***App run over!\r\n");
- return 1;
- }
将编译的.out文件拷到小机上面运行,看是不是会打印正确的结果。
二,字符设备驱动的实现
1,代码的实现,请将上面MISC的代码里#define USE_MISC_MODE1改成0
2,makefile的实现
- KERNEL_DIR := /home/ding/workdir/david/EVMBoard/board-support/linux-3.2
- PLATFORM := "am335x-evm"
- MACHINE_NAME := "am335x"
- # If CROSS_COMPILE is not set by Rules.make then set a sane default
- CROSS_COMPILE ?= arm-arago-linux-gnueabi-
- export CROSS_COMPILE
- obj-m := GpioTestDriver.o
- MAKE_ENV = ARCH=arm
- PWD := $(shell pwd)
- all:
- $(MAKE) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" -C $(KERNEL_DIR) $(MAKE_ENV) \
- M=$(PWD) modules
- clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers
3,将编译的ko拷入小机,然后命令:
- insmod ./GpioTestDriver.ko
- lsmod
- mknod /dev/GpioTestDriver c 251 0
4,实现APP的代码
将上面MISC的代码作如下修改:
- fd = open("/dev/GpioTestDriver", O_RDWR);
5,运行APP查看结果
总结:两个驱动代码实现差不多,但是步骤不一样,主要体现在模块需要安装。MISC会自动创建设备文件,它的主设备号是10,字符设备需要我们来指定。
可安装的字符设备对驱动的编写测试是非常有帮助的。
http://blog.csdn.net/hudaweikevin/article/details/16826995
Am335x 下GPIO控制实例-驱动程序(转)的更多相关文章
- linux设备驱动程序--gpio控制
gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...
- python环境下实现OrangePi Zero寄存器访问及GPIO控制
最近入手OrangePi Zero一块,程序上需要使用板子上自带的LED灯,在网上一查,不得不说OPi的支持跟树莓派无法相比.自己摸索了一下,实现简单的GPIO控制方法,作者的Zero安装的是Armb ...
- Linux下GPIO驱动
编写驱动程序,首先要了解是什么类型的设备.linux下的设备分为三类,分别为:字符设备,块设备和网络设备.字符设备类型是根据是否以字符流为数据的交换方式,大部分设备都是字符设备,如键盘,串口等,块设备 ...
- sys下gpio操作
gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射 * 控制GPIO的目录位于/sys/class/gpio * /sys/class/gpio/export文 ...
- 树莓派Zero W GPIO控制
作者:陈拓 chentuo@ms.xab.ac.cn 2018.06.09/2018.07.05 0. 概述 本文介绍树莓派 Zero W的GPIO控制,并用LED看效果. 0.1 树莓派GPIO编 ...
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- Java设计模式09:单例模式的强化(控制实例个数n)
1. 单例模式的本质: 控制实例数目(目的节约资源) 2. 单例模式体现的一些思想: (1)延迟装载(Lazy Load):懒汉式 (2)缓存:饿汉式 3. 单例模式的变形使用: 控制使用实例个数为3 ...
- linux下socket编程实例
linux下socket编程实例一.基本socket函数Linux系统是通过提供套接字(socket)来进行网络编程的.网络的socket数据传输是一种特殊的I/O,socket也是一种文件描述符.s ...
- 解决 RecyclerView 在Android Studio已经导入情况下还无法实例引用问题
系统:Windows 10 IDE::android studio 1. 问题:RecyclerView 在Android Studio已经导入情况下还无法实例引用问题 由于RecyclerView是 ...
随机推荐
- Win10下安装Go开发环境
关于Go语言有多么值得学习,这里就不做介绍了,既然看了这篇文章,想必是对有学习意向. 这里是在Windows下安装Go环境,去中文社区的下载栏目,https://studygolang.com/dl ...
- CSS3:{*zoom:1;}作用
CSS3:{*zoom:1;}作用 zoom:1的常见作用: zoom是IE专用属性,firefox等是不支持的.它的本来作用是设置或检索对象的缩放比例,但这作用几乎用不到. 可以让网页实现IE7中的 ...
- Javaworkers团队第二周项目总结
本周项目进展 本周我们小组成员在图书馆和网上查阅了很多资料,基本达到了预期的计划,完成了项目框架设计及代码模块设计. 设计思路 1.首先,根据用户需求合理分配代码密度,即: 用户直接操作(点击运行)的 ...
- Codeforces 909C Python Indentation:树状数组优化dp
题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...
- NYOJ 720 DP+二分
项目安排 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个 ...
- SPOJ COMPANYS Two Famous Companies 最小生成树,二分,思路 难度:2
http://www.spoj.com/problems/COMPANYS/en/ 题目要求恰好有k条0类边的最小生成树 每次给0类边的权值加或减某个值delta,直到最小生成树上恰好有k条边为0,此 ...
- SGU 131. Hardwood floor 状压dp 难度:2
131. Hardwood floor time limit per test: 0.25 sec. memory limit per test: 4096 KB The banquet hall o ...
- Python自动化运维之路-01
python的主要应用 python的擅长领域 学python有没有前途?python的语言排名 语言选择 运维会了开发后可以干什么? python的最大优势就是什么都能做. 课程概述 毕业目标 周五 ...
- XML——DTD
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- C#如何弹出输入框
在C#中,进行windows窗体应用程序编程的时候,经常需要弹出输入框,输入密码,输入文本之类的.然而,C#中没有直接弹出输入框的语句,MessageBox只能显示一段消息而不能输入.我们需要调用Mi ...