OK6410A 之mmap 方式操作LED流水灯效果


开发板本身配有LED的驱动,且有测试程序,用MMAP方式,完全是为了实验MMAP功能。

在OK6410板子上,修改了原来的SPI功能,实现了SPI驱动,且测试功能一切正常,但是数据交换速度相当不理想,通过示波器看,有320us的间隔时间内系统在玩耍。

GPIO模拟SPI的速度就更别想了,还慢,其及其浪费系统资源。


于是想通过MMAP方式,直接操作硬件寄存器完成对SPI的 操作,感觉LED功能就像“hello world”一样的经典   ,于是就想到用LED测试mmap的功能,关于MMAP的描述,网上资料繁多,就不搬过来了


直接上代码:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>

#define uint unsigned int
#define uchar unsigned char
void delay(volatile unsigned int time)
{
	volatile unsigned int x,y;
	for(x=0;x<2000;x++)
		for(y=0;y<time;y++);
}

int main()
{
			int fd;
			int i;
			volatile unsigned char *map;
			volatile unsigned int *GPMCON;
			volatile unsigned int *GPMDAT;
			volatile unsigned int *GPMPUD;
			char buf[100];
<span style="white-space:pre">			</span>//OK6410A的板子已经实现哦,在“/dev/mem”,如下
			if(-1==(fd=open ("/dev/mem", O_RDWR)))
					 {
	       	 		printf("open dev0 error\n");
	        		_exit(EXIT_FAILURE);
	    		}
	    map = (volatile unsigned char*)mmap(NULL,1024*5, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x7f008000);
			if(map == NULL)
     		{
        		printf("mmap err!\n");
	       		return 0;
   			}   
	
			GPMCON=(volatile unsigned int*)(map+0x820);
			GPMDAT=(volatile unsigned int*)(map+0x824);
			GPMPUD=(volatile unsigned int*)(map+0x828);
			
			*GPMCON=0x11111;
			*GPMPUD=0x00;
			*GPMDAT=0x1f;

			printf("init is finishing!\n");
	   	while(1)
			{
				for(i=0;i<4;i++)
				{
					*GPMDAT=~(1<<i);
					delay(15000);
				//	printf("led is %d :  \n",i+1);
				}
			}
      munmap((char*)map,1024*5);               
	    close(fd);
}


代码很简单,具体可以参考开发板的驱动部分。

直接编译后

烧到板子,流水灯效果就完成了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值