mmap per sovrapporre il bus VME nella memoria dello spazio utente su un PCI?
Domanda
Sto cercando di mappare uno spazio degli indirizzi VME attraverso un bus PCI nello spazio utente in modo da poter eseguire letture / scritture regolari sulla memoria. L'ho fatto con un altro dispositivo PCI come questo: -
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);
E poi " bar " può essere utilizzato normalmente per lettura / scrittura.
Quindi a VME e con un chip Bridge PCI-VME Tundra Universe II: -
Dovrei aprire " / dev / vme_m0 " Da dove posso mappare il mio BAR? lspci -vv: " Regione 1: memoria a 80020000 "
Anche gli indirizzi all'interno del BUS VME sono sfalsati di 0x20000000, quindi come funziona wrt accedendo / mappandolo ?!
(Uso di SMP Linux 2.6.18-128.el5 # 1) (Hai bisogno di un nuovo tag " vme " ;!)
Soluzione
Da dove viene / dev / vme_m0 e cosa rappresenta? È difficile dire che cosa farà l'apertura e l'accesso senza sapere di più.
È necessario consultare il manuale del chip bridge per capire come una lettura / scrittura nella Regione 1 si tradurrà in una lettura / scrittura sul bus VME. Il chip bridge dovrebbe avere un set di registri che definiscono PCI - > Traduzioni di indirizzi VME. L'indirizzo VME generato accedendo a 0x80020000 dipenderà dall'indirizzo VME specificato in uno di quei registri.