19. 5.18: Аппаратная архитектура GPIO Controller в SoC

19.1. Общее описание

GPIO Controller — это аппаратный компонент внутри SoC, обеспечивающий доступ к физическим GPIO-пинам (выводам микросхемы) со стороны процессора через системную шину (обычно AMBA).

Он реализует регистры управления GPIO, отображаемые в адресное пространство MMIO (Memory-Mapped I/O), и позволяет:

  • переключать пины между входом и выходом,

  • читать/устанавливать логический уровень,

  • задавать альтернативные функции (SPI, UART и т.д.),

  • использовать пины в качестве источников IRQ.

19.2. Архитектура GPIO Controller

GPIO-контроллер находится между системной шиной и физическими пинами. Его внутреннее устройство включает:

  1. Регистр-файлы управления: - Function Select (GPFSELn) — выбор режима пина (вход, выход, альтернативная функция) - Set/Clear (GPSETn, GPCLRn) — установка и сброс уровня - Level (GPLEVn) — текущий уровень - Pull-up/down — настройка подтягивающих резисторов (в старых чипах) - Interrupt (GPREN, GPFEN и др.) — обработка событий по фронту

  2. Декодер адресов: - Реагирует на обращения процессора по фиксированным адресам MMIO - Например, на Raspberry Pi 3 регистры начинаются с 0x3F200000

  3. Интерфейс к системной шине AMBA/APB: - Принимает команды от CPU (через readl() / writel())

  4. Логика управления GPIO-пинами: - Устанавливает 3.3В или 0В на ножке - Читает входной уровень - Включает альтернативную функцию

19.3. Взаимодействие компонентов

[ARM Cortex-A53 CPU]
        │
        ▼
[Системная шина AMBA/APB]
        │
        ▼
[GPIO Controller (MMIO @ 0x3F200000)]
        │
        ▼
[Пины GPIO: GPIO0 ... GPIO53]

19.4. Пример обращения к GPIO

При вызове из драйвера:

gpio_base = ioremap(0x3F200000, 0xB4);
writel(1 << 21, gpio_base + GPSET0);  // включить GPIO21

Происходит:

  1. CPU передаёт команду записи по адресу 0x3F20001C

  2. GPIO Controller обнаруживает обращение к регистру GPSET0

  3. Логика устанавливает высокий уровень (3.3В) на выводе GPIO21

19.5. Реальные адреса BCM2835

Из документации SoC BCM2835 (используемого в Raspberry Pi):

GPIO Base Address:  0x7E200000 (физический)
Для ARM:            0x3F200000 (через L2 MMU)
GPSET0 Offset:      0x1C
GPCLR0 Offset:      0x28
GPLEV0 Offset:      0x34

19.6. Вывод

  • GPIO Controller — это не драйвер, а физический блок в SoC

  • Он управляет пинами через набор внутренних регистров

  • Эти регистры доступны ядру Linux через MMIO и используются в драйверах

  • Пины реально переключаются при записи в регистры — никакой эмуляции

Следующий шаг: использовать MMIO для RGB-светодиода и IRQ для кнопок.