Forum: Mikrocontroller und Digitale Elektronik odroid u3 gpio access c++


von Ajax (Gast)


Lesenswert?

hi,

kennt sich jemand mit dem odroid u3 aus und kann mir erklären wie ich 
von c++ aus zugriff auf die gpios bekomme? probier es schon den ganzen 
Tag und komm einfach nicht weiter. Gibt es hier eine Library wie z.B. 
beim Raspberry Pi?

eigentlich sollte es so funktionieren :
1
  FILE* f = fopen("/sys/class/gpio/gpiochip199/value", "w");
2
    fputs("0\n", f);
3
    fflush(f);
bekomme aber immer ein "segmentation fault".

Brauche eure hilfe!

Grüße Ajax

von Peter II (Gast)


Lesenswert?

Ajax schrieb:
> bekomme aber immer ein "segmentation fault".

dann solltest du mal eine Fehlerbehandlung einbauen.

Eventuell geht ja das öffnen der Datei schon schief, und dann könnte man 
auch noch gleich den error code abfragen und dann hat man genug Infos um 
den Fehler zu beheben.

von Chris F. (chris_de)


Lesenswert?

Also wenn dein GPIO-Treiber die pins als sysfs zur Verfügung stellt (so 
wie du es beschrieben hast) sollte der Zugriff immer gleich geschehen...
Ich benutze auf einem i.mx28 (freescale) das hier:

Edit: Sorry hab die globals vergessen:
1
/* File handle */
2
int iFd;
3
/*
4
 * four chars are enough for a 3-digit gpio number
5
 * and null termination.
6
 */
7
char caValue[4];
8
/*
9
 * 34 chars are enough for /sys/class/gpio/gpioXXX/direction
10
 * and null termination.
11
 */
12
char caPath[34];
1
int GPIO_SetVal(int iGpio, int iValue)
2
{
3
  snprintf(caPath, sizeof(caPath), "/sys/class/gpio/gpio%d/value", iGpio);
4
5
  iFd = open(caPath, O_WRONLY|O_SYNC);
6
  if (0 > iFd)
7
  {
8
    //printf("Cannot open value file.\n");
9
    return -1;
10
  }
11
12
  snprintf(caValue, sizeof(caValue), "%d", iValue);
13
14
  if (1 > write(iFd, &caValue, strlen(caValue)))
15
  {
16
    //printf("Cannot write to value file.\n");
17
    close(iFd);
18
    return -1;
19
  }
20
21
  close(iFd);
22
23
  return 1;
24
}

Davor aber auf jeden Fall auch die Pins exportieren -> echo xx > 
/sys/class/gpio/export und die Richtung 
(/sys/class/gpio/gpion/direction) setzen!
Dann sollte das klappen :)

Gruß

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Und jetzt noch in C++ statt C:
1
#include <fstream>
2
#include <string>
3
4
int GPIO_SetVal(int iGpio, int iValue) {
5
  std::ofstream s ("/sys/class/gpio/gpio" + std::to_string(iGpio) + "/value", std::ios::out);
6
  if(s) s << iValue;
7
}

von Peter II (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Und jetzt noch in C++ statt C:
1
std::ofstream s ("/sys/class/gpio/gpio" + std::to_string(iGpio) + "/value", std::ios::out);
2
  if(s) s << iValue;

blöde frage, unter welchen Bedingungen kann dann das if nicht war sein? 
Eine Objekt kann doch nicht 0 sein oder wird bei std::ofstream irgendwie 
der vergleichsoperator überschrieben?

von Dr. Sommer (Gast)


Lesenswert?

Peter II schrieb:
> Eine Objekt kann doch nicht 0 sein oder wird bei std::ofstream irgendwie
> der vergleichsoperator überschrieben?
Richtig, die stream-Klassen überschreiben den "operator bool", sodass er 
false im Fehlerfall zurückgibt (weil die Datei nicht geöffnet werden 
konnte).

Siehe: http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

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.