5.18: Аппаратная архитектура GPIO Controller в SoC ================================================== Общее описание -------------- GPIO Controller — это **аппаратный компонент внутри SoC**, обеспечивающий доступ к физическим GPIO-пинам (выводам микросхемы) со стороны процессора через системную шину (обычно AMBA). Он реализует **регистры управления GPIO**, отображаемые в адресное пространство MMIO (Memory-Mapped I/O), и позволяет: - переключать пины между входом и выходом, - читать/устанавливать логический уровень, - задавать альтернативные функции (SPI, UART и т.д.), - использовать пины в качестве источников IRQ. Архитектура 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В на ножке - Читает входной уровень - Включает альтернативную функцию Взаимодействие компонентов -------------------------- .. code-block:: text [ARM Cortex-A53 CPU] │ ▼ [Системная шина AMBA/APB] │ ▼ [GPIO Controller (MMIO @ 0x3F200000)] │ ▼ [Пины GPIO: GPIO0 ... GPIO53] Пример обращения к GPIO ----------------------- При вызове из драйвера: .. code-block:: c gpio_base = ioremap(0x3F200000, 0xB4); writel(1 << 21, gpio_base + GPSET0); // включить GPIO21 Происходит: 1. CPU передаёт команду записи по адресу `0x3F20001C` 2. GPIO Controller обнаруживает обращение к регистру `GPSET0` 3. Логика устанавливает высокий уровень (3.3В) на выводе GPIO21 Реальные адреса BCM2835 ----------------------- Из документации SoC BCM2835 (используемого в Raspberry Pi): .. code-block:: none GPIO Base Address: 0x7E200000 (физический) Для ARM: 0x3F200000 (через L2 MMU) GPSET0 Offset: 0x1C GPCLR0 Offset: 0x28 GPLEV0 Offset: 0x34 Вывод ----- - GPIO Controller — это **не драйвер, а физический блок** в SoC - Он управляет пинами через **набор внутренних регистров** - Эти регистры доступны ядру Linux через **MMIO** и используются в драйверах - **Пины реально переключаются** при записи в регистры — никакой эмуляции Следующий шаг: использовать MMIO для RGB-светодиода и IRQ для кнопок.