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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top