U-Boot提示超时

时间:2016-05-05 12:35:10

标签: u-boot

我通过串口连接访问 U-boot 控制台,当 u-boot 提示我输入commands时,它似乎我的时间有限。我想输入几个commands,但我需要更多时间。

有没有人遇到过这样的问题?如何增加时间(如果这是问题)?

2 个答案:

答案 0 :(得分:0)

没有更多细节(例如平台,配置和版本),很难说。在正常情况下,您唯一的超时是停止自动启动。如果电路板在N秒开启后可靠地复位,则可能是触发了看门狗并且U-Boot未配置为知道并且禁用或定期调用看门狗以防止系统重置。

答案 1 :(得分:0)

U-Boot的引导重试机制

具有U-Boot命令提示符超时实际上可能是理想的行为,因为如果不这样做,引导的意外中断可能会使系统永久停留在U-Boot提示符下,直到下一个电源周期

鉴于此,除了Tom Rini提到的硬件监视程序可能性之外,您的U-Boot构建也可以通过“ Boot Retry”功能进行设置-并非没有可能其他找到此页面的人(和我一样)正在寻找一种方法故意造成这种行为。

如果看到以下内容,则可能是引导重试:

Timeout waiting for command
resetting ...

三个 build-time 配置选项和一个 run-time 变量控制引导重试:

  • CONFIG_BOOT_RETRY_TIME 是没有有效命令的默认秒数,此后(仍可中断)自动启动序列将自动重新运行。 / p>

  • 引导程序是一个环境变量,其中包含当前生效的延迟。负值表示将不进行引导重试。不幸的是,此值仅在启动时进行采样-更改不会阻止在当前会话中重新引导。

  • CONFIG_BOOT_RETRY_MIN 是上述环境变量的安全限制,但是似乎是负值或禁用值通过了检查。这使得很难推断出此设置的预期用法。如果未在配置中明确设置,则会为其分配CONFIG_BOOT_RETRY_TIME的值。

  • CONFIG_RESET_TO_RETRY 是一个选项,这意味着处理器将重新启动,而不是直接恢复自动启动顺序。实际上,这可能是使用引导重试的唯一受支持的方式。似乎是一个构建错误,要求您进行设置,否则请执行该操作。

关键说明:除了几个修补的派生叉外,这些不是您可以放入board_defconfig中的KConfig选项,而是#define的那些必须放在代码本身的C头文件中,特别是适用于您所构建的系统配置的一种。


禁用引导重试

如果您看到上述超时消息,并且怀疑引导重试有误,则有几种可能的方法来停止它。

首先,如果您的u-boot支持持久保存环境变量,则可以

u-boot> setenv bootretry -1
u-boot> saveenv

,然后重新启动。少数系统可能仍然存在古代错误,该错误会阻止解析负值,在这种情况下,您可以使用较大的正值,例如3600秒(一小时)。

但是不幸的是,如果没有保存环境变量,您将无法执行此操作,因为环境变量仅在启动时读取。要启用环境变量作为维护的 temporary 替代,您可以执行以下操作,以便每次通过有效命令重置超时后都重新评估它:

--- a/common/bootretry.c
+++ b/common/bootretry.c
@@ -39,6 +39,7 @@ void bootretry_init_cmd_timeout(void)
  */
 void bootretry_reset_cmd_timeout(void)
 {
+       bootretry_init_cmd_timeout(); //pickup any environment change
        endtime = endtick(retry_time);
 }

这似乎可行,因为您可以将bootretry设置为-1以进行扩展的手动维护。似乎您也可以将引导程序设置为比默认值更长的时间,但是出于不明原因,尝试将其设置为更短似乎不起作用

似乎至少有一部分是设计的机制,其中使用配置CONFIG_AUTOBOOT_STOP_STR然后进入它应该停止引导重试机制,但是我无法理解进行搜索或在搜索时找到有用的匹配内容。


要完全删除启动重试功能

要完全删除引导重试功能,请在适用于您的主板的代码(grep -r CONFIG_BOOT_RETRY *或类似名称)中找到定义该位置的位置,然后将其删除,重建并重新刷新。


要作为所需功能

实现引导重试

首先,将必要的#define放入适用于您的特定板的标题中,例如,如果您拥有Allwinner SoC,则可以这样做:

--- a/include/configs/sunxi-common.h
+++ b/include/configs/sunxi-common.h
@@ -16,6 +16,8 @@
 #include <asm/arch/cpu.h>
 #include <linux/stringify.h>

+#define CONFIG_BOOT_RETRY_TIME 60 //command prompt will timeout
+#define CONFIG_RESET_TO_RETRY     //required for above on this chip
+
 #ifdef CONFIG_OLD_SUNXI_KERNEL_COMPAT
 /*
  * The U-Boot workarounds bugs in the outdated buggy sunxi-3.4 kernels at the

然后重建u-boot,可能是这样的:

make CROSS_COMPILE=~/path/to/gcc-xxx-yyy-zzz-/bin/xxx-yyy-zzz- clean
make CROSS_COMPILE=~/path/to/gcc-xxx-yyy-zzz-/bin/xxx-yyy-zzz- your_board_defconfig
make CROSS_COMPILE=~/path/to/gcc-xxx-yyy-zzz-/bin/xxx-yyy-zzz- 

重新包装结果,并将其刷新到板上

警告:在覆盖现有的U-Boot之前,请务必确保您具有引导或闪烁的备份方式!

取决于您的主板,这可能类似于硬件本身从SD卡或USB棒启动,通过USB实用程序推送代码的能力,或者通过JTAG或类似功能启动主板的能力。 。在某些情况下,某些SoC如果将其保持复位状态,则会将这些线释放到SPI闪存中,从而允许您使用外部编程器-但另一些SoC不会释放这些线,这意味着您必须对闪存芯片进行拆焊。将不良的U-Boot加载到您无法通过其他方式注入代码的板上,但通过U-Boot本身可能会导致积木!