如何在 u-boot 中禁用串行控制台(非内核)

How to disable serial console(non-kernel) in u-boot

我正在为 Intel Edison 构建 Yocto 映像。

图像的一个组件是带有 Edison 特定补丁的 u-boot。默认情况下,Edison 的 UART 端口用于 u-boot 控制台。我想禁用此功能,但仅限于串行接口(u-boot 也侦听 USB 并且需要保留)。

我主要关心的是 UART 端口上的“按任意键停止自动启动”功能。我需要这个端口来连接一个配件,这个配件可能会在主设备的启动过程中发送一些东西。

我该如何解决这个问题?是否有用于此的环境变量,或者我是否需要修改源代码?

提前致谢!

如果不修改 U-Boot 的源(配置),就没有办法做到这一点。

要在U-Boot 中禁用串行控制台,您需要重新配置U-Boot。 U-Boot master 分支的文档: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

差不多一年后我又回到这个问题上,现在我设法找到了一个合适的解决方案。

我正在处理的开发板在其 BSP 中有一个相当新的 u-boot。要禁用串行控制台,我必须执行以下操作:

  • 将以下定义添加到开发板的配置中header(位于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;
       }
    

示例: 如果您正在寻找 Orange Pi 4B 的 board_early_init_f,它在 /build/cache/sources/u-boot/v2020.10/board/rockchip/evb_rk3399/evb-rk3399.c

就是这样。希望这对其他人有帮助!


also

将 u-boot 环境变量 bootdelay 设置为 -2 禁用 UART 在 U-Boot 2017.01 版本上中断引导过程的能力。看来 -1 是个特例。

See common/autoboot.c from your U-Boot source tree了解详情。 关于 U-Boot Environment Variables

Here is the video 其中逐步解释了如何防止 U-boot 控制台中断自动引导并在 Raspberry Pi 上的 UART 上发送调试消息 - 它应该适用于其他板,前提是他们使用 U-boot。但是,您需要在 u-boot 源文件夹中为您的电路板找到正确的配置文件。我知道只有链接的答案是不受欢迎的,所以这里是解决方案的快速分解:

安装依赖项

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

Git 克隆官方 u-boot 存储库。或者,您可以 git 克隆 my fork of repository,其中我已经对静默自动引导进行了必要的更改 - 但如果您需要最新版本,则需要克隆官方存储库并自行进行更改。

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 本身上发送任何消息,因为这些消息可能会反过来混淆您的设备。还剩下一件小事,设置静默引导环境变量。通过添加以下内容更改您的板的头文件(对于 raspberry pi 它是 include/configs/rpi.h ):

#define CONFIG_EXTRA_ENV_SETTINGS \
    "dhcpuboot=usb start; dhcp u-boot.uimg; bootm[=13=]" \
    "silent=1[=13=]" \
    ENV_DEVICE_SETTINGS \
    ENV_DFU_SETTINGS \
    ENV_MEM_LAYOUT_SETTINGS \
    BOOTENV

现在配置

make rpi_3_defconfig

来自存储库主文件夹并使用

构建
make CROSS_COMPILE=aarch64-linux-gnu-

构建过程完成后,您将得到一个 u-boot.bin 文件,您需要重命名该文件(uboot_rpi_3.bin for Raspberry Pi 3)并复制到 Raspberry Pi SD 卡位于 /boot/firmware/。现在你 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

正如 Kyle 所说,您可以将 bootdelay u-boot 环境变量设置为 -2。 这甚至可以使用 fw_setenv 实用程序从引导系统完成。 在我的 mender raspberry pi 图像上,此实用程序已预安装。

使用 sudo fw_printenv bootdelay 显示它被设置为 2,我用 sudo fw_setenv bootdelay -- -2 将它设置为 -2(注意值之前的 --,所以 -2 被解释作为价值,而不是一个选项)。

在我的例子中,这是一个与 OP 类似的问题,raspberry pi 上的 LoraWAN 节点通过中断启动的串行端口连接。

所以

  • 删除导致问题的串行设备
  • 从引导系统或引导加载程序设置引导延迟
  • 关闭并重新添加串行设备