【问题标题】:How to disable serial console(non-kernel) in u-boot如何在 u-boot 中禁用串行控制台(非内核)
【发布时间】:2016-03-25 05:38:32
【问题描述】:

我正在为英特尔 Edison 构建 Yocto 映像。

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

我主要关心的是 UART 端口上的“Press any key to stop autoboot”功能。我需要这个端口来连接一个配件,该配件可能会在主设备的启动过程中发送一些东西。

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

提前致谢!

【问题讨论】:

    标签: linux embedded-linux u-boot yocto intel-edison


    【解决方案1】:

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

    我正在开发的电路板在其 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

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


    also

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        没有办法做到这一点,除非修改 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

        【讨论】:

        • 感谢您的反馈!我看过关于静默模式的文档,但是这种方法有一个缺陷 - 虽然控制台的输出现在已关闭,但控制台的输入(Press any key to stop autoboot)实际上可以工作,你可以阻止设备启动。我需要将 UART 端口设置为空闲,以便将其与附件一起使用。我会更新我的问题来解决这个问题
        【解决方案4】:

        正如 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
        • 关闭并重新添加串行设备

        【讨论】:

          【解决方案5】:

          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 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.autoboothttps://gitlab.denx.de/u-boot/u-boot/blob/HEAD/doc/README.silenthttps://wiki.ubuntu.com/ARM/RaspberryPi

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-10-06
            • 1970-01-01
            • 2021-09-23
            • 2015-08-09
            • 1970-01-01
            • 2017-10-10
            • 2017-10-01
            • 2018-09-27
            相关资源
            最近更新 更多