Je tente de mapper un espace d'adressage VME via un bus PCI dans l'espace utilisateur afin que je puisse effectuer des lectures/écritures régulières sur la mémoire. Je l'ai fait avec un autre périphérique PCI comme celui-ci: -mmap pour superposer le bus VME dans la mémoire de l'espace utilisateur sur un PCI?
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 puis « bar » peut être utilisé normalement pour la lecture/écriture.
Donc, pour VME, et avec une puce PCI-pont Tundra Univers VME II: -
Dois-je ouvrir "/ dev/vme_m0" Où dois-je map ma barre de? le lspci -vv: "Région 1: mémoire à 80020000"
Aussi les adresses dans le bus VME sont compensées par 0x20000000, alors comment cela fonctionne-t-il pour l'accès/le mappage ?!
(Utiliser Linux 2.6.18-128.el5 # 1 SMP) (Besoin nouvelle balise "vme"!)
"/ dev/vme_m0" vient de "mknod vme_m0 c 221 0". –
La réponse provient d'une bibliothèque fournie pour emballer le module noyau! "int map = vme_mmap (DeviceHandle, mmap_offset, longueur, & UserAddress);" –