2009年3月9日 星期一

使用mmap()存取MMIO registers

#include stdio.h
#include fcntl.h
#include string.h
#include sys/vfs.h
#include unistd.h
#include sys/mman.h
#include stdlib.h
#include errno.h

#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int

#define MSM_MDP_BASE 0xE0010000
#define MSM_MDP_PHYS 0xAA200000

#define MSM_MDP_SIZE 0x000F0000
#define MSM_MDP_MASK (MSM_MDP_SIZE-1)
int main(){


void *vaddr1,*vaddr2;

int errors = 0;
int fd;
fd = open("/dev/mem", O_RDWR | O_SYNC);
printf("/dev/mem opened.\n");
fflush(stdout);

vaddr1 = mmap(0, MSM_MDP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED,\
fd,MSM_MDP_PHYS & ~MSM_MDP_MASK);

if(vaddr1 == (void *) -1) {
printf("mapping error!!\n");
return -1;
}


vaddr2 = vaddr1 + (MSM_MDP_PHYS & MSM_MDP_MASK);

printf("vaddr1 %p, vaddr2 %p\n", vaddr1, vaddr2);
fflush(stdout);
printf("vsync period=%08X\n",*(volatile u32 *)(vaddr2+0xE0008));



munmap(vaddr1, MSM_MDP_SIZE);

close(fd);
return errors;

}

沒有留言: