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-контроллер находится между системной шиной и физическими пинами. Его внутреннее устройство включает:
Регистр-файлы управления: - Function Select (GPFSELn) — выбор режима пина (вход, выход, альтернативная функция) - Set/Clear (GPSETn, GPCLRn) — установка и сброс уровня - Level (GPLEVn) — текущий уровень - Pull-up/down — настройка подтягивающих резисторов (в старых чипах) - Interrupt (GPREN, GPFEN и др.) — обработка событий по фронту
Декодер адресов: - Реагирует на обращения процессора по фиксированным адресам MMIO - Например, на Raspberry Pi 3 регистры начинаются с 0x3F200000
Интерфейс к системной шине AMBA/APB: - Принимает команды от CPU (через readl() / writel())
Логика управления 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
Происходит:
CPU передаёт команду записи по адресу 0x3F20001C
GPIO Controller обнаруживает обращение к регистру GPSET0
Логика устанавливает высокий уровень (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 для кнопок.