




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于linux的led驱动程序实现一. 博创开发平台硬件LED的实现博创开发平台设置了3个GPIO控制的LED和一个可直接产生外部硬件中断的按键,LED分别使用了S3C2410的GPC5,GPC6,GPC7三个GPIO,按键接到INT5中断。下面对S3C2410 GPIO的各个寄存器作出说明,用GPIO控制的LED就是通过操作GPIO的各个寄存器进行配置和操作的。S3C2410包含GPA 、GPB 、GPH 八个I/O端口。它们的寄存器是相似的:GPxCON用于设置端口功能(00 表示输入、01表示输出、10 表示特殊功能、11 保留不用),GPxDAT 用于读/写数据,GPxUP 用于决定是否使用内部上拉电阻(某位为0 时,相应引脚无内部上拉;为1时,相应引脚使用内部上拉)。这里要稍微注意一点的地方是PORTA和其他几组端口的使用不太一样,这里不讨论A口,B到H组口的使用完全相同。以下是S3C2410手册上的数据13:图1.1 S3C2410端口GPC口有16个IO口,查datasheetS3C2410所用的地址为:图1.2 C组GPIO的地址即GPCCON 地址为0x56000020, GPCDAT地址为0x56000024,各位的设置具体见下图,则对应的GPCCON寄存器的位为:图1.3 GPCCON寄存器相应的位这里用到了5,6,7三个口,CON寄存器要完成对对应口的设置工作,将相应的口设置为输出状态,其他的口不用考虑,设置为输出的话就是 0x1510,这样3个IO口就设置为了输出。下面就可以通过向DATA口写入低电平来点亮LED,GPCDAT的各位分布如下,每一个bit对应一个口。图1.4 GPCDAT的位分布GPCDAT有16位,我们这里要用到的就是5,6,7三位即将这3位设置为低电平点亮LED。具体使用情况见驱动的实现。这三个LED的硬件原理图如下:图1.5 GPIO控制的LED硬件原理图二通过GPIO控制的LED驱动程序本驱动中没有用到内核提供的write_gpio宏,对硬件地址的操作完全自己实现,可分为以下几部分:模块的初始化和退出:int led_init(void)int ret;ret=register_chrdev(MAJOR_LED,NAME,&leds_fops);port_addr= (unsigned long )ioremap(0x56000020,0x8);if(reti_rdev);printk(NAMEopen success!n);return 0;static int led_close(struct inode *inode,struct file *filp)printk(NAMErelease!n);return 0;static int led_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg)switch(cmd)case 0:if(arg3)return -EINVAL;GPC_DAT=LED1_OFF|LED2_OFF|LED3_OFF;break;case 1:if(arg3)return -EINVAL;GPC_DAT=LED1_ON&LED2_ON&LED3_ON;break;default:return -EINVAL;return 0;以上函数的接口集合在file_operations结构中,实现了系统提供给用户程序的接口。Open函数在file_operations结构中的原型为 int (* open)(struct inode *,struct file *);这是设备的第一个操作,但是并不是要求驱动程序必须去实现这个方法,如果这个入口为NULL,那么设备的打开操作将永远成功,一般驱动程序中open要完成的工作有:增加使用计数;检查设备特定的错误;如果设备是首次打开,则对其进行初始化;识别次设备号,并且如果必要,更新f_op指针;分配并填写被置于filp-private_data里的数据结构。我的理解是,open函数就是要完成设备驱动和文件系统的关联,上面已经讲过file和inode两个结构的关系,这里参数中的两个结构正是系统在/dev创建设备节点后提供给驱动的文件结构。本驱动中的open实现只是完成了对C组GPIO的GPC_CON寄存器进行初始化,将3个LED对应的3个口设置为输出模式,定义格式如下:GPC_CON=GPC5_OUT|GPC6_OUT|GPC7_OUT;其中GPCX_OUT的定义为:#define GPC5_OUT(1(5*2)#define GPC6_OUT(1(6*2)#define GPC7_OUT(1private_data中的所有内容;在最后一次关闭操作时关闭设备;使用计数器减1。这里和上面的open函数都提到了一个模块计数,意思就是内核要统计这个模块被打开的次数,这样才不会在还有使用的情况下卸载模块,在早期的linux版本中,模块计数的工作要由驱动程序自己完成,用到类似于MOD_INC_USE_COUNT的宏来实现,现在的内核版本是内核自动维护这个计数,不用在驱动中实现,所以本驱动中的release函数并没有实现具体的操作。Ioctl在接口结构中的原型为:int (* ioctl)(struct inode *,struct file *,unsigned int, unsigned long);为用户程序的ioctl系统调用提供了一种执行设备特定命令的方法(即读写之外的操作),并且,内核还能识别一部分ioctl命令,而不必调用fops表中的ioctl。如果设备不提供ioctl入口点,则对于任何内核未定义的请求,ioctl系统调用将返回错误,如果该设备方法返回一个非负值,那么相同的值会被调用返回给调用程序以表示调用成功。本驱动中的关键部分就是这个函数。用户空间系统调用ioctl的原型为:Int ioctl(int fd , int cmd, );Inode 和file两个指针的值对应于应用程序所传递的文件描述符fd,参数cmd会不经修改地传递给驱动程序,可选参数无论是指针还是整数都以unsigned long的形式被传递给驱动程序,其实, ioctl实现的是一种switch语句选择功能。本驱动中此函数的功能为接受用户程序传下来的命令cmd和arg参数,然后选择命令对应的操作。Cmd参数在用户空间对应0或1,表示LED的亮还是灭,arg可以用来选择是哪个LED,但是在本驱动中没有使用,无论哪个LED都是对全部LED的操作。以下是关操作:GPC_DAT=LED1_OFF|LED2_OFF|LED3_OFF;其中LEDx_OFF的定义为:#define LED1_OFF(15)#define LED2_OFF(16)#define LED3_OFF(17)这样DAT中对应的位就被设置为1即高电平LED灭。以下是开操作:GPC_DAT=LED1_ON&LED2_ON&LED3_ON;其中LEDx_ON的定义为:#define LED1_ON(15)#define LED2_ON(16)#define LED3_ON(17)这样DAT中对应的位就被设置为0即低电平LED亮。三对于GPIO LED的测试App_gpio.c实现的功能为通过命令行参数控制LED的亮灭,这里要说明的一点是由于测试程序主要是完成的测试驱动是否正常工作的事情,所以测试程序中对某个LED选择的参数实际上是没作用的,不管针对哪个LED都是对全部的LED进行操作的。代码的具体实现见附录,这里只做简单的介绍。前面讲过要在/dev下面创建设备节点leds和dig_tube,所以第一步就要“打开”该设备即通过open系统调用(open(/dev/leds,O_RDWR)),然后通
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年 重庆永川区永荣镇村“村干”招录考试试题附答案
- 2025年 新乡市牧野区职业教育中心招聘考试笔试试题附答案
- 2024年中国优特钢行业市场调查报告
- 2025年 宁德市霞浦县卫生健康局招聘考试笔试试题附答案
- 2025年 赫章县中医医院招聘考试笔试试题附答案
- 2025年 楚雄州永仁县卫生健康系统医学类专业技术招聘考试笔试试题附答案
- 2025年 百色市西林县那劳镇储备村级后备人才招聘考试试题附答案
- 2025年中国曲面热转印机行业市场发展前景及发展趋势与投资战略研究报告
- 税务师网校选择指南
- 2019-2025年中国葵花籽行业市场调研分析及投资战略咨询报告
- 江西省南昌市第一中学教育集团2023-2024学年八年级下学期数学期末试卷(含答案)
- 2025盘锦市双台子区辅警考试试卷真题
- 教研员考试题库及答案
- 地生中考模拟试题及答案
- 慢性病管理中心建设实施方案
- T/CCMA 0163-2023履带式液压挖掘机维修工时定额
- 2025年下半年山西焦煤西山煤电集团公司招聘270人易考易错模拟试题(共500题)试卷后附参考答案
- 小红书《家的一平米》招商方案
- 2025海南中考:历史必考知识点
- 2025年二十大党章试题库
- 尺骨骨折护理课件
评论
0/150
提交评论