Orange Pi U-Boot: работа с загрузчиком, настройка и восстановление

Плата Orange Pi не стартует, а на UART-консоли видно только строку => — это приглашение загрузчика U-Boot, значит, ядро Linux не найдено или повреждено, но сама плата жива и восстановима. Такая ситуация типична после неудачной записи образа на SD-карту, экспериментов с разделами eMMC или обрыва питания во время обновления системы.

U-Boot (Universal Bootloader) — это первичный загрузчик, который используется практически на всех одноплатных компьютерах семейства Orange Pi: от Orange Pi Zero до Orange Pi 5. Он инициализирует память, находит ядро Linux, передаёт ему параметры и запускает систему. Понимание того, как работает этот загрузчик, позволяет диагностировать проблемы загрузки, менять порядок устройств и восстанавливать плату без покупки новой.

Как устроена цепочка загрузки Orange Pi

Загрузка платы происходит в несколько этапов. Сначала выполняется зашитый в процессор BROM (Boot ROM) — неизменяемый код, который ищет загрузчик на SD-карте, eMMC или SPI-флеш в заданном производителем порядке. Затем управление передаётся SPL (Secondary Program Loader) — урезанной части U-Boot, которая настраивает оперативную память. Только после этого стартует полноценный U-Boot, читающий ядро и device tree.

Если на каком-то этапе возникает ошибка, плата либо «молчит» полностью, либо останавливается в консоли U-Boot. Различить эти состояния можно только через отладочный UART-порт — это главный инструмент диагностики.

  • 🔌 BROM — неизменяемый код в чипе, точка входа всегда одна
  • ⚙️ SPL/U-Boot SPL — инициализация DDR-памяти и базовой периферии
  • 🚀 U-Boot proper — загрузка ядра, dtb и ramdisk
  • 🐧 Ядро Linux — старт операционной системы

Подключение к консоли U-Boot через UART

Для работы с загрузчиком нужен USB-UART адаптер с уровнями 3.3 В (например, на чипе CP2102 или CH340 с переключателем напряжения). На платах Orange Pi отладочный порт выведен на отдельную трёхпиновую гребёнку рядом с основным GPIO — распиновку конкретной модели проверяйте в официальном руководстве пользователя, так как расположение контактов отличается между ревизиями.

Подключение выполняется перекрёстно: TX адаптера к RX платы, RX к TX, плюс общий GND. Линию питания от адаптера подключать не нужно — плата питается от своего источника. Скорость порта у большинства образов для Orange Pi составляет 115200 бод, но для отдельных сборок она может отличаться — сверяйтесь с документацией к образу.

screen /dev/ttyUSB0 115200

На Windows используют PuTTY или Tera Term, выбрав соответствующий COM-порт. Если при включении платы в терминал сыплются кракозябры — неверная скорость; если пусто — проверяйте перекрёстность TX/RX и общий земляной провод.

⚠️ Внимание: использование 5-вольтового UART-адаптера может вывести из строя процессор платы. Перед подключением убедитесь, что адаптер работает на уровнях 3.3 В — у многих моделей для этого есть перемычка или переключатель.

Основные команды консоли U-Boot

Чтобы попасть в консоль загрузчика, нажмите любую клавишу в терминале сразу после включения платы, пока идёт обратный отсчёт автозагрузки. Дальше вам доступен набор команд, который незаменим при диагностике.

КомандаНазначение
printenvПоказать переменные окружения загрузчика
setenv / saveenvИзменить переменную и сохранить её на носитель
mmc list / mmc dev 0Список MMC-устройств и выбор активного
fatls mmc 0:1Просмотр файлов на FAT-разделе SD-карты
bootПродолжить загрузку по сценарию по умолчанию

Например, если система не грузится с SD-карты, стоит проверить, видит ли загрузчик карту вообще: команда mmc list покажет обнаруженные устройства. Если список пуст — вероятна аппаратная проблема со слотом или картой, а не с образом системы.

📊 С какой задачей вы работаете в U-Boot на Orange Pi?
Восстановление после сбоя загрузки
Сборка собственного загрузчика
Настройка загрузки с USB/NVMe
Изучение из любопытства

Сборка U-Boot из исходников

Для плат на чипах Allwinner (H3, H5, H6) и Rockchip (RK3399, RK3588S) загрузчик собирается из основного репозитория u-boot или из веток сообщества. Понадобится кросс-компилятор gcc-aarch64-linux-gnu на машине с Linux. Конфигурация выбирается под конкретную плату — например, для Allwinner-плат существуют defconfig-файлы вида orangepi_*_defconfig, наличие нужного файла проверяется в каталоге configs/ исходников.

make CROSS_COMPILE=aarch64-linux-gnu- orangepi_zero_defconfig

make CROSS_COMPILE=aarch64-linux-gnu-

Точные имена конфигураций зависят от версии исходников и модели платы — всегда сверяйтесь с документацией вашей платы и списком в каталоге configs/, а не копируйте команды вслепую. Для плат Rockchip дополнительно требуются блобы TPL/SPL от производителя SoC, что меняет процедуру сборки.

☑️ Перед сборкой U-Boot

Выполнено: 0 / 5
⚠️ Внимание: запись самосборного загрузчика на eMMC или SPI-флеш при ошибке может привести к состоянию, когда плата не стартует ни с одного носителя. Сначала тестируйте сборку с SD-карты, которую легко перезаписать на компьютере.

Восстановление загрузчика на SD-карте и eMMC

Если загрузчик повреждён, но BROM исправен, восстановление сводится к записи рабочего образа на SD-карту с компьютера. Для этого используют dd в Linux или balenaEtcher / Raspberry Pi Imager в любой ОС. Образ берите строго под вашу модель — образ от Orange Pi 3 не подойдёт для Orange Pi 5, у них разные процессоры и разные загрузчики.

Для записи только загрузчика на уже размеченную карту применяется dd со смещением, типичным для данного семейства чипов. У Allwinner загрузчик обычно пишется со смещения 8 КБ от начала карты, у Rockchip схема иная (сектора для idbloader и u-boot). Точные смещения указаны в документации к вашему образу — ошибка в смещении сделает карту незагрузочной.

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8 conv=fsync

С eMMC сложнее: если плата не грузится ни с SD, ни с eMMC, у Rockchip-плат есть режим Maskrom, позволяющий прошить память напрямую через USB с помощью утилит производителя. У Allwinner аналогичную роль играет режим FEL. Порядок входа в эти режимы зависит от модели — ищите инструкцию именно для вашей платы.

Настройка порядка загрузки и переменных окружения

U-Boot хранит настройки в переменных окружения, которые сохраняются в специальной области носителя. Ключевые переменные: bootcmd (сценарий автозагрузки), bootargs (параметры ядра), boot_targets (порядок опроса устройств). Изменив boot_targets, можно заставить плату сначала пробовать загрузку с USB или NVMe, а потом с SD.

Изменения через setenv действуют только до перезагрузки, пока вы не выполните saveenv. Это удобно для безопасных экспериментов: сначала проверьте новую конфигурацию без сохранения, и только убедившись, что система грузится, зафиксируйте её.

  • 💾 Всегда проверяйте изменения до saveenv, а не после
  • 🔍 Команда printenv bootcmd покажет текущий сценарий загрузки
  • 🧪 Для разовой загрузки с другого устройства используйте run с нужным сценарием
Почему saveenv иногда не работает

Если переменные не сохраняются, возможно, загрузчик собран без указания области хранения env, либо область перезаписывается образом системы. Проверьте параметры CONFIG_ENV_OFFSET и CONFIG_ENV_SIZE в конфигурации сборки и не записывайте образ поверх области окружения.

Типичные проблемы и их диагностика

Самая частая жалоба — плата зависает на этапе Starting kernel.... Загрузчик отработал, ядро загружено, но не стартует. Возможные причины: несовместимый device tree (dtb от другой модели), повреждённый образ ядра или неверные bootargs. Проверьте, что dtb-файл соответствует именно вашей плате, и попробуйте загрузиться с эталонного образа от производителя.

Вторая типичная ситуация — циклическая перезагрузка сразу после старта U-Boot. Здесь стоит проверить блок питания: недостаточный ток вызывает просадку напряжения в момент инициализации DDR, и плата уходит в рестарт. Возьмите заведомо качественный источник с запасом по току и короткий толстый кабель — это устраняет значительную часть «необъяснимых» сбоев.

Если плата вообще не выводит ничего в UART даже с заведомо рабочей SD-картой и качественным питанием — вероятна аппаратная неисправность, и программные методы уже не помогут.

FAQ: частые вопросы о U-Boot на Orange Pi

Можно ли обновить U-Boot без перепрошивки всей системы?

Да, загрузчик записывается отдельно от корневой файловой системы — через dd со смещением, соответствующим вашему семейству чипов. Однако смещение и формат образа различаются между Allwinner и Rockchip, поэтому используйте инструкцию именно для вашей модели.

Плата не реагирует на нажатия клавиш в консоли U-Boot. Что делать?

Проверьте, что линия RX адаптера подключена к TX платы, а не к RX — это самая частая ошибка. Также убедитесь, что обе стороны соединены общим GND, а скорость порта совпадает с настройкой образа.

Чем отличается загрузка Orange Pi на Allwinner и на Rockchip?

Различаются структура загрузочных образов, смещения записи на носитель, режимы низкоуровневого восстановления (FEL у Allwinner, Maskrom у Rockchip) и набор блобов, необходимых для сборки. Инструкции для одного семейства неприменимы к другому.

Опасно ли менять переменные окружения U-Boot?

Команда setenv без saveenv полностью безопасна — после перезагрузки всё вернётся к прежнему состоянию. Риск появляется только при сохранении ошибочных значений, но и тогда загрузчик обычно можно сбросить, перезаписав носитель эталонным образом.

Можно ли загрузить Orange Pi по сети через U-Boot?

U-Boot поддерживает загрузку по TFTP и получение адреса по DHCP, если эти функции включены в сборке и плата имеет Ethernet. Это удобно для разработки: ядро и dtb подгружаются с сервера без перезаписи SD-карты. Наличие поддержки проверяйте командой help в консоли загрузчика.