응용프로그램에서 IO 읽기/제어

Posted at 2009/04/07 19:02 // in Programming // by Daniel

/dev/mem에 mmap을 쓰면 시스템의 물리 메모리에 접근 가능합니다.

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>

 

#define REALVIEW_SYS_BASE                   0x10000000
#define REALVIEW_SYS_100HZ_OFFSET           0x24
#define REALVIEW_SYS_24MHz_OFFSET           0x5C

int main( void )
{
    int fd;
    unsigned int *mapped_addr;
    unsigned int *p_sys24mhz;
    unsigned int *p_sys100hz;

    fd = open("/dev/mem", O_RDONLY | O_SYNC);
    if(fd==-1) {
        perror("open");
        return 1;
    }
    mapped_addr = (unsigned int *)mmap(0, 0x10000,
            PROT_READ, MAP_SHARED, fd, REALVIEW_SYS_BASE);
    //if (mapped_addr<0)
    //  perror("mmap");
    p_sys24mhz = mapped_addr+(REALVIEW_SYS_24MHz_OFFSET/sizeof(unsigned int));
    p_sys100hz = mapped_addr+(REALVIEW_SYS_100HZ_OFFSET/sizeof(unsigned int));
    printf("mapped addr= %p\n", mapped_addr);
    printf("p_sys100hz = %p\n", p_sys100hz);
    printf("*p_sys100hz = 0x%x\n", *p_sys100hz);
    printf("p_sys24mhz = %p\n", p_sys24mhz);
    printf("*p_sys24mhz = 0x%x\n", *p_sys24mhz);
    close(fd);
    return 0;
}

 

[root@target2 ~]# ./mmaptest
mapped addr= 0x40158000
p_sys100hz = 0x40158024
*p_sys100hz = 0x396fe45
p_sys24mhz = 0x4015805c
*p_sys24mhz = 0x778161b0

 

이렇게 쓰면 됩니다.
/dev/mem을 open하고 mmap을 이 fd에 대해 하면 됩니다.

크리에이티브 커먼즈 라이센스
Creative Commons License