Как отключить последовательную консоль (не ядро) в u-boot
Я создаю образ Yocto для Intel Edison.
Одним из компонентов образа является u-boot с патчем для Edison. По умолчанию порт UART Эдисона используется для консоли u-boot. Я хочу отключить эту функцию, но только на последовательном интерфейсе (u-boot также прослушивает USB, и это должно остаться).
Мое основное беспокойство вызывает функция "Нажмите любую клавишу, чтобы остановить автозагрузку" на порте UART. Мне нужен этот порт для подключения аксессуара, который может отправлять что-то во время процесса загрузки основного устройства.
Как мне подойти к этой проблеме? Есть ли переменная окружения для этого или мне нужно изменить источники?
Заранее спасибо!
5 ответов
Я возвращаюсь к этому вопросу почти год спустя, и теперь мне удалось найти правильное решение.
На плате, над которой я работал, был достаточно новый U-boot в BSP. Чтобы отключить последовательную консоль, мне пришлось сделать следующее:
Добавьте следующее определение в заголовок конфигурации платы (находится в include / configs / board.h):
#define CONFIG_DISABLE_CONSOLE #define CONFIG_SILENT_CONSOLE #define CONFIG_SYS_DEVICE_NULLDEV
Проверьте, включен ли на вашем форуме early_init_f в том же файле:
#define CONFIG_BOARD_EARLY_INIT_F 1
Найдите файл arch (что-то вроде arch/x86/cpu/ Architecture/ Architecture.c) и добавьте этот вызов в его функцию early_init_f. Это фактически изменяет глобальную переменную данных платы, чтобы иметь эти флаги:
gd->flags |= (GD_FLG_SILENT | GD_FLG_DISABLE_CONSOLE);
На моей плате такого не было, поэтому мне пришлось добавить всю функцию
int board_early_init_f(void) { gd->flags |= (GD_FLG_SILENT | GD_FLG_DISABLE_CONSOLE); return 0; }
Вот и все. Надеюсь, это поможет кому-то еще!
Установка переменной среды u-boot bootdelay
в -2
отключает возможность UART прерывать процесс загрузки в U-Boot 2017.01
релиз. Похоже, что -1
это особый случай.
Увидеть common/autoboot.c
от вашего исходного дерева U-Boot для деталей.
Нет способа сделать это без изменения источника (конфигурации) U-Boot.
Чтобы отключить последовательную консоль в U-Boot, вам необходимо перенастроить U-Boot. Документация от основной ветки U-Boot: Readme.silent
В соответствии с этим вам необходимо установить:
CONFIG_SILENT_CONSOLE
CONFIG_SILENT_CONSOLE_UPDATE_ON_SET
CONFIG_SYS_DEVICE_NULLDEV
CONFIG_SILENT_U_BOOT_ONLY
также требуется, если вы хотите, чтобы только U-Boot молчал.
Вам также может понадобиться проверить с CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC
и, возможно, добавление silent 1
в CONFIG_EXTRA_ENV_SETTINGS
,
== ОБНОВЛЕНИЕ ==
Смотрите следующие параметры для возможного обходного пути:
CONFIG_ZERO_BOOTDELAY_CHECK
CONFIG_AUTOBOOT_KEYED
CONFIG_AUTOBOOT_KEYED_CTRLC
CONFIG_AUTOBOOT_PROMPT
CONFIG_AUTOBOOT_DELAY_STR
CONFIG_AUTOBOOT_STOP_STR
Эти параметры, по крайней мере, дадут вам способ требовать магическую строку для остановки загрузки. Этого может быть достаточно, чтобы помочь вам. Смотрите README.autoboot
Как сказал Кайл, вы можете установить для переменной среды bootdelay u-boot значение -2. Это можно сделать даже из загруженной системы, используя
fw_setenv
утилита. На моем образе raspberry pi эта утилита была предустановлена.
С использованием
sudo fw_printenv bootdelay
показал, что он был установлен на 2, я установил его на -2 с помощью
sudo fw_setenv bootdelay -- -2
(Обратите внимание
--
перед значением, поэтому
-2
интерпретируется как значение, а не как вариант).
В моем случае это была проблема, аналогичная OP, с узлом LoraWAN на Raspberry Pi, подключенным через последовательный порт, который прервал загрузку.
Так
- удалите последовательное устройство, вызывающее проблему
- установить bootdelay либо из загруженной системы, либо из загрузчика
- выключите и добавьте последовательное устройство обратно
Вот видео, в котором шаг за шагом объясняется, как предотвратить прерывание автоматической загрузки консоли U-boot и отправку отладочных сообщений по UART на Raspberry Pi - он должен работать аналогично для других плат, при условии, что они используют U-boot. Однако вам нужно будет найти правильные файлы конфигурации для вашей платы в исходной папке u-boot. Я знаю, что ответы только на ссылки не одобряются, поэтому вот краткое описание решения:
Установите зависимости
sudo apt install git make gcc gcc-aarch64-linux-gnu
Git клонирует официальный репозиторий u-boot. В качестве альтернативы вы можете git clone my fork репозитория, где у меня уже есть необходимые изменения для автоматической загрузки без звука, но если вам нужна последняя версия, вам нужно клонировать официальный репозиторий и внести изменения самостоятельно.
git clone --depth 1 git://git.denx.de/u-boot.git
cd u-boot
Найдите файлы конфигурации платы - они зависят от модели, например, rpi_3_defconfig для Raspberry Pi 3, rpi_4_defconfig для Raspberry Pi 4 и так далее. Добавьте следующие строки в конец файла
CONFIG_BOOTDELAY=-2
CONFIG_SILENT_CONSOLE=y
CONFIG_SYS_DEVICE_NULLDEV=y
CONFIG_SILENT_CONSOLE_UPDATE_ON_SET=y
CONFIG_SILENT_U_BOOT_ONLY=y
Первая строка удаляет задержку загрузки, поэтому автоматическая загрузка не будет прервана сообщениями, отправленными через интерфейс UART. Следующие четыре строки включают автоматическую загрузку, поэтому U-boot не будет отправлять никаких сообщений на сам UART, потому что сообщения могут, в свою очередь, запутать ваше устройство. Осталась еще одна мелочь, установить переменную среды тихой загрузки. Измените заголовочный файл для вашей платы (ro raspberry pi это include/configs/rpi.h):
#define CONFIG_EXTRA_ENV_SETTINGS \
"dhcpuboot=usb start; dhcp u-boot.uimg; bootm\0" \
"silent=1\0" \
ENV_DEVICE_SETTINGS \
ENV_DFU_SETTINGS \
ENV_MEM_LAYOUT_SETTINGS \
BOOTENV
Теперь настройте с помощью
make rpi_3_defconfig
из основной папки репозитория и построить с
make CROSS_COMPILE=aarch64-linux-gnu-
Когда процесс сборки завершится, у вас будет файл u-boot.bin, который вам нужно переименовать и скопировать на SD-карту Raspberry Pi. Теперь Raspberry Pi не будет беспокоить никакие сообщения на UART во время загрузки. Функциональность UART после загрузки не пострадает.
Соответствующие документы: https://gitlab.denx.de/u-boot/u-boot/blob/HEAD/doc/README.autoboot https://gitlab.denx.de/u-boot/u-boot/blob/HEAD/doc/README.silent https://wiki.ubuntu.com/ARM/RaspberryPi