2012-04-13 4 views
2

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

答えて

2

設定には多少の違いがあります。試してみることができるmmap()の64ビット版があります:mmap64()それがうまくいかない場合は、各36ビットレジスタの上位と下位のレジスタをマップする必要があります。

+0

mmap64()は、私が欲しいものを取得しているようです。私はその日のより良い部分を壁に向かって頭を叩きながら過ごしました...ありがとう! – Andy

+1

@Andy:FWIW、グーグルの「36ビット」「mmap」は、この提案を最初のページに複数回表示します。 ; - ] – ildjarn

関連する問題