Master SIAME | Université Toulouse 3

Internet of things and System on Chip

Master SIAME | Université Toulouse 3

Internet of things and System on Chip

User Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

embedded:logiciel:gpio [2015/08/26 20:37] (current)
Line 1: Line 1:
 +====== GPIO ======
 +
 +===== Pilotage par le système de fichier =====
 +
 +ligne GPIOi_j correspond au numéro NUM = i * 32 + j ainsi GPIO1_6 correspond à 38 = 1 * 32 + 6.
 +
 +''​echo NUM > /​sys/​class/​gpio/​export''​ -- contrôle de ligne NUM par le GPIO
 +
 +''​echo out > /​sys/​class/​gpio/​gpioNUM/​direction''​ -- activation de la ligne en sortie
 +
 +''​echo in > /​sys/​class/​gpio/​gpioNUM/​direction''​ -- activation de la ligne en entrée
 +
 +''​echo 1 > /​sys/​class/​gpio/​gpioNUM/​value''​ -- mise à 1 de la ligne NUM
 +
 +''​echo 0 > /​sys/​class/​gpio/​gpioNUM/​value''​ -- mise à 0 de la ligne NUM
 +
 +''​cat /​sys/​class/​gpio/​gpioNUM/​value''​ -- lecture de la valeur en entrée de ligne NUM
 +
 +
 +===== Pilotage en C par projection en mémoire =====
 +
 +Si vous disposez des droits suffisants, vous pouvez projeter n'​importe quelle partie de l'​espace physique d'​adressage dans votre adressage virtuel. Vous ne pourrez cependant pas choisir l'​adresse virtuelle où sera projeté la mémoire physique. Pour ce faire, il faut utiliser:
 +  * ''/​dev/​mem''​ -- le device correspondant à la mémoire physique,
 +  * ''​mmap()''​ -- la fonction Posix permettant l'​opération.
 +
 +Il faut d'​abord ouvrir le périphérique mémoire :
 +<code c>
 +int fd = open("/​dev/​mem",​ O_RDWR|O_SYNC);​
 +if (fd < 0){
 +    // erreur!
 +}
 +</​code>​
 +
 +Puis, sachant que les registres de notre périphérique sont à l'​adresse GPIO_BASE, il faudra réaliser :
 +<code c>
 +gpio_base =(gpio_t *) mmap(NULL, getpagesize(),​ PROT_READ|PROT_WRITE,​ MAP_SHARED, fd, GPIO_BASE);
 +if(gpio == (void *) -1) {
 +    // erreur!
 +}
 +</​code>​
 +
 +Désormais, vous pourrez trouver à l'​adresse contenue dans ''​gpio_base''​ les registres matériels du GPIO visé.
 +
 +Bien sûr, il faudra déclarer vous-même la structure de donnée gpio_t et trouver dans la documentation l'​adresse de base du GPIO qui vous intéresse.
 +
 +**ATTENTION** ​ Les adresses de base données à ''​mmap''​ doivent êtres des multiples de taille de page sous Linux. En l'​occurence,​ la taille de page est ici de 4Ko.
 +
 +===== References =====
 +
 +  * [[http://​git.kernel.org/​cgit/​linux/​kernel/​git/​torvalds/​linux.git/​tree/​Documentation/​gpio.txt?​id=HEAD|documentation in Linux kernel]]
 +  * [[http://​stackoverflow.com/​questions/​17831367/​beaglebone-am335x-accessing-gpio-by-mmap-set-and-clear-pin|Pilotage GPIO en C par projection en mémoire]]