2009-07-31 11 views
4

Ich versuche, einen VME-Adressraum über einen PCI-Bus in Benutzerbereich abzubilden, so dass ich regelmäßig Lese-/Schreibvorgänge auf dem Speicher durchführen kann. Ich habe dies wie diese mit anderen PCI-Gerät durchgeführt: -mmap, um den VME-Bus über eine PCI in den Speicher des Benutzerspeichers zu legen?

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); 

Und dann „bar“ kann in der Regel bis zum Lesen verwendet werden/schreibt.

So zu VME, und mit einem Tundra Universe II PCI-VME-Bridge-Chip: -

Soll ich öffnen "/ dev/vme_m0" Wo ordne ich den BAR aus? lspci -vv: "Region 1: Speicher bei 80020000"

Auch die Adressen innerhalb des VME BUS sind um 0x20000000 versetzt, also wie funktioniert das beim Zugriff/Mapping?

(mit Linux 2.6.18-128.el5 # 1 SMP) (neuen Tag Need "VME"!)

Antwort

1

Wo/dev/vme_m0 kommen und was stellt es dar? Es ist schwer zu sagen, welche Öffnung und Zugriff es tun wird, ohne mehr zu wissen.

Sie müssen sich das Handbuch des Bridge-Chips ansehen, um herauszufinden, wie ein Lese-/Schreibzugriff auf Region 1 auf einen Lese-/Schreibzugriff auf den VME-Bus übergeht. Der Bridge-Chip sollte eine Reihe von Registern haben, die PCI-> VME-Adressumsetzungen definieren. Die durch den Zugriff auf 0x80020000 erzeugte VME-Adresse würde von der in einem dieser Register angegebenen VME-Adresse abhängen.

+0

"/ dev/vme_m0" kommt von "mknod vme_m0 c 221 0". –

+0

Die Antwort kommt von einer Bibliothek, die mitgeliefert wurde, um das Kernelmodul zu umhüllen! "int map = vme_mmap (Gerätehandle, mmap_offset, Länge, & UserAddress);" –