Forum: Mikrocontroller und Digitale Elektronik Raspberry Pi4 - GPIO Library für C


von Phillips (Gast)


Lesenswert?

Hallo,
ich fange gerade an mich mit RPi4 erstmals zu beschäftigen und habe
ein Problem eine passende C-Library für GPIO zu finden.

Ich beabsichtige unter Windows mittels Eclipse und Cross-GCC
für den Raspberry Programme zu erzeugen (klappt prinzipiell schon).
Habe viel C-Code für andere MCs, die ich weitgehend weiter
benutzen möchte.
Ich bitte um Nachsicht wenn ich vielleicht dumm frage.

Natürlich habe ich schon WiringPi und das hier
https://codeandlife.com/2015/03/25/raspberry-pi-2-vs-1-gpio-benchmark/
gefunden.
Leider scheint WiringPi aber nicht mehr supportet zu werden und bei
der Benchmarkdoku ist mir einiges nicht ganz klar.
Was ist denn bitte mit "Native library" gemeint?
Gibt noch weitere aktuelle GPIO C Libraries die ich mir anschauen
könnte?

Wäre nett wenn mir jemand helfen könnte.

Vielen Dank.

von va (Gast)


Lesenswert?

Ist bei mir schon länger her, dass ich mich damit beschäftigt habe


Nur so ein paar Stichworte

C + SysFS:  Die GPIO Pins werden über ein System virtueller Dateien 
angesprochen
(/sys/class/gpio). Grundlage für Libs wie wiringPi, pigpio u.a.

C + wiringPi

C + pigpio (eigentlich eine Python Lib)

C + bcm2835


Siehe auch
http://www.netzmafia.de/skripten/hardware/RasPi/RasPi_GPIO_C.html


Ferner geht natürlich auch Bare Metal Programmierung (Stichwort: 
none-eabi)
https://github.com/BrianSidebotham/arm-tutorial-rpi

von pius (Gast)


Lesenswert?

Die bcm2835 lib tuts wunderbar:

https://www.airspayce.com/mikem/bcm2835/

von S.P. (Gast)


Lesenswert?


von Gerald K. (geku)


Lesenswert?

va schrieb:
> C + pigpio (eigentlich eine Python Lib)

Ich habe mit pigio gute Erfahrung gemacht. 
Beitrag "Re: Ausgabemodul für Raspberry Pi"

Vorteil: zur Ausführung der Anwendungen werden keine Rootrechte 
benötigt.

von S.P. (Gast)


Lesenswert?

Hier noch ein kleines Demo-Programm für libgpiod. Damit hatte ich die 
GPIO-Pins einer CP2112 USB to SMBus/I2C Bridge getestet. Das sollte mit 
den GPIO-Pins des Raspi aber auch funktionieren.
1
/*
2
  CP2112 breakout board ("CP2112 Evaluation kit for the CCS811 Debug board")
3
  
4
  GPIO0 --- red LED   --- resistor (300 Ohm) --- Vcc (3.4V)
5
  GPIO1 --- green LED --- resistor (300 Ohm) --- Vcc (3.4V)
6
7
  Compile:
8
  gcc -O2 -lgpiod -o gpio-test-2 cp2112-gpio-test-2.c
9
*/
10
11
#include <gpiod.h>
12
#include <stdio.h>
13
#include <unistd.h>
14
15
#ifndef  CONSUMER
16
#define  CONSUMER "Consumer"
17
#endif
18
19
int main(int argc, char **argv)
20
{
21
  struct gpiod_chip *chip;
22
  struct gpiod_line_bulk lines;
23
  int ret;
24
25
  if (argc != 2) {
26
    puts("Single argument expected.\n");
27
    return -1;
28
  }
29
30
  chip = gpiod_chip_open_by_name(argv[1]);
31
  if (!chip) {
32
    perror("Open chip failed");
33
    goto end;
34
  }
35
36
  ret = gpiod_chip_get_lines(chip, (unsigned int[]){0, 1}, 2, &lines);
37
  if (ret < 0) {
38
    perror("Get lines failed");
39
    goto close_chip;
40
  }
41
42
  ret = gpiod_line_request_bulk_output(&lines, CONSUMER, (int[]){1, 1});
43
  if (ret < 0) {
44
    perror("Request lines as output failed");
45
    goto release_line;
46
  }
47
48
  unsigned int val = 0;
49
  for (int i = 0; i < 100; i++) {
50
    ret = gpiod_line_set_value_bulk(&lines, (int[]){val, !val});
51
    if (ret < 0) {
52
      perror("Set lines failed");
53
      goto release_line;
54
    }
55
    sleep(1);
56
    val = !val;
57
  }
58
59
 release_line:
60
  gpiod_line_release_bulk(&lines);
61
 close_chip:
62
  gpiod_chip_close(chip);
63
 end:
64
  return 0;
65
}

von Phillips (Gast)


Lesenswert?

Vielen Dank an alle für die diversen Hinweis.

Werde mir alles ansehen.

von bingo (Gast)


Lesenswert?

Gerald K. schrieb:
> Vorteil: zur Ausführung der Anwendungen werden keine Rootrechte
> benötigt.

Das Problemm der nötigen Root-Rechte kann man leicht durch eine 
UDEV-Regel erschlagen.

von Phillips (Gast)


Lesenswert?

bingo schrieb:
> Das Problemm der nötigen Root-Rechte kann man leicht durch eine
> UDEV-Regel erschlagen.

Was ist das bitte?

von bingo (Gast)


Lesenswert?

Phillips schrieb:
> Was ist das bitte?

https://wiki.ubuntuusers.de/udev/

ich habe eine Datei /etc/udev/rules.d/97-gpio.rules
1
SUBSYSTEM=="gpio*|leds*", PROGRAM="/bin/sh -c '\
2
    chown -R root:gpio /sys/class/gpio && chmod -R 0770 /sys/class/gpio &&\
3
    chown -R root:gpio /sys/devices/platform/soc && chmod -R 0770
4
/sys/devices/platform/soc &&\
5
    chown -R root:gpio /sys/class/leds && chmod -R 0770 /sys/class/leds &&\ 
6
    chown -R root:gpio /sys/devices/platform/leds && chmod -R 0770
7
/sys/devices/platform/leds'"
(nach der der 0770 findet kein Zeilenumbruch statt!, da ist nur 1 
Leerzeichen und dann sys...)

Diese Datei sorgt dafür, dass immer dann wenn ein User aus der Gruppe 
'gpio' auf die GPIOs oder die LEDs zugreift, dafür die Rechte bekommt. 
Du musst also nur noch eine Gruppe 'gpio' schaffen und den/die User 
der/die die Rechte bekommen soll (also meist 'pi' o.ä.) in die Gruppe 
'gpio' aufnehmen. Dann noch das UDEV-System neu starten (siehe obigen 
Link zu Ubuntuusers) und schon geht's auch ohne Root-Rechte.

von Phillips (Gast)


Lesenswert?

Danke vielmals für die Erläuterung.

von Stefan F. (Gast)


Lesenswert?

bingo schrieb:
> nach der der 0770 findet kein Zeilenumbruch statt!

Also so:
1
SUBSYSTEM=="gpio*|leds*", PROGRAM="/bin/sh -c '\
2
    chown -R root:gpio /sys/class/gpio && chmod -R 0770 /sys/class/gpio &&\
3
    chown -R root:gpio /sys/devices/platform/soc && chmod -R 0770 /sys/devices/platform/soc &&\
4
    chown -R root:gpio /sys/class/leds && chmod -R 0770 /sys/class/leds &&\ 
5
    chown -R root:gpio /sys/devices/platform/leds && chmod -R 0770 /sys/devices/platform/leds'"

Warum hast du unnötige (verwirrende) Umbrüche eingefügt? Die 
Forensoftware kann das doch korrekt anzeigen!

von Bauform B. (bauformb)


Lesenswert?

bingo schrieb:
> ich habe eine Datei /etc/udev/rules./97-gpio.rules
1
SUBSYSTEM=="gpio*|leds*", PROGRAM="/bin/sh -c '\
2
chgrp -R gpio /sys/class/gpio &&\
3
chmod -R 0770 /sys/class/gpio &&\
4
chgrp -R gpio /sys/devices/platform/soc &&\
5
chmod -R 0770 /sys/devices/platform/soc &&\
6
chgrp -R gpio /sys/class/leds &&\
7
chmod -R 0770 /sys/class/leds &&\
8
chgrp -R gpio /sys/devices/platform/leds &&\
9
chmod -R 0770 /sys/devices/platform/leds'"
Abgesehen davon, dass "chmod -R" für unzählige Neuinstallationen 
verantwortlich ist und selten nötig ist, braucht man 
/sys/devices/platform wirklich? Und sind nicht viele GPIOs für Benutzer 
tabu?

> Diese Datei sorgt dafür, dass immer dann wenn ein User aus der Gruppe
> 'gpio' auf die GPIOs oder die LEDs zugreift, dafür die Rechte bekommt.

Stimmt das oder werden die Rechte schon beim Systemstart geändert?
Und wenn man das so macht, braucht man doch keine lib mehr?

von Chris (Gast)


Lesenswert?

-R ist hier nötig, da im Verzeichnis /sys/class/gpio/ für die einelnen 
GPIO's nicht schon beim Start sondern erst zur Laufzeit weitere 
Unterverzeichnisse angelegt werden, z.B. /sys/class/gpio/gpio17/ für den 
GPIO.0

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.