코드
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#define FND_PHYS_ADDR0 (0x14000000)
#define FND_PHYS_ADDR1 (0x14100000)
#define FND_PHYS_ADDR2 (0x14200000)
#define FND_PHYS_ADDR3 (0x14300000)
#define FND_SIZE (0x1000)
//#define FND (*((volatile unsigned short *)0xF1000000))
void * fnd_addr;
static char fnd_val[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x27,0x7f,0x67};
void fnd_write(int val)
{
*((unsigned char *)fnd_addr) = fnd_val[val];
*((unsigned char *)fnd_addr+1) = fnd_val[val];
printf("FND_Write(%d) done!!\n", val);
}
int main(void)
{
int retn;
int fd;
int flag = 0;
int type;
int val=0;
int i;
off_t addr[] = {FND_PHYS_ADDR0, FND_PHYS_ADDR1,
FND_PHYS_ADDR2, FND_PHYS_ADDR3};
off_t FND_PHYS_ADDR;
while(1)
{
printf("\n\n===== FND Test Program ====\n");
printf(" 0. FND0 Test\n");
printf(" 1. FND1 Test\n");
printf(" 2. FND2 Test\n");
printf(" 3. FND3 Test\n");
printf(" 4. Program Quit\n");
do {
printf(" Select Menu => ");
scanf("%d", &type);
} while(type<0 || type>4);
if(type == 4) break;
while(1)
{
printf("\nFND_%02d Test...\n", type-1);
do {
printf("Select FND Write Value(0~9,10.Quit) => ");
scanf("%d", &val);
} while(val<0 || val>10);
if(val == 10) break;
//fd = open("/dev/FND", O_RDWR);
fd = open("/dev/mem", O_RDWR|O_SYNC);
if (fd<0) {
perror("/dev/mem");
exit(-1);
}
else printf("/dev/mem detected(fd:%d)...\n", fd);
FND_PHYS_ADDR = (off_t)addr[type];
fnd_addr = mmap((void *)0,
FND_SIZE,
PROT_WRITE|PROT_READ,
MAP_SHARED,
fd,
FND_PHYS_ADDR);
if(fnd_addr == NULL) {
perror("mmap fail!!");
exit(-2);
}
printf("FND I/O Address : %p\n", fnd_addr);
fnd_write(val);
munmap(fnd_addr, FND_SIZE);
close(fd);
}
}
return 0;
}
'c or linux' 카테고리의 다른 글
개념 정리 (0) | 2011.04.22 |
---|---|
[공부중] 커널모듈을 zImage로 넣기 & 커널모듈을 동적 모듈로 로딩하기 (0) | 2011.04.22 |
/proc 커널 모듈 테스트 (0) | 2011.04.21 |
/proc/interrupts (0) | 2011.04.21 |
[공부중] bottomhalf & work queue (0) | 2011.04.21 |