2009-07-31 18 views
4

我试图通过PCI总线将VME地址空间映射到用户空间,以便我可以在内存上执行常规读/写操作。 我有这样的另一个PCI设备做到了这一点: -mmap通过PCI将VME总线叠加到用户空间内存中?

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,并与苔原宇宙II PCI-VME桥接芯片: -

我应该打开 “的/ dev/vme_m0” 我在哪里地图从我的吧? lspci -vv:“Region 1:Memory at 80020000”

此外VME总线内的地址偏移0x20000000,那么如何访问/映射它呢?!

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

回答

1

哪里的/ dev/vme_m0来自何方,它代表什么?不知道更多信息,很难说出它的开放和访问权限。

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

+0

“/ dev/vme_m0”来自“mknod vme_m0 c 221 0”。 – 2009-12-07 10:57:29

相关问题