Je sais qu'il existe plusieurs méthodes pour acceder aux matériels des RPI, librairies WiringPi, /sys/class/gpio etc..., mais je cherche le moyen d’accéder aux registres périphériques du GPIO,SPI,I2C directement.
Après une recherche sur le net je suis tombé sur une méthode qui a l'air de fonctionner , puisqu’on la retrouve déclinée différemment sur plusieurs sites et qui, bien évidemment , ne fonctionne pas chez moi.
Il s'agit de mapper la plage d'adresse des registres à l'aide de la commande mmap.
Je n'ai aucune erreur, cependant rien ne se passe, comme si les écritures dans la plage mappée ne fonctionnait pas ou n’était pas synchronisée avec le matériel. et lancer le programme en sudo ou directement en root ne change rien
Voici le code, abrégé, que j'utilise. il a été récupéré sur le site de pieter-jan:
Code : Tout sélectionner
//INITIALISATION
if ((p->mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) {
printf("Failed to open /dev/mem, try checking permissions.\n");
return -1;
}
p->map = mmap(
NULL,
BLOCK_SIZE,
PROT_READ|PROT_WRITE,
MAP_SHARED,
p->mem_fd,
p->addr_p
);
if (p->map == MAP_FAILED) {
perror("mmap");
return -1;
}
p->addr = (volatile unsigned int *)p->map;
//UTILISATION
*(p.addr) &= 0xffff8fff; // GPIO4 en entrée
*(p.addr) |= 0x00001000; // GPIO4 en sortie
*(p.addr+7)=0x00000010; // GPIO4 à '1'
*(p.addr+10)=0x00000010; // GPIO4 à '0'
Quelqu'un a-t-il été confronté à ce problème ?
Une idée peut être ?