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 :)
Thomas N. schrieb: > rewind(fpointer2); > fwrite("in", sizeof(char), 2, fpointer2); > fclose(fpointer2); fpointer2 is hier entweder NULL oder ge-fclose()-t.
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.