开发板本身配有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);
}
直接编译后
烧到板子,流水灯效果就完成了。