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

Le langage C permet de créer des programmes rapides et proches de la machine

Modérateur : Francois

Répondre
B2V
Messages : 11
Enregistré le : sam. 14 nov. 2015 18:17

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

Message par B2V » sam. 14 nov. 2015 19:11

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:
Modifié en dernier par B2V le dim. 15 nov. 2015 23:47, modifié 1 fois.

B2V
Messages : 11
Enregistré le : sam. 14 nov. 2015 18:17

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

Message par B2V » sam. 14 nov. 2015 21:43

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...

B2V
Messages : 11
Enregistré le : sam. 14 nov. 2015 18:17

Aides toi et le ciel t'aidera !

Message par B2V » dim. 15 nov. 2015 18:17

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:

destroyedlolo
Raspinaute
Messages : 1234
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

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

Message par destroyedlolo » dim. 15 nov. 2015 21:12

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 ?
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

B2V
Messages : 11
Enregistré le : sam. 14 nov. 2015 18:17

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

Message par B2V » dim. 15 nov. 2015 23:41

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 ;) )

destroyedlolo
Raspinaute
Messages : 1234
Enregistré le : dim. 10 mai 2015 18:44
Localisation : Dans la campagne à côté d'Annecy
Contact :

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

Message par destroyedlolo » lun. 16 nov. 2015 09:50

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.
  • BananaPI : Gentoo, disque SATA de 2 To
  • Domotique : 1-wire, TéléInfo, Tablette passée sous Gentoo, ESP8266
  • Multimedia par DNLA
  • Et pleins d'idées ... et bien sûr, pas assez de temps.
Un descriptif de ma domotique 100% fait maison.

B2V
Messages : 11
Enregistré le : sam. 14 nov. 2015 18:17

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

Message par B2V » lun. 16 nov. 2015 11:12

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

Répondre

Retourner vers « C / C++ »