5.17: Что такое MMIO и где оно живёт в SoC ========================================== Обзор ----- MMIO (Memory-Mapped I/O) — это механизм, при котором регистры периферийных устройств (например, GPIO, UART, SPI) отображаются в адресное пространство памяти процессора. Важно понимать, что MMIO — это не "виртуальная" память, а **реально существующие физические регистры**, размещённые внутри кристалла SoC (System-on-Chip). MMIO ≠ RAM ≠ ROM. Это **логические блоки**, чувствительные к доступу по конкретным адресам. MMIO в Raspberry Pi 3 --------------------- На Raspberry Pi 3 используется SoC Broadcom BCM2835/2836/2837. Пример: GPIO-контроллер BCM2835 доступен по адресу: .. code-block:: text Физический адрес: 0x3F200000 (RPi 3) Размер: 0xB4 байт (примерно 180 байт) Контроллер GPIO реализует: - конфигурацию направления (вход/выход), - чтение/установку значения, - альтернативные функции. Регистры, такие как `GPSET0`, `GPCLR0`, `GPLEV0`, имеют фиксированные смещения от этого адреса. Взаимодействие с MMIO --------------------- В ядре Linux драйвер делает следующее: 1. **`ioremap()`** — отображает физический адрес MMIO в виртуальное пространство ядра: .. code-block:: c gpio_base = ioremap(0x3F200000, 0xB4); 2. **`writel()`** и **`readl()`** используются для записи и чтения значений: .. code-block:: c writel(1 << 26, gpio_base + GPSET0); // установить пин 26 writel(1 << 26, gpio_base + GPCLR0); // сбросить пин 26 3. Эти обращения фактически активируют **логические блоки внутри SoC**. Архитектура взаимодействия -------------------------- .. code-block:: text [CPU ARM Cortex-A53] | [System Bus / AMBA] | [GPIO Controller @ 0x3F200000] | [GPIO Pin 26 on Header] Когда `writel(1 << 26, ...)` записывает по адресу `0x3F20001C`, контроллер GPIO в SoC реагирует, устанавливая напряжение на выводе GPIO26 (3.3V или GND). 📌 Ни один байт в RAM или ROM при этом не затрагивается. MMIO vs RAM vs ROM ------------------ +--------------+--------------------------------------------+ | Область | Что хранит | +==============+============================================+ | MMIO | Регистры устройств (управление периферией) | +--------------+--------------------------------------------+ | RAM (ОЗУ) | Временные данные, память процессов | +--------------+--------------------------------------------+ | ROM (ПЗУ) | Загрузчик, прошивка | +--------------+--------------------------------------------+ Вывод ----- - MMIO регистры реально существуют в кремнии SoC. - Они **не являются частью RAM**. - **Любой доступ к MMIO = доступ к физическим компонентам** устройства. - На примере `rgb_led_mmio.ko` мы видим, как MMIO позволяет управлять светодиодами напрямую, минуя GPIO API. Следующий шаг — использование MMIO и Device Tree вместе для гибридного управления.