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"!)
"/ dev/vme_m0" kommt von "mknod vme_m0 c 221 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);" –