9

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

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

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

我该如何解决这个问题?是否有为此的环境变量,还是我需要修改源?

提前致谢!

4

5 回答 5

12

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

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

  • 将以下定义添加到板的配置头(位于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

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


于 2016-11-01T19:39:46.890 回答
4

将 u-boot 环境变量设置bootdelay-2禁用 UART 在 U-Boot2017.01发布时中断引导过程的能力。看来这-1是个特例。

有关详细信息,请参阅common/autoboot.c您的 U-Boot 源代码树。关于U-Boot 环境变量

于 2019-02-07T00:03:59.390 回答
3

如果不修改 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 1CONFIG_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

于 2015-12-21T06:18:24.940 回答
1

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

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

在我的情况下,这是一个与 OP 类似的问题,树莓派上的 LoraWAN 节点通过中断启动的串行端口连接。

所以

  • 删除导致问题的串行设备
  • 从引导系统或引导加载程序设置 bootdelay
  • 关闭并重新添加串行设备
于 2021-09-16T20:57:37.410 回答
0

这是视频,其中逐步解释了如何防止 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 clone 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\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)并复制到位于 /boot/firmware/ 的 Raspberry Pi SD 卡。现在,您的 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

于 2020-10-29T02:03:34.983 回答