🔌 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)

RegisterFunktion
GPFSEL0-5Pin-Funktionsauswahl (In/Out)
GPSET0-1GPIO auf HIGH setzen
GPCLR0-1GPIO auf LOW setzen
GPLEV0-1Pegel 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

TypAdresse
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.