현철님 조언데로 mmap()을 이용해서 테스트를 해봤습니다.
<test code>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define OLED_ADDR 0x50400000
int main(int argc, char* argv[])
{
int fd, i, result = 0;
unsigned char *oled;
fd = open("/dev/mem", O_RDWR);
if(fd == -1)
{
printf("/dev/mem file Open failedn");
exit(EXIT_FAILURE);
}
oled=(volatile unsigned char* )mmap(NULL,1,PROT_READ|PROT_WRITE
MAP_SHARED,fd,
OLED_ADDR);
if(oled == MAP_FAILED)
{
printf("mmap function failedn");
result = -1;
goto fail;
}
for(i=0; i<100; i++)
*oled = 0xFF;
munmap(NULL, 1);
fail:
close(fd);
if(result == -1)
exit(EXIT_FAILURE);
else
exit(EXIT_SUCCESS);
}
mmap()으로 테스트 했더니 device에 접금을 합니다.
I/O memory를 이용했던 드라이버에서는 왜 접근을 못하는지
같은 방법으로 I/O memory를 사용한 char driver로 key driver는 만들어서 잘 동작하고 있습니다.
제가 뭔가 잘못을 한것 같은데... 어느 부분을 틀린건지 모르겠습니다.
드라이버에서 I/O memory를 사용하는데 있어서 특별히 주의 할점이 있는지 궁금합니다.
단....
I/O memory를 어떻게 생성했냐입니다....
여러가지 방법이 있습니다만...
1. MMU setting(arm에서의 domain mmu setting)을 위한 memory access
2. kernel 에서 ioremap을 이용한 접근(app에서는 당근 virt address)
3. mmap을 이용한 방법입니다......2의 경우도 3의 mmap을 이용해서 가능합니다.
위의 세 경우를 생각하셔서 결정하시기 바랍니다........^^