2009-07-31 4 views
4

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

Répondre

1

Où/dev/vme_m0 viennent et qu'est-ce que cela représente? Il est difficile de dire ce que l'ouverture et l'accès feront sans en savoir plus.

Vous devez consulter le manuel de la puce de pont pour comprendre comment une lecture/écriture vers la 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 les traductions d'adresse PCI -> 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.

+0

"/ dev/vme_m0" vient de "mknod vme_m0 c 221 0". –

+0

La réponse provient d'une bibliothèque fournie pour emballer le module noyau! "int map = vme_mmap (DeviceHandle, mmap_offset, longueur, & UserAddress);" –

Questions connexes