mmap通过PCI将VME总线重叠到用户空间内存中?

时间:2009-07-31 14:32:22

标签: c++ linux mmap pci-bus

我正在尝试通过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);

然后“bar”可以正常用于读/写。

对于VME,以及Tundra Universe II PCI-VME桥接芯片: -

我应该打开“/ dev / vme_m0” 我从哪里映射我的BAR? lspci -vv:“区域1:内存80020000”

此外,VME BUS中的地址偏移了0x20000000,那么它如何工作来访问/映射它?!

(使用Linux 2.6.18-128.el5#1 SMP) (需要新标签“vme”!)

1 个答案:

答案 0 :(得分:1)

/ dev / vme_m0来自哪里以及它代表什么?如果不了解更多信息,很难说它会打开和访问它。

您需要查看桥芯片手册,了解区域1的读/写将如何转换为VME总线上的读/写。桥芯片应该有一组定义PCI的寄存器 - &gt; VME地址转换。通过访问0x80020000生成的VME地址将取决于其中一个寄存器中指定的VME地址。