U-Boot提示超时

问题描述 投票:0回答:2

我通过串行连接访问U-boot的控制台,当u-boot提示我输入commands时,似乎我只有有限的时间来做这件事。我想进入几个commands,但我需要更多时间。

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

u-boot
2个回答
0
投票

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


0
投票

U-Boot的引导重试机制

让U-Boot命令提示超时实际上可能是理想的行为,因为没有这种情况,无意中断启动可能会使系统永久停留在U-Boot提示符下直到下一个电源循环。

鉴于此,除了Tom Rini提到的硬件监视器可能性之外,您的U-Boot构建还可以通过“引导重试”功能进行设置 - 并且其他人找到此页面的可能性也不大(因为我是)寻求一种故意造成这种行为的方法。

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

Timeout waiting for command
resetting ...

三个构建时配置选项和一个运行时变量管理引导重试:

  • CONFIG_BOOT_RETRY_TIME是没有有效命令的默认秒数,之后将自动重新运行(仍然可中断的)自动启动序列。
  • bootretry是一个环境变量,包含当前有效的延迟。负值意味着不会发生引导重试。不幸的是,此值仅在启动时进行采样 - 更改它不会阻止当前会话中的引导重试。
  • 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

然后重启。一些系统可能仍然有一个古老的bug,可以防止解析负值,在这种情况下你可以使用一个大的正值,例如3600秒(一小时)。

但遗憾的是,如果不保存环境变量,则无法执行此操作,因为它仅在启动时读取。要使用环境变量作为维护的临时覆盖,您可以执行类似这样的操作,以便在每次通过有效命令重置超时时重新评估它:

--- 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以进行扩展的手动维护。您似乎也可以将bootretry设置为比默认值更长,但由于不理解的原因,尝试将其设置得更短似乎不起作用。

似乎至少部分设计在机制中使用配置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闪存,允许你使用外部编程器 - 但是其他人不会释放线路,这意味着你必须拆除闪存芯片。将一个糟糕的U-Boot加载到你无法通过其他方式注入代码的板上,但是通过U-Boot本身可以产生一块砖!

© www.soinside.com 2019 - 2024. All rights reserved.