🔌 Linux GPIO (General Purpose Input/Output)
🚀 Ziel
Zugriff auf die GPIO-Pins unter Linux, sowohl aus Userspace als auch im Kernelmodul, verstehen und umsetzen.
🔧 Methoden des GPIO-Zugriffs
1. Pseudo-Dateisystem (/sys/class/gpio)
- Nutzerfreundlich & portabel
 - Benötigt GPIO-Treiber im Kernel
 
Typische Befehle:
echo 340 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio340/direction
echo 1 > /sys/class/gpio/gpio340/value
echo 340 > /sys/class/gpio/unexport
2. Speicher-Mapping (Memory Map)
- Direktzugriff auf Register
 - Benötigt Root-Rechte und Kenntnis der physischen Adressen
 - Schnell, aber nicht portabel
 
Beispiel-Code:
#define GPIO_BASE_ADDR 0xfe200000
#define GPIO_SET0      0x1c
#define GPIO_CLR0      0x28
void *virtual_gpio_base;
uint32_t *gpio_reg = (uint32_t *)(virtual_gpio_base + GPIO_SET0);
*gpio_reg = (0x1 << gpio);
🗋 Register des BCM2711 (Raspberry Pi 4)
| Register | Funktion | 
|---|---|
| GPFSEL0-5 | Pin-Funktionsauswahl (In/Out) | 
| GPSET0-1 | GPIO auf HIGH setzen | 
| GPCLR0-1 | GPIO auf LOW setzen | 
| GPLEV0-1 | Pegel lesen (Input-Zustand) | 
Beispiel: GPFSEL für GPIO-Richtung setzen
#define FSELX_OFFSET(pin) ((pin % 10) * 3)
*gpio_reg &= ~(0x7 << FSELX_OFFSET(gpio));  // Clear Bits
*gpio_reg |= (1 << FSELX_OFFSET(gpio));     // Set Output
🧰 Device Tree
- Deklaration der GPIO-Adressen und Kompatibilität
 
soc {
  gpio@7e200000 {
    compatible = "brcm,bcm2711-gpio";
    reg = <0x7e200000 0xb4>; // legacy addr + size
  };
};
⚖️ mmap-Zugriff in C
int m_mfd = open("/dev/mem", O_RDWR);
virtual_gpio_base = mmap(NULL, 4096, PROT_READ|PROT_WRITE,
                         MAP_SHARED, m_mfd, GPIO_BASE_ADDR);
close(m_mfd);
🔺 Legacy vs. ARM View Adressen
| Typ | Adresse | 
|---|---|
| Legacy (32-bit) | 0x7e200000 | 
| ARM View (35-bit) | 0xfe200000 | 
🔔 Praxis
- LED an GPIO12 einschalten:
 
echo 12 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio12/direction
echo 1 > /sys/class/gpio/gpio12/value
- Button an GPIO22 auslesen:
 
echo 22 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio22/direction
cat /sys/class/gpio/gpio22/value
Diese GPIO-Kenntnisse bilden die Grundlage für Kernelmodule, Interruptsteuerung und weitere eingebettete Hardwareinteraktionen.