基于IMX6的GPIO驱动程序

Linux内核版本:linux-3.0.35 开发板: IMX6S MY-IMX6-EK200 编译环境:Ubuntu12 主要内容:IMX6S的IO驱动程序编写(ioctl) 实现功能:通过应用层程序控制底层IO的读写

一、驱动层

1、ioctl函数     ioctl函数从应用层传递给驱动层不同的cmd参数,驱动层根据传递的cmd参数,使用switch语句判别,来进行不同的工作。 函数:static long gpio_ioctl(struct file *file, unsigned int cmd, unsigned long arg); 参数:a、file:文件描述符;           b、cmd:command参数,根据自己的设定的cmd参数,进行不同的工作;           c、arg:应用层和驱动层数据的传递。     因此要写好一个ioctl的驱动程序,首先要学会如何正确设置cmd参数。     在驱动程序里, ioctl() 函数上传送的变量 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。cmd除了可区别数字外,还包含有助于处理的几种相应信息。 cmd的大小为 32位,共分 4 个域:           bit31~bit30 2位为 “区别读写” 区,作用是区分是读取命令还是写入命令。           bit29~bit15 14位为 “数据大小” 区,表示 ioctl() 中的 arg 变量传送的内存大小。           bit20~bit08 8位为 “魔数”(也称为”幻数”)区,这个值用以与其它设备驱动程序的 ioctl 命令进行区别。           bit07~bit00 8位为 “区别序号” 区,是区分命令的命令顺序序号。     要按照Linux内核的约定方法为驱动程序选择ioctl编号,因为如果不按照这个约定进行编写,就有可能因为cmd参数冲突问题不能正确调用ioctl函数。 2、为了合理使用ioctl函数,需要学习cmd参数的设置方法,查看Linux源码可以看到一下内容。     在include/asm/ioctl.h头文件中,我们可以看到供我们使用的创建cmd参数的方法。_IOC(dir,type,nr,size)是封装好的参数设置方法,在它的上一层,又封装了_IOW()和_IOR()进行IO的写和读的cmd参数设置方法。代码截图如下:

    从上面的图中可以看出,幻数’x’都没有使用,因此我们在设置cmd参数的时候,幻数的选择可以用幻数’x’。     因此,我们就可以定义自己的cmd参数。nr参数可以随意设置,范围是0~255。size参数也可以根据需求进行设置。我的cmd参数设置如下:

3、ioctl编写实例。     从下图可以看到,当cmd参数为DS_CS1_W时,通过gpio_direction_output()设置IO的方向为输出。通过__gpio_set_value()向底层写入1或0,当写入1时,IO输出高电平,当写入0时,IO输出低电平;当cmd参数为DS_CS1_R时,通过gpio_direction_input()设置IO的方向为输入。通过__gpio_get_value()读取IO引脚状态,并通过copy_to_user()将从底层读取的状态传递给应用层程序。其他引脚设置同理。

4、编译驱动程序     写好驱动层程序,使用Makefile,进行编译。编译好的**.ko文件拷贝到开发板,通过insmod指令进行加载即可。

二、应用层

1、应用层设置的cmd参数要和驱动层的cmd参数一致。 2、应用层的程序就好写多了,可以自己进行任意封装,可以使用如下的方式进行IO操作:

注意:应用层的ioctl函数的cmd参数是传递给驱动层用来区分不同操作的。arg参数是驱动层和应用层交换的数据,例如当写GPIO,arg=1时,应用层给驱动层传递1,驱动层控制GPIO为高电平;当读GPIO时,应用层通过驱动层传递过来的arg参数的值来判别GPIO的高低电平。 3、使用linux-arm-gcc交叉编译应用程序,将编译好的可执行文件拷贝到开发板即可运行。

三、测试

    驱动程序和应用测试程序均已测试通过,更为详细的内容可查看源代码,源代码下载地址:点击下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏李蔚蓬的专栏

Android实战_note1(MyMirror_一款小型摄像处理的App)

1.1 Activity.java全文: 注意代码中的注释,其中 handler.sendEmptyMessageDelayed(1,3000);...

10920
来自专栏進无尽的文章

编码篇-持久化NSUserDefaults

NSUserDefaults类,以字典形式保存数据,IOS会自动把字典中的键值对转换成对应的XML文件(也就是plist文件),这个文件会被保存到APP的沙盒目...

14810
来自专栏Android-薛之涛

Android-强,软,弱,虚引用

      啥是强引用?举个例子,我们平时new 的对象,就都是强引用。如: String s =new String(),这就是一个强引用,那么强引用有啥特点...

11210
来自专栏DannyHoo的专栏

The Operation couldn't be completed.(LaunchServicesError error 0.)

问题描述:当运行Xcode6时,编译代码成功,但是登陆模拟器失败,显示错误:The Operation couldn't be completed.(Launc...

24810
来自专栏游戏开发那些事

【Unity游戏开发】AssetBundle杂记--AssetBundle的二三事

  马三在公司大部分时间做的都是游戏业务逻辑和编辑器工具等相关工作,因此对Unity AssetBundle这块的知识点并不是很熟悉,自己也是有打算想了解并熟悉...

59820
来自专栏一个爱瞎折腾的程序猿

asp.net core合并压缩资源文件引发的学习之旅

重启vs2017,卧槽。一遍又一遍无响应(家里公司电脑都没有成功~)..幸好还有其他路可以走...

49320
来自专栏曾大稳的博客

Android aidl流程简单分析

我们通过写一个从服务端(另外一个进程)获取用户名和密码作为demo来进行源码讲解。

19330
来自专栏每日一篇技术文章

weex-10-组件a的使用

a标签使用起来比较简单,先留下一个问题,如果想要跳转到html页面怎么实现?我们后面会讲到!

15020
来自专栏清晨我上码

spring mvc 国际化的几种方案

通过设置浏览器请求测试:http://localhost:8080/xxx/nation/test

1.3K30
来自专栏DannyHoo的专栏

Xcode中插件的管理工具-----Alcatraz

Alcatraz 是一款 Xcode的插件管理工具,可以用来管理XCode的 插件、模版以及颜色配置的工具。

10810

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励