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.
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
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.
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 | }
|
Vielen Dank an alle für die diversen Hinweis. Werde mir alles ansehen.
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.
bingo schrieb: > Das Problemm der nötigen Root-Rechte kann man leicht durch eine > UDEV-Regel erschlagen. Was ist das bitte?
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.
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!
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?
-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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.