Pandaboard: Zugriff aug GPIO über Export

#2693591
Lesenswert?

Hallo alle zusammen,

ich versuche auf meinem Pandaboard ein paar Daten über die GPIOs 
auszutauschen und nutze für den Zugriff im Userspace die "Export" - 
Funktion. Anbei ein Ausschnitt meines Codes:

int init_gpio(void)
{
  FILE *fpointer1 = NULL;
  FILE *fpointer2 = NULL;

  if((fpointer1 = fopen("/sys/class/gpio/gpio137/direction", "rb+")) == 
NULL)
  {
    if ((fpointer2 = fopen("/sys/class/gpio/export", "w")) == NULL)
    {
      return 0;
    }
    else
    {
      rewind(fpointer2);
      fwrite("137",sizeof(char), 3, fpointer2);
      fclose(fpointer2);
      fpointer1 = fopen("/sys/class/gpio/gpio137/direction", "rb+");
    }
  }


  rewind(fpointer2);
  fwrite("in", sizeof(char), 2, fpointer2);
  fclose(fpointer2);


  fpointer1 = NULL;
  fpointer2 = NULL;

  if((fpointer1 = fopen("/sys/class/gpio/gpio138/direction", "rb+")) == 
NULL)
  {
    if ((fpointer2 = fopen("/sys/class/gpio/export", "w")) == NULL) 
//GPIO SYSFS; "r+": open file for read/write
    {
      return 0;
    }
    else
    {
      rewind(fpointer2);
      fwrite("138", sizeof(char), 3, fpointer2);
      fclose(fpointer2);
      fpointer1 = fopen("/sys/class/gpio/gpio138/direction", "rb+");
    }
  }


  rewind(fpointer1);
  fwrite("low", sizeof(char), 3, fpointer1);
  fclose(fpointer1);


  fpointer1 = NULL;
  fpointer2 = NULL;

  if((fpointer1 = fopen("/sys/class/gpio/gpio139/direction", "rb+")) == 
NULL)
  {
    if ((fpointer2 = fopen("/sys/class/gpio/export", "w")) == NULL) 
//GPIO SYSFS; "r+": open file for read/write
    {
      return 0;
    }
    else
    {
    rewind(fpointer2);
    fwrite("139", sizeof(char), 3, fpointer2);
    fclose(fpointer2);
    fpointer1 = fopen("/sys/class/gpio/gpio139/direction", "rb+");
    }
  }


  rewind(fpointer1);
  fwrite("low", sizeof(char), 3, fpointer1);
  fclose(fpointer1);


  //wenn alles ok, dann:

  return(1);
}


------------------------

Wie man sieht initialisiere ich 3 GPIOs, wie ich sie brauche. Wenn diese 
nicht exportiert sind, läuft das Programm ohne Probleme durch.

Wenn die GPIOs jedoch schon im Userspace vorhanden sind, daher in 
/sys/class/gpio/ schon auftauchen, bekomme ich einen Fehler (Auszug aus 
strace):

open("/sys/class/gpio/gpio137/direction", O_RDWR) = 3
- - - SIGSEGV (Segmentation fault) @ 0 (0)
Segmentation fault (core dumped)

Wie man sieht scheitert direkt der erste Zugriff auf "Direction"...

Kann mir hier jemand weiterhelfen? Warum funktioniert alles, wenn das 
Programm die GPIOs selbst in den Userspace "schiebt", aber nicht, wenn 
diese schon vorhanden sind?!

Danke für jede Hilfe :)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren