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

来源:互联网 发布:魅族官网商城下载软件 编辑:程序博客网 时间:2024/05/20 16:13


开发板本身配有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 charvoid 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
原创粉丝点击