Page 1 sur 1

[RESOLU]Accès au périphérique du RPI en direct

Posté : sam. 14 nov. 2015 19:11
par B2V
Bonjour

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'

Je le teste sur un RPI 2 avec un Raspian Jessie.

Quelqu'un a-t-il été confronté à ce problème ?
Une idée peut être ? :roll:

Re: Accès au périphérique du RPI en direct

Posté : sam. 14 nov. 2015 21:43
par B2V
En complément...

Le débugger gdb m'indique que les valeurs dans la mémoire mmap sont bien modifiée comme souhaité.
Ce serait peut être un problème lié à la synchro vers l'adresse réelle :idea:

Si quelqu'un a une idée...

Aides toi et le ciel t'aidera !

Posté : dim. 15 nov. 2015 18:17
par B2V
Ah ben Bravo !

J'ai enfin trouvé pourquoi la commande directe des périphériques de mon RPI2 ne fonctionnait pas :?
:!: Le mappage de l'adresse de base n'est pas le même que pour le RPI :!:

il faut utiliser 0x3f000000 au lieu de 0x20000000

J'avais raté ce détail de poids :shock:

Re: Accès au périphérique du RPI en direct

Posté : dim. 15 nov. 2015 21:12
par destroyedlolo
Salut,

Je n'avais pas vu ton message avant mais ... c'est quoi l'interret de passé directement par le MMAP ?
Pourquoi ne pas utiliser les GPIOs par /sys/class/ ?
C'est plus simple non ?

Re: Accès au périphérique du RPI en direct

Posté : dim. 15 nov. 2015 23:41
par B2V
Ben non, je crois pas qu'il y ait plus simple que d'adresser directement la puce.

Ce que fait Linux avec /sys/class j'en sais trop rien, mais ça me parait guère optimisé.
C'est sans doute mon habitude d'utiliser des micro contrôleur en assembleur, mais j'aime bien savoir ce que je fais. :geek:
Et puis, selon les applications, un adressage "direct" (pas tant que ça puisque c'est mappé), sera certainement plus optimisé, moins simple mais certainement plus rapide (mon coté parano 8-) ).

C'est pas parce que le RPI2 est Quad cœur 900Mhz qu'il faut balancer les µcycles par les fenêtres (ça c'est mon coté anti gaspi ;) )

Re: Accès au périphérique du RPI en direct

Posté : lun. 16 nov. 2015 09:50
par destroyedlolo
B2V a écrit :C'est pas parce que le RPI2 est Quad cœur 900Mhz qu'il faut balancer les µcycles par les fenêtres (ça c'est mon coté anti gaspi ;) )
Ayant débuté avec des machines dont les cycles CPU se comptaient en khz, je sais de quoi tu veux parler :mrgreen:
Cependant, hormis quand je joue avec des micro-controleur (ou quand je n'ai pas le choix), je préfère maintenant passer par le kernel ce qui me permet d'avoir un peu plus d'abstraction et donc de basculler d'un GPIO à un autre en minimisant les changements dans le code.

Re: Accès au périphérique du RPI en direct

Posté : lun. 16 nov. 2015 11:12
par B2V
destroyedlolo a écrit :
B2V a écrit :je préfère maintenant passer par le kernel ce qui me permet d'avoir un peu plus d'abstraction
J'ai pas encore ce niveau d'abstraction sous Linux :?
ça viendra sans doute en son temps :P