2009-07-31 22 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

相關問題