Après quelques longues recherches ce week-end, j’ai enfin réussi à trouver le (un) moyen d’utiliser les entrées / sorties de la foxboard G20. J’ai initialement orienté mes recherches sur la documentation du kernel qui pointait sur gpio.h. Cependant d’après le site d’avrfreaks où j’ai trouvé mon bonheur, gpio.h aurait tout simplement disparu des noyaux Atmel au profit de sysfs. Ainsi, la gestion I/O se fait par le biais de simples fichiers. J’ai donc commencé à me faire une petite bibliohèque de fonctions pour manipuler les fichiers sysfs. Ce n’est que le début, ça n’est pas encore complètement au point, mais quoi qu’il en soit, le code suivant fait déjà clignotter la LED rouge de la fox.
#include <string.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> struct S_GPIO_LINE { char id_number[4]; int direction; int value; }; typedef struct S_GPIO_LINE S_GPIO_LINE; int load_gpio_line( S_GPIO_LINE *ps_line, char id_number[4], int i_direction ) { FILE *p_gpio_line; /* Exporting GPIO line */ if ((p_gpio_line = fopen("/sys/class/gpio/export", "ab")) == NULL) { printf("Cannot open export file.\n"); exit(1); } rewind(p_gpio_line); strcpy(ps_line->id_number, id_number); fwrite(&ps_line->id_number, sizeof(char), 2, p_gpio_line); fclose(p_gpio_line); set_gpio_direction(ps_line, i_direction); return 0; } int set_gpio_direction( S_GPIO_LINE *ps_line, int i_direction ) { FILE *p_gpio_direction; char gpio_direction[35]; char c_direction[4]; sprintf(gpio_direction, "/sys/class/gpio/gpio%s/direction", ps_line->id_number); /* Setting line direction */ if ((p_gpio_direction = fopen(gpio_direction, "rb+")) == NULL) { printf("Cannot open direction file.\n"); exit(1); } rewind(p_gpio_direction); if( i_direction ) { strcpy(c_direction,"in"); ps_line->direction = 1; } else{ strcpy(c_direction,"out"); ps_line->direction = 0; } fwrite(&c_direction, sizeof(char), 3, p_gpio_direction); fclose(p_gpio_direction); return 0; } int set_gpio_line(S_GPIO_LINE *ps_line, int value ) { FILE *p_gpio_value; char gpio_value[35]; char c_value[2]; if( ps_line->direction == 0 ) { sprintf(gpio_value, "/sys/class/gpio/gpio%s/value", ps_line->id_number); /* Setting value */ if ((p_gpio_value = fopen(gpio_value, "rb+")) == NULL) { printf("Cannot open value file.\n"); exit(1); } rewind(p_gpio_value); sprintf(c_value, "%d", value); ps_line->value = value; fwrite(&c_value, sizeof(char), 1, p_gpio_value); fclose(p_gpio_value); } else{ printf("Wrong access.\n"); exit(1); } return 0; } int main() { FILE *fp; S_GPIO_LINE s_led7; load_gpio_line(&s_led7, "103", 0); while(1) { set_gpio_line(&s_led7, 1); usleep(100000); set_gpio_line(&s_led7, 0); usleep(100000); } return 0; } |
Prochaine étape, la lecture de données
Mots-clefs : carte fox, foxboard, G20, GPIO, LED, sysfs
-->









Excellent !
)
N’hésite pas à me dire si ça marche chez toi ou pas
Je viens de faire l’essai et cela fonctionne !!!
Bon, mon clignotement est un peu spécial car la led clignote d’origine..
Mais on note bien la différence de fréquence…
Héhé cool !
J’ai réussi à intégrer la lecture de port ce soir. Je posterai mes bidouilles bientôt. Quand je lui injecte un état haut ou état bas il reconnait bien les valeurs. Mais j’ai encore quelques soucis, car spontanément il va lire la valeur 1 quand aucun courant ne passe
Très bonne nouvelle, tu vas rentrer dans le vif du sujet de la FOX.
bonne continuation
Yoann,
Au démarrage, la led rouge clignote (ce qui est normal d’après « Getting started with the FOX Board G20″ de acmec systems), mais comment faire pour qu’elle ne clignote plus ?
Bonjour à tous,
Bonne initiative Yoann pour ce code. J’ai essayé de le tester aujourd’hui, ca ne marche pas.
En fait comme je l’ai expliqué sur le groupe google:
http://groups.google.fr/group/groupe-de-discussion-autour-de-netus-g20-et-fox-board-g20?hl=fr ,
j’ai reprogrammé mon firmware, j’ai du me recréer le noyau et le filesystème Gentoo d’après les derniers fichiers dispo sur le site d’Acme Système.
La class gpio n’existe pas dans /sys/class, donc il ne peut ouvrir gpio/export…
J’avais bien tout ce qu’il fallait avant car j’avais réussi à faire clignoter la led comme indiqué dans le How TO.
A +
SebFox
« After a while (about 120 seconds if you are using Gentoo Linux) the red led labeled PC7 will blink. In this condition the board is ready to operate. »
Effectivement, c’est ce que semble dire la doc. Mais je n’ai pas souvenir que ma LED7 clignote au démarrage. Enfin ce n’est pas le cas chez moi il me semble. Je vais regarder ce qu’il se passe au prochain redémarrage de ma FOX. Je testerai ça plus tard, là je suis en train de mettre en place mes capteurs ultrasons dessus
Oops c’est ce qui s’appelle être synchro.
C’est embêtant ça le coup du gpio qui disparaît
Il faudrait peut être en parler à Acmesystems s’ils ne fournissent pas tous les fichiers nécessaires.
[...] novembre 2009 Suite à l’article de Yoann « Utiliser GPIO en C sur la foxboard G20« , voici une version en PHP. Ce bout de code permet d’allumer et éteindre la led [...]
Salut vous deux,
J’ai passé un bon moment pour réinstaller le filesystem Gentoo sur ma carte SD et ca y est j’ai un fs tout propre.
J’ai le meme soucis que Benchi, ma led rouge clignote en alternance. Ca vient de ce topic:
http://netus.acmesystems.it/doku.php?id=qa:programming
Partie :I want to flash the RED LED when the Netus has finished the booting process, how can I?
Sauf que nous sommes encore en phase de développement chez Acme donc l’info change très vite.
le script n’est pas /etc/init.d/readyled mais /etc/init.d/blinkingled, en examinant ce script, il y a une ligne a la fin:
/usr/bin/killall blinkingled, qui va pemettre d’arreter le script et pouvoir placer les valeurs que l’on veut …
J’ai donc essayé ton code Yoann, et ca marche maintenant.
A + SébFox
Bsr,
j’essaye de remplacer la fox LX (avec un CGI et un serveur Web en C) par la G20 sous Debian, à cause de ça fin de production.
j’ai donc tt d’abord tester la liaison série en C à l’aide du tutoriel du site =>OK.
puis j’ai voulu tester un signal carré sur une pin suivant ce tuto : http://www.acmesystems.it/foxg20/doku.php?id=tutorial:gpio_dev
=> PAS OK dev/gpio non trouvé (ou le trouver)
IDM avec le prog de yoann: Cannot open direction file direct
Est ce à cause de Debian?