APM86290(ppc) SOC を搭載したボードがあります。これは、このタイプの開発への私の最初の進出であり、36 ビット アドレス (データシートによると) を使用してマップされた SPI コントローラーで作業しようとしています。mmap()
と を使用していくつかのレジスタを読み取りたい/dev/mem
。通常、これらの上位 4 ビットをアドレス指定する統一された方法はありますか? それとも、これはおそらくこのプロセッサ/コンパイラに固有のものですか? これが私が今それをやろうとしていた方法です。
#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 読み取りエラー 0x11000000 at 0x00000000_00000000
36ビットアドレスを使用して何かを切り捨てていないのではないかと思いましたが、cat /proc/iomem
effff8000-effffffff : ocm_mem
fa0000000-fa000001f : serial
私が期待している36ビット値を示しています。