暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

走进Linux设备驱动程序的第一步——点亮led

IT大咖说 2020-04-26
806

本篇文章来学习嵌入式Linux驱动程序开发中的第一步——点亮led。

驱动程序开发的步骤主要分为以下几个部分:

  1. 根据原理图确定相关引脚;

  2. 查看芯片手册(以我的板子来说就是三星平台EXYNOS4412系列);

  3. 编写驱动程序;

  4. 编写用于测试的应用程序;

以上的驱动程序开发过程,不仅仅只是在Linux中,在所有的嵌入式软件开发中,也基本都是遵循这套流程。

特别说明:第一个步骤和第二个步骤我将直接跳过(查看原理图和芯片手册),因为这两者取决于我们的硬件平台,大家可以根据具体的应用进行修改即可。重点放在第三个步骤和第四个步骤,也就是编写驱动程序和测试程序。


下面进行详细的讲解

编写驱动程序

(1)确认led所连接的引脚,led1、led2分别连接的引脚为EXYNOS4_GPD0(0)和EXYNOS4_GPD0(1),此处的EXYNOS4_GPD0(0)是一个宏,该宏是IO引脚的结构描述,两个led定义为一个数组的代码如下:



(2)写使用到的两个gpio申请,且申请成功之后将他们配置为输出模式,同时保持默认高电平,根据原理图可知当低电平时led打开,所以开机led默认关闭,代码如下:



(3)对应上一步,写释放申请的gpio,代码如下:



(4)写led设备与文件操作相关的函数(在本例中主要是open()函数和ioctl()函数等),代码如下:


open函数和release函数


ioctl函数

然后将实现的文件操作函数填充到file_operations结构体中,如下:




由于在本例中不使用read()、write()和llseek()等函数,所以可以不用写这些文件操作函数的具体实现。


(5)写模块入口函数和模块出口函数,代码如下:

在模块入口函数中,主要完成注册设备、设备初始化、将设备注册到系统、创建设备节点以及申请gpio并初始化。

模块入口函数——前半部分


模块入口函数——后半部分


在模块出口函数中,主要完成一些释放工作,例如注销设备、注销设备节点、释放gpio等。

模块出口函数

最后修饰入口函数和出口函数,以及模块的许可证声明即可:




编写用于测试的应用程序

代码如下:



实现的效果为:运行测试程序,输入可执行文件名,并输入两个控制参数,第一个参数决定控制哪一个led,第二个参数决定是点亮led还是关闭led,如果输入参数个数不等于3时不能控制点灯。


在文章结束部分作一些总结:

  1. 对宏定义EXYNOS4_GPL2(0)的操作实际上就是对4412芯片管脚寄存器的操作;

  2. 上层程序员(包括驱动工程师)不用关心物理地址和虚拟地址具体是多少,只需要对一组宏定义操作,就是对4412内部寄存器操作;

  3. 关于led管脚的申请、赋值以及配置所使用到的主要函数为:GPIO申请函数和赋值函数gpio_request – gpio_set_value()、三星平台的GPIO配置函数s3c_gpio_cfgpin()、GPIO配置输出模式的宏变量S3C_GPIO_OUTPUT。

通过对普通GPIO的操作,大家可以了解到,学习驱动的过程中,很大一部分时间实际上是用于熟悉库函数的使用。其实无论什么驱动都没有想象的那么难,一般性的方法都是先了解和掌握和对应驱动相关的库函数。

最后在掌握驱动库函数的基础上,掌握Linux架构,驱动自然很容易写出来或者很容易就移植成功,希望此篇文章可以帮助读者初步进入嵌入式Linux设备驱动的世界。




来源:

https://www.toutiao.com/a6815908961011630596/

“IT大咖说”欢迎广大技术人员投稿,投稿邮箱:aliang@itdks.com



来都来了,走啥走,留个言呗~




 IT大咖说  |  关于版权 

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。投稿、约稿、转载请加微信:ITDKS10(备注:投稿),茉莉小姐姐会及时与您联系!

感谢您对IT大咖说的热心支持!



相关推荐


推荐文章


最后修改时间:2020-04-27 08:10:16
文章转载自IT大咖说,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论