【问题标题】:mmap to overlay VME bus into user space memory over a PCI?mmap 通过 PCI 将 VME 总线覆盖到用户空间内存中?
【发布时间】:2009-07-31 14:32:21
【问题描述】:

我正在尝试通过 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 : "Region 1: Memory at 80020000"

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

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

【问题讨论】:

    标签: c++ linux mmap pci-bus


    【解决方案1】:

    /dev/vme_m0 来自哪里,它代表什么?在不了解更多信息的情况下,很难判断打开和访问它会做什么。

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

    【讨论】:

    • "/dev/vme_m0" 来自"mknod vme_m0 c 221 0"。
    • 答案来自提供用于包装内核模块的库! "int map = vme_mmap(DeviceHandle, mmap_offset, length, &UserAddress);"
    猜你喜欢
    • 2017-03-16
    • 2016-03-10
    • 2018-03-27
    • 1970-01-01
    • 2015-01-04
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多