Forum: PC-Programmierung Pandaboard: Zugriff aug GPIO über Export


von Thomas N. (thomas_n89)


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

von Konrad S. (maybee)


Lesenswert?

Thomas N. schrieb:
>   rewind(fpointer2);
>   fwrite("in", sizeof(char), 2, fpointer2);
>   fclose(fpointer2);

fpointer2 is hier entweder NULL oder ge-fclose()-t.

von Thomas N. (thomas_n89)


Lesenswert?

Danke! Das ist natürlich Betriebsblindheit, hier muss natürlich 
fpointer1 stehen...

Manchmal ist es doch gut, eine Nacht über seinen Quellcode zu schlafen.

nochmal Danke für die schnelle Hilfe

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.