Digitale IOs
Digitale Eingänge und Ausgänge mit libgpiod aus C und Python verwenden.
Zuletzt geändert: 16. September 2026
Digitale IOs werden über /dev/gpiochip* und libgpiod angesprochen. Die
GPIO-sysfs-Schnittstelle wird dafür nicht verwendet.
Voraussetzungen
- Der GPIO-Controller ist im Device Tree aktiviert.
- Der passende Geräteknoten
/dev/gpiochipXist vorhanden. - GPIO-Chip, Line-Name oder Line-Offset sind für das System dokumentiert.
- Das Programm besitzt die erforderlichen Zugriffsrechte.
Für die Beispiele sind außerdem folgende Versionen festzulegen:
- libgpiod:
[LIBGPIOD-VERSION] - Python-Bindings
gpiod:[PYTHON-GPIOD-VERSION] - C-Compiler/Linker:
[C-TOOLCHAIN-VERSION]
gpiodetect
gpioinfo gpiochip0
gpiofind "[LINE-NAME]"Verwende bevorzugt einen Line-Namen. gpiofind löst den Namen in den
zugehörigen GPIO-Chip und Offset auf. Das Ergebnis kann direkt an
gpioget, gpioset oder gpiomon übergeben werden. Die Nummer von
gpiochipX ist nicht fest und darf nicht aus dem Device-Tree-Controller
abgeleitet werden.
GPIO-Leitungen über die Kommandozeile verwenden
Die folgenden Beispiele verwenden die libgpiod-1.x-Syntax. Der Platzhalter
[LINE-NAME] wird durch den gewünschten Line-Namen ersetzt.
Wert lesen
gpioget $(gpiofind "[LINE-NAME]")Die Option --active-low liest die logischen statt der elektrischen Zustände,
wenn das für die Anwendung erforderlich ist.
Wert setzen
gpioset --mode=wait $(gpiofind "[LINE-NAME]")=1--mode=wait hält die Leitung gesetzt, bis im Terminal die Eingabetaste
gedrückt wird. Für einen zeitlich begrenzten Zugriff kann beispielsweise
--mode=time --sec=1 verwendet werden. Ohne einen Modus wie wait, time
oder signal endet gpioset unmittelbar; beim Ende des Prozesses wird die
Leitung wieder freigegeben und ihr Zustand ist danach nicht garantiert.
Die Option --active-low kann auch bei gpioset verwendet werden, wenn die
Anwendung mit logischen Aktivzuständen arbeiten soll. Ein n oder _N im
Line-Namen setzt diese Option nicht automatisch.
Flanken beobachten
gpiomon --rising-edge $(gpiofind "[LINE-NAME]")Mit --falling-edge wird ausschließlich die fallende Flanke gewählt. Ohne
Flankenfilter werden beide Flanken verarbeitet. Vor dem Zugriff sind mit
gpioinfo die Richtung, der Active-State und die Belegung durch Kernel-Treiber
oder Systemdienste zu prüfen.
Ausgang schalten
Beim Request wird die Leitung exklusiv reserviert. Nach dem Ende des Requests gibt die Anwendung die Leitung wieder frei.
#include <gpiod.h>
int main(void)
{
const unsigned int offset = [GPIO-OFFSET];
struct gpiod_chip *chip = gpiod_chip_open("/dev/gpiochip0");
struct gpiod_line_settings *settings = gpiod_line_settings_new();
struct gpiod_line_config *line_config = gpiod_line_config_new();
struct gpiod_request_config *request_config = gpiod_request_config_new();
struct gpiod_line_request *request;
int result = 1;
if (!chip || !settings || !line_config || !request_config) {
goto cleanup;
}
gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_OUTPUT);
gpiod_line_settings_set_output_value(settings, GPIOD_LINE_VALUE_INACTIVE);
if (gpiod_line_config_add_line_settings(line_config, &offset, 1U, settings) < 0) {
goto cleanup;
}
gpiod_request_config_set_consumer(request_config, "[PROGRAMMNAME]");
request = gpiod_chip_request_lines(chip, request_config, line_config);
if (!request) {
goto cleanup;
}
result = gpiod_line_request_set_value(
request, offset, GPIOD_LINE_VALUE_ACTIVE);
gpiod_line_request_release(request);
cleanup:
gpiod_request_config_free(request_config);
gpiod_line_config_free(line_config);
gpiod_line_settings_free(settings);
gpiod_chip_close(chip);
return result < 0 ? 1 : 0;
}Eingang lesen
Ein Eingang wird ebenfalls exklusiv angefordert. Für Flankenerkennung werden
zusätzlich RISING, FALLING oder BOTH als Edge-Detection konfiguriert.
/* Die Initialisierung entspricht dem Ausgangsbeispiel. */
gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_INPUT);
gpiod_line_config_add_line_settings(line_config, &offset, 1U, settings);
struct gpiod_line_request *request =
gpiod_chip_request_lines(chip, request_config, line_config);
if (!request) {
return 1;
}
const enum gpiod_line_value value =
gpiod_line_request_get_value(request, offset);
gpiod_line_request_release(request);Elektrische Eigenschaften
Active-Low, Pull-up/Pull-down, Open-Drain, Debounce und Flankenerkennung werden
als LineSettings konfiguriert. Diese Werte müssen zur elektrischen
Beschaltung passen und dürfen nicht aus einem Beispiel übernommen werden.
[PLATZHALTER: GPIO-Chips, Line-Namen, Offsets, Pegel, Pull-Widerstände, freigegebene Eingangs-/Ausgangsmodi und libgpiod-Paketnamen]
