Плата 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 из исходников
Для плат на чипах 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
⚠️ Внимание: запись самосборного загрузчика на 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 в консоли загрузчика.