-->
  • Accueil
  • Mes projets
  • Mon CV
  • A propos
  • Contact
« Mes Interviews sur Simerion
Les entrées sorties en C avec la Foxboard, suite et fin »
Utiliser GPIO en C sur la foxboard G20

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.

?View Code C
#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 ;)

Share

Mots-clefs : carte fox, foxboard, G20, GPIO, LED, sysfs

Cet article a été publié le Dimanche 8 novembre 2009 à 22 h 57 min et est classé dans Systèmes Embarqués. Vous pouvez en suivre les commentaires par le biais du flux RSS 2.0. Vous pouvez laisser un commentaire, ou faire un trackback depuis votre propre site.




12 commentaires sur “Utiliser GPIO en C sur la foxboard G20”

  1. Benchi dit :
    8 novembre 2009 à 23 h 21 min

    Excellent !
    :o )

  2. Yoann Sculo dit :
    9 novembre 2009 à 0 h 07 min

    N’hésite pas à me dire si ça marche chez toi ou pas ;)

  3. Benchi dit :
    10 novembre 2009 à 0 h 08 min

    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…

    ;)

  4. Yoann Sculo dit :
    10 novembre 2009 à 1 h 16 min

    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 :(

  5. Cyril Heraudet dit :
    10 novembre 2009 à 21 h 10 min

    Très bonne nouvelle, tu vas rentrer dans le vif du sujet de la FOX.

    bonne continuation

  6. Benchi dit :
    11 novembre 2009 à 16 h 18 min

    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 ?

  7. SebFOx dit :
    11 novembre 2009 à 17 h 53 min

    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

  8. Yoann Sculo dit :
    11 novembre 2009 à 17 h 53 min

    « 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 :)

  9. Yoann Sculo dit :
    11 novembre 2009 à 17 h 58 min

    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.

  10. La domotique chez Benchi - Utiliser sysfs en PHP sur la FoxBoard G20 dit :
    11 novembre 2009 à 19 h 13 min

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

  11. SebFOx dit :
    11 novembre 2009 à 22 h 58 min

    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

  12. YohFox dit :
    27 janvier 2011 à 19 h 37 min

    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?

Laisser une réponse

Cliquez ici pour annuler la réponse.

Image CAPTCHA
Rafraîchir l'image
*

Spam Protection by WP-SpamFree



Un peu de moi autrepart :

  • rss Twitter
  • rss LinkedIn
  • rss Viadeo
  • rss Developpez.com
  • rss Github
  • rss Youtube
  • rss Flickr
  • rss Mon CV (pdf, odt) - ENGLISH
  • rss Flux RSS

  • Articles récents

    • Raspberry Pi – Premières images de la version alpha
    • Au revoir Mindscape
    • Concours de création de système Linux embarqué sur carte Mini2440
    • Juillet 2011 – Quelques news en vrac sur l’actualité de l’embarqué
    • Mass Storage USB sur tous les OS grâce au File-backed Storage Gadget (g_file_storage)
  • Commentaires récents

    • TRYSS dans DSO nano – L’oscilloscope numérique de poche
    • Yoann Sculo dans Raspberry Pi – Premières images de la version alpha
    • R@OUL dans Raspberry Pi – Premières images de la version alpha
    • sache dans Vicacopter, un hélicoptère autonome open source fort sympathique
    • Yoann Sculo dans Au revoir Mindscape
  • Catégories

    • Applications
    • Emploi
    • Général
    • linux
    • Non classé
    • Robotique
    • Systèmes Embarqués
    • Traitement d'image
  • Mots-clefs

    Android Arduino ARM association caliban Buildroot C caliban camera caprica 2010 carte fox CELF conférence ELCE 2010 embarqué Embedded Linux Conference Emploi foxboard Free Electrons G20 Genesis Karotz lapin Libre Linaro linux linux embarqué Linux Magazine magazine MeeGo Mindscape nabaztag Nokia open source planète robots Robert robot Robotique robotique amateur Simerion système embarqué Systèmes Embarqués UTT video violet électronique


Yoann Sculo est fièrement propulsé par WordPress
Articles (RSS) et Commentaires (RSS).