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

11
我正在为英特尔Edison构建一个Yocto映像。其中一个映像组件是带有Edison特定补丁的u-boot。默认情况下,Edison的UART端口用于u-boot控制台。我想禁用此功能,但仅限于串行接口(u-boot还侦听USB,必须保留)。我的主要关注点是UART端口上的“按任意键停止自动引导”功能。我需要此端口连接可能在主设备启动过程中发送内容的配件。我该如何解决这个问题?是否有环境变量可以解决,还是需要修改源代码?提前感谢!
5个回答

14

现在我已经找到了一个合适的解决方案,将近一年后我回到了这个问题。

我所使用的开发板其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;
       }
    

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

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


此处也可参考。


7

4

没有办法在不修改U-Boot源代码(配置)的情况下完成此操作。

要禁用U-Boot中的串行控制台,您需要重新配置U-Boot。来自U-Boot主分支的文档:Readme.silent

根据该文档,您需要设置:

CONFIG_SILENT_CONSOLE
CONFIG_SILENT_CONSOLE_UPDATE_ON_SET
CONFIG_SYS_DEVICE_NULLDEV

如果你只希望U-Boot保持安静,那么还需要使用CONFIG_SILENT_U_BOOT_ONLY

你可能还需要测试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了解更多信息。


谢谢反馈!我看过了有关静默模式的文档,但此方法有一个缺陷——虽然控制台的输出现在已关闭,但控制台的输入(按任意键停止自动引导)实际上是有效的,你可以停止设备引导。我需要释放 UART 端口以便使用它与配件。我将更新我的问题来解决这个问题。 - Egor

1
根据Kyle的说法,您可以将bootdelay u-boot环境变量设置为-2。甚至可以使用fw_setenv实用程序从已启动的系统中执行此操作。在我的Mender Raspberry Pi映像中,该实用程序已预安装。
使用sudo fw_printenv bootdelay显示它的值为2,我使用sudo fw_setenv bootdelay -- -2将其设置为-2(请注意,在值之前加上--,以便将-2解释为值,而不是选项)。
在我的情况下,与OP类似,将LoraWAN节点连接到串行端口的树莓派上引起了启动中断。
因此,
- 删除导致问题的串行设备 - 从已启动的系统或引导加载程序中设置bootdelay - 关机并重新添加串行设备

0

这里是视频, 详细讲解如何逐步防止U-boot控制台中断自动启动并在Raspberry Pi上通过UART发送调试信息 - 对于其他使用U-boot的板子来说,应该可以类似地工作。但是,你需要在u-boot源文件夹中找到适合你板子的正确配置文件。我知道仅提供链接的答案往往会被忽视,所以这里简要说明一下解决方案:

安装依赖项

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

克隆官方的u-boot存储库。或者,您可以克隆我的存储库分支,我已经对静默自动引导所需的更改进行了修改 - 但是如果您需要最新版本,则需要克隆官方存储库并自行进行更改。

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

cd u-boot

找到您的板配置文件 - 它们取决于型号,例如树莓派3的rpi_3_defconfig,树莓派4的rpi_4_defconfig等。在文件末尾添加以下行:

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上发送任何消息,因为这些消息可能会让您的设备混乱。还有一件小事,设置静默引导环境变量。修改您的板子的头文件(例如树莓派是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 文件,您需要将其重命名(对于 Raspberry Pi 3,请重命名为 uboot_rpi_3.bin),并将其复制到 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接