Как отключить последовательную консоль (не ядро) в u-boot

Я создаю образ Yocto для Intel Edison.

Одним из компонентов образа является u-boot с патчем для Edison. По умолчанию порт UART Edison используется для консоли u-boot. Я хочу отключить эту функцию, но только на последовательном интерфейсе (u-boot также прослушивает USB, и это должно остаться).

Меня больше всего беспокоит функция «Нажмите любую клавишу, чтобы остановить автозагрузку» на порту UART. Мне нужен этот порт для подключения аксессуара, который может отправлять что-то во время процесса загрузки основного устройства.

Как мне подойти к этой проблеме? Есть ли для этого переменная окружения или мне нужно изменить исходники?

Заранее спасибо!


person Egor    schedule 18.12.2015    source источник


Ответы (4)


Я возвращаюсь к этому вопросу почти год спустя, теперь мне удалось найти правильное решение.

Плата, над которой я работал, имела относительно новый 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/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;
       }
    

Пример: если вы ищете board_early_init_f для Orange Pi 4B, он находится в /build/cache/sources/u-boot/v2020.10/board/rockchip/evb_rk3399/evb-rk3399.c.

Вот и все. Надеюсь, это поможет кому-то еще!


см. также

person Egor    schedule 01.11.2016

Это невозможно сделать без изменения исходного кода (конфигурации) 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

person Anders    schedule 21.12.2015
comment
Спасибо за ответ! Я видел документацию по тихому режиму, но у этого метода есть один недостаток - хотя вывод консоли теперь отключен, ввод консоли (Нажмите любую клавишу, чтобы остановить автозагрузку) действительно работает, и вы можете остановить загрузку устройства. Мне нужно освободить порт UART, чтобы использовать его с аксессуаром. Я обновлю свой вопрос, чтобы решить эту проблему - person Egor; 21.12.2015

Установка переменной среды u-boot с bootdelay на -2 отключает способность UART прерывать процесс загрузки в выпуске U-Boot 2017.01. Похоже, что -1 — это особый случай.

Подробнее см. common/autoboot.c в дереве исходных кодов U-Boot. Об переменных среды U-Boot

person Kyle    schedule 07.02.2019

Вот видео, в котором пошагово объясняется, как сделать так, чтобы консоль U-boot не прерывала автозагрузку и не отправляла отладку сообщения по UART на Raspberry Pi — должно работать аналогично для других плат, при условии, что они используют U-boot. Однако вам нужно будет найти правильные файлы конфигурации для вашей платы в исходной папке u-boot. Я знаю, что ответы только на ссылки не одобряются, поэтому вот краткое описание решения:

Установите зависимости

sudo apt install git make gcc gcc-aarch64-linux-gnu

Git клонирует официальный репозиторий u-boot. В качестве альтернативы вы можете клонировать мой форк репозитория, где у меня уже есть необходимые изменения для тихой автозагрузки. - но если вам нужна последняя версия, то вам нужно клонировать официальный репозиторий и самостоятельно вносить изменения.

git clone --depth 1 git://git.denx.de/u-boot.git

cd u-boot

Найдите файлы конфигурации вашей платы - они зависят от модели, например. rpi

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
defconfig для Raspberry Pi 3, rpi
#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
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, потому что сообщения, в свою очередь, могут запутать ваше устройство. Осталась еще одна мелочь, установить переменную среды тихой загрузки. Измените заголовочный файл для вашей платы (для 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

person Dmitry Maslov    schedule 29.10.2020