【发布时间】: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”!)
【问题讨论】: