4

メモリで通常の読み取り/書き込みを実行できるように、PCI バスを介して VME アドレス空間をユーザー空間にマップしようとしています。私はこのような別の PCI デバイスでこれを行いました:-

unsigned long *mapArea(unsigned int barAddr, unsigned int mapSize, int *fd)
{
    unsigned long *mem;

    *fd = open("/dev/mem", O_RDWR);
    if ( *fd<0 ) {
       printf("Cannot open /dev/vme_mem\n");
    exit(-1);
}

unsigned long *mem = (unsigned long*) mmap ( 0, mapSize, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, *fd,  barAddr); 
if ( (mem == NULL) || (mem == (unsigned long*)-1) ) {
    printf ( "Cannot map memory, error is %s\n", strerror(errno) );
    exit(-1);
    }

    return mem;
}

volatile unsigned long *bar = (volatile unsigned long *)mapArea(barAddr, mapSize, &fd);

そして、「バー」は読み取り/書き込みに通常どおり使用できます。

したがって、VME​​ には、Tundra Universe II PCI-VME Bridge チップを使用します:-

「/dev/vme_m0」を開く必要がありますか? どこから BAR をマップしますか? lspci -vv : 「リージョン 1: 80020000 のメモリ」

また、VME バス内のアドレスは 0x20000000 だけオフセットされているため、アクセス/マッピングに関してどのように機能するのでしょうか?!

(Linux 2.6.18-128.el5 #1 SMP を使用) (新しいタグ "vme" が必要です!)

4

1 に答える 1

1

/dev/vme_m0 はどこから来て、何を表しているのですか? 詳細を知らずに、それを開いてアクセスすることで何ができるかを判断するのは困難です。

リージョン 1 への読み取り/書き込みが VME バスでの読み取り/書き込みにどのように変換されるかを理解するには、ブリッジ チップのマニュアルを参照する必要があります。ブリッジ チップには、PCI -> VME アドレス変換を定義する一連のレジスタが必要です。0x80020000 にアクセスすることによって生成される VME アドレスは、これらのレジスタの 1 つに指定された VME アドレスに依存します。

于 2009-07-31T23:24:40.997 に答える