我通过串行连接访问U-boot的控制台,当u-boot提示我输入commands
时,似乎我只有有限的时间来做这件事。我想进入几个commands
,但我需要更多时间。
有没有人遇到过这样的问题?如何增加时间(如果这是问题)?
没有更多细节(例如平台,配置和版本),很难说。在正常情况下,您唯一的超时是停止自动启动。如果电路板在N秒开启后可靠地复位,则可能是触发了看门狗并且U-Boot未配置为知道并且禁用或定期占用看门狗以防止系统重置。
U-Boot的引导重试机制
让U-Boot命令提示超时实际上可能是理想的行为,因为没有这种情况,无意中断启动可能会使系统永久停留在U-Boot提示符下直到下一个电源循环。
鉴于此,除了Tom Rini提到的硬件监视器可能性之外,您的U-Boot构建还可以通过“引导重试”功能进行设置 - 并且其他人找到此页面的可能性也不大(因为我是)寻求一种故意造成这种行为的方法。
如果您看到以下内容,则可能是引导重试:
Timeout waiting for command
resetting ...
三个构建时配置选项和一个运行时变量管理引导重试:
重要说明:除了几个修补的分支外,这些不是您可以放在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本身可以产生一块砖!