基于linux的led驱动程序实现

基于linux的led驱动程序实现

ID:38711280

大小:247.00 KB

页数:7页

时间:2019-06-18

基于linux的led驱动程序实现_第1页
基于linux的led驱动程序实现_第2页
基于linux的led驱动程序实现_第3页
基于linux的led驱动程序实现_第4页
基于linux的led驱动程序实现_第5页
资源描述:

《基于linux的led驱动程序实现》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、基于linux的led驱动程序实现一.博创开发平台硬件LED的实现博创开发平台设置了3个GPIO控制的LED和一个可直接产生外部硬件中断的按键,LED分别使用了S3C2410的GPC5,GPC6,GPC7三个GPIO,按键接到INT5中断。下面对S3C2410GPIO的各个寄存器作出说明,用GPIO控制的LED就是通过操作GPIO的各个寄存器进行配置和操作的。S3C2410包含GPA、GPB、……、GPH八个I/O端口。它们的寄存器是相似的:GPxCON用于设置端口功能(00表示输入、01表示输出、

2、10表示特殊功能、11保留不用),GPxDAT用于读/写数据,GPxUP用于决定是否使用内部上拉电阻(某位为0时,相应引脚无内部上拉;为1时,相应引脚使用内部上拉)。这里要稍微注意一点的地方是PORTA和其他几组端口的使用不太一样,这里不讨论A口,B到H组口的使用完全相同。以下是S3C2410手册上的数据[13]:图1.1S3C2410端口GPC口有16个IO口,查datasheet《S3C2410》所用的地址为:图1.2C组GPIO的地址即GPCCON地址为0x56000020,GPCDAT地址为

3、0x56000024,各位的设置具体见下图,则对应的GPCCON寄存器的位为:图1.3GPCCON寄存器相应的位这里用到了5,6,7三个口,CON寄存器要完成对对应口的设置工作,将相应的口设置为输出状态,其他的口不用考虑,设置为输出的话就是0x15<<10,这样3个IO口就设置为了输出。下面就可以通过向DATA口写入低电平来点亮LED,GPCDAT的各位分布如下,每一个bit对应一个口。图1.4GPCDAT的位分布GPCDAT有16位,我们这里要用到的就是5,6,7三位即将这3位设置为低电平点亮LE

4、D。具体使用情况见驱动的实现。这三个LED的硬件原理图如下:图1.5GPIO控制的LED硬件原理图二.通过GPIO控制的LED驱动程序本驱动中没有用到内核提供的write_gpio宏,对硬件地址的操作完全自己实现,可分为以下几部分:①模块的初始化和退出:intled_init(void){intret;ret=register_chrdev(MAJOR_LED,NAME,&leds_fops);port_addr=(unsignedlong)ioremap(0x56000020,0x8);if(re

5、t<0)gotofail;printk(KERN_INFONAME"initialized!!");return0;fail:printk(NAME"Cannotregistermajornumber%d!!",MAJOR_LED);unregister_chrdev(MAJOR_LED,NAME);returnret;}voidled_exit(void){iounmap(port_addr);printk(KERN_INFONAME"quit!!");unregister_chrde

6、v(MAJOR_LED,NAME);}module_init(led_init);module_exit(led_exit);module_init和module_exit为内核提供的接口,以模块方式插入到内核中时内核首先要找的就是这两个宏,找到对应的初始函数这里为led_init初始化模块,和卸载函数这里为led_exit当模块撤出内核时调用。这两个函数名称可以自己定义,但是module_init这个两个宏的名字不能改变,并且led_init的返回值类型必须为int型,led_exit的返回类型必

7、须为空。这两个函数只是告诉内核驱动模块在内核中了,但并不一定在使用它,而open和release是当设备被打开和关闭的时候才回被调用,模块不会退出内核。初始化函数led_init中主要完成的工作为:注册设备号和文件操作结构;映射内存地址空间;做出一定的错误处理。设备注册的工作由register_chrdev来完成,如果返回值是负值表示错误,0或者返回值为正值表示操作成功,其中MAJOR_LED为静态申请的主设备号定义为#defineMAJOR_LED237,NAME为设备的名称定义为#defineN

8、AME"leds",leds_fops为file_operations类结构体定义如下:staticstructfile_operationsleds_fops={owner:THIS_MODULE,open:led_open,release:led_close,ioctl:led_ioctl,};可以看出,此设备驱动要完成的工作只是简单的打开(open)、关闭(release)、通过应用程序传参数来控制LED(ioctl)。各函数的具体实现下面讲解。port_add

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。