私はそれにAPM86290(ppc)SOCのあるボードを持っています。これはこのタイプの開発への私の最初の進出であり、36ビットアドレスを使用してマップされたSPIコントローラ(データシートによる)で動作しようとしています。私はmmap()
と/dev/mem
を使っていくつかのレジスタを読みたいと思います。通常、これらの上位4ビットに対処するための統一された方法はありますか?または、これはこのプロセッサ/ compilerに固有の可能性がありますか?これは今私がそれをやろうとしていた方法です。36ビットを使用してマッピングされたIOをどのようにアドレス指定しますか?
#define OFFSET 0xfa0000000
int main()
{
int i;
unsigned int * someRegister;
int fd = open("/dev/mem",O_RDWR|O_SYNC);
if(fd < 0)
{
printf("Can't open /dev/mem\n");
return 1;
}
someRegister = (unsigned int *) mmap(0, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, OFFSET);
if(someRegister <= NULL)
{
printf("Can't mmap\n");
return 1;
}
else
{
printf("register=%x\n",OFFSET);
printf("contents=%x\n",*someRegister);
}
return 0;
}
上記のプログラムの出力は、カーネルモードでは、これらのエラー
マシン・チェックを返します。
命令読むPLBエラー
PLBマスタポートのリクエストエラー
PLBが0x00000000_00000000
でエラー0x11000000を読んで、私は多分それは36bitのアドレスを使用して何かを切り捨てていなかったと思ったが、私はcat /proc/iomem
effff8000-effffffff : ocm_mem
fa0000000-fa000001f : serial
これは私が期待している36ビット値を示しています。
mmap64()は、私が欲しいものを取得しているようです。私はその日のより良い部分を壁に向かって頭を叩きながら過ごしました...ありがとう! – Andy
@Andy:FWIW、グーグルの「36ビット」「mmap」は、この提案を最初のページに複数回表示します。 ; - ] – ildjarn