如何在 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 节点通过中断启动的串行端口连接。
所以
- 删除导致问题的串行设备
- 从引导系统或引导加载程序设置引导延迟
- 关闭并重新添加串行设备
我正在为 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 节点通过中断启动的串行端口连接。
所以
- 删除导致问题的串行设备
- 从引导系统或引导加载程序设置引导延迟
- 关闭并重新添加串行设备