[Suzaku:00450] Re: Suzaku-VのLinuxアプリでMemory Fault

email@hidden
2006年 1月 30日 (月) 22:34:04 JST


雨海@サンリツオートメイションです

HLDC上村 <email@hidden> さん wrote
>if(*(volatile unsigned long *)0xF0FF4108 <= 0x00){
>    *(volatile unsigned long *)0xF0FF4104 = 0x034BC000;
>    *(volatile unsigned long *)0xF0FF4100 = 0x00000482;
>}

一旦メモリマップをする必要があります。
必ずしもドライバを書く必要はありません。


こんな感じでどうでしょうか?
(以下のコードは、実際には動かしてみていないので、エラーが
あるかもしれません。)


// このincludeが必要。他のincludeを適宜追加。
#include <sys/mman.h>

// 使用するIOアドレスの先頭
#define IOSTART  0xF0FF4100

// マッピングする領域のサイズ
#define IOMAPSIZE 256

// 各レジスタのアドレス
#define REGADDR1 0xF0FF4108
#define REGADDR2 0xF0FF4104
#define REGADDR3 0xF0FF4100

main()
{
    int fd;
    char *base;
    volatile unsigned long *reg1;
    volatile unsigned long *reg2;
    volatile unsigned long *reg3;
    
    fd = open("/dev/mem", O_RDWR, S_IRWXU);
    if( fd == -1 ){
        fprintf(stderr, "Failed to open /dev/mem");
        return 1;
    }
    
   // マップした先頭アドレスがbaseに得られる
    base = (char *)mmap( NULL, (size_t)IOMAPSIZE, 
        PROT_READ | PROT_WRITE, MAP_SHARED, fd, IOSTART);

    if( base == MAP_FAILED ){
        fprintf(stderr, "mmap() failed\n");
        close(fd);
        return 1;
    }

    reg1 = (unsigned long *)&base[((caddr_t)REGADDR1 - (caddr_t)IOSTART)];
    reg2 = (unsigned long *)&base[((caddr_t)REGADDR2 - (caddr_t)IOSTART)];
    reg3 = (unsigned long *)&base[((caddr_t)REGADDR3 - (caddr_t)IOSTART)];
    
    *reg1 = 0x12345678;	// なんらかの操作

    // マッピングを解除
    munmap((caddr_t)base, (size_t)IOMAPSIZE);
    close(fd);
    return 0;
}

----
Sanritz Automation
ITE Div. R&D Group
Akihiro AMAGAI<email@hidden>




suzaku メーリングリストの案内