[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 メーリングリストの案内