使用io内存控制硬件点亮led灯

使用io内存控制硬件点亮led灯

ID:10519461

大小:118.50 KB

页数:20页

时间:2018-07-07

使用io内存控制硬件点亮led灯_第1页
使用io内存控制硬件点亮led灯_第2页
使用io内存控制硬件点亮led灯_第3页
使用io内存控制硬件点亮led灯_第4页
使用io内存控制硬件点亮led灯_第5页
资源描述:

《使用io内存控制硬件点亮led灯》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux中控制GPIO点亮LED的方法有好几种。一种是使用内核提供的专门用来控制GPIO的函数来点亮LED,如:s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);             s3c2410_gpio_setpin(led_table[i],0);一种是通过IO内存获取硬件地址从而控制GPIO来点亮LED,如:void*ioremap(unsignedlongphys_addr,unsignedlongsize);voidioumap(void*addr);这里主要介绍第二种点亮LED方式。1.理论支撑1.1IO内存分配和映射1

2、.1.1在使用IO内存之前首先分配IO内存区域。分配和撤销IO内存区域使用的函数如下:      #include      structresource*request_mem_region(unsignedlongstart,unsignedlonglen,char*name);参数说明:start分配内存起始地址               len 分配内存长度         返回成功非NULL,否则返回NULL。相应的释放函数:             voidrelease_mem_region(unsignedlongstart,unsignedl

3、onglen); 1.1.2在linux中不能使用实际的物理地址,要对指定的物理地址进行操作必须先将物理地址映射到虚拟地址中。下面的函数就是实现物理地址到虚拟地址的映射:#includevoid*ioremap(unsignedlongphys_addr,unsignedlongsize);参数说明:phys_addr需要访问的物理内存(寄存器)的首地址              size      内存区域大小返回与该段物理地址对应的虚拟地址      相应的撤销映射关系的函数是:voidioumap(void*addr); 1.1.3使用IO内存时,request_me

4、m_region函数并不是必须的,该函数只是在内核中标志该内存区域已经分配出去,不能再进行分配出去。但是,这不不是说别的驱动不能再使用该IO内存。至于能不能使用,分下面2种情况:      1.两个驱动都用request_mem_region分配相同的IO内存,则两个驱动只能有一个驱动可以使用。      2.两个驱动只有一个使用了request_mem_region函数,那么这两个驱动可以同时使用,并可以同时访问该IO内存。 1.2访问IO内存      ioremap函数的返回值可以直接当做指针(指向对应的物理内存(寄存器)地址)使用,但是这种使用方式不具有可移植性。使用下面的访问IO内存

5、的专用函数符合可移植性要求。 从I/O内存读取,使用下列函数之一:unsignedintioread8(void*addr);unsignedintioread16(void*addr);unsignedintioread32(void*addr);参数:addr是从ioremap获得的地址(可能包含一个整数偏移量)返回值:从给定I/O内存读取的到的值 相应的有一系列函数来写I/O内存:voidiowrite8(u8value,void*addr);voidiowrite16(u16value,void*addr);voidiowrite32(u32value,void*addr);参数:va

6、lue要写入IO内存值     addr所要写入的IO内存地址 2.具体操作与实现2.1只使用ioremap映射GPIO寄存器实现LED点亮      内核模块代码(基于mini2440开发板的4个LED)如下:/*************************************************************************/#include#include#include volatileunsignedlongvirt,phys;//用于存放虚拟地址和物理地址volatileu

7、nsignedlong*GPBCON,*GPBDAT,*GPBUP;//用与存放三个寄存器的地址 voidled_device_init(void){     //0x56000000+0xd0包揽全所有的IO引脚寄存器地址      phys=0x56000000;//0x56000000=GPACON      //在虚拟地址空间中申请一块长度为0xd0的连续空间      //这样,物理地址

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

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

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