mmap pour superposer le bus VME dans la mémoire de l’espace utilisateur via un port PCI?
Question
J'essaie de mapper un espace d'adressage VME via un bus PCI sur un espace utilisateur afin de pouvoir effectuer des lectures / écritures régulières en mémoire. Je l'ai fait avec un autre périphérique PCI comme celui-ci: -
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);
Et ensuite "bar" peut être utilisé normalement pour les lectures / écritures.
Donc, pour VME, et avec une puce de pont PCI-VME Tundra Universe II: -
Dois-je ouvrir " / dev / vme_m0 " Où puis-je cartographier ma barre? lspci -vv: "Région 1: Mémoire à 80020000"
De plus, les adresses dans le bus VME sont décalées de 0x20000000. Comment cela fonctionne-t-il pour y accéder / le mapper?!
(Utilisation de Linux 2.6.18-128.el5 # 1 SMP) (Besoin d'un nouveau tag "vme"!)
La solution
D'où vient / dev / vme_m0 et que représente-t-il? Il est difficile de dire quelle ouverture et quel accès le fera sans en savoir plus.
Vous devez consulter le manuel de la puce de pont pour savoir comment une lecture / écriture en Région 1 se traduira par une lecture / écriture sur le bus VME. La puce de pont doit avoir un ensemble de registres qui définissent PCI - > Traductions d'adresses VME. L’adresse VME générée en accédant à 0x80020000 dépend de l’adresse VME spécifiée dans l’un de ces registres.