2

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ビット値を示しています。

4

1 に答える 1

2

それはあなたのセットアップに大きく依存します。試すことができる mmap() の 64 ビット バージョンがあります: mmap64()。それがうまくいかない場合は、36 ビット レジスタごとに上位レジスタと下位レジスタをマップする必要があるかもしれません。

于 2012-04-13T21:20:28.240 に答える