U-boot取消或修改启动延时bootdelay

本文介绍如何在U-Boot中配置启动延时,并解释如何解决因设置为0而导致无法进入U-Boot菜单的问题。文章还提供了修改源码的方法以实现更灵活的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我们的实际项目中都希望uboot尽量能够快速启动,这就涉及到uboot的裁剪工作,由于裁剪的工作量和内容比较多,这里暂不描述。但是uboot有个启动延时bootdelay,在我们进入linux内核之前会有个短暂的倒计时,可能是1秒也可能是2秒。这个延时用于在uboot启动之后避免直接进入linux内核,在进入内核之前按下Enter键可以进入uboot菜单,在这个管理界面中我们可以执行很多的操作,根据命令行我们可以设计环境变量等参数,其中有一项便是“bootdelay”。一般我们会在产品量产之前会把bootdelay设置为0,以便快速进入linux系统,但是我们处于开发调试阶段经常需要在uboot的菜单界面下进行操作,首次烧写uboot我们可以在此文件夹下修改uboot的bootdelay“uboot/include/configs/xxxx.h”,其中xxxx代表你单板名称,就是你make的时候后面携带的单板名称,比如“make sun8iw5p1”,那我对应的文件就是“sun8iw5p1.h”。这个文件下有一行代码如下:

#define CONFIG_BOOTDELAY    1

“1”表示uboot启动延时为1s,“首次”烧写uboot你可以根据这个值来进行修改启动时间,一旦烧写进单板后,以后uboot都是按这个 1 秒来延时,你可以通过以下的uboot命令来进行修改,如下:

seten bootdelay 2
saveen

这样设置后这个2就会被读入uboot的环境变量区保存起来。但我们可能会遇到一个问题,如果设置为“0”后呢,如下:

seten bootdelay 0

这样设置后uboot环境变量区的bootdelay就是0,也就是没有启动延时了,我们也没办法再进去uboot菜单管理界面了,此时你可能会去修改我刚才说的“uboot/include/configs/xxxx.h”这个文件夹里面的“CONFIG_BOOTDELAY”然后重新烧写uboot。但是实测告诉你那是不行的,因为uboot每次启动他都先去读取了flash里面的环境变量,除非里面没任何数据才会来取这个宏的定义,但是我们之前已经把“0”写入环境变量区了,那还有救嘛,当然有!只要不让uboot从环境变量里面取不就行了吗!经过查看uboot源码,发现在源码文件“uboot/common/main.c”中做了如下的判断:

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
    s = getenv ("bootdelay");
    bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;
    debug ("### main_loop entered: bootdelay=%d\n\n", bootdelay);

先去取了环境变量的值做判断,有就直接用,那直接把这个判断去掉并改为每次都取“CONFIG_BOOTDELAY”的值不就行了,如下:

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
    s = getenv ("bootdelay");
    bootdelay = CONFIG_BOOTDELAY;
    debug ("### main_loop entered: bootdelay=%d\n\n", bootdelay);

这样我们再去修改“uboot/include/configs/xxxx.h”下的 CONFIG_BOOTDELAY 这个宏就可以了,把他改为 1 就是延时 1 秒,改为 0 就每次启动都没有延时,这样也符合我们的产品需求。但一般是最后阶段我们才做这个修改,因为这里一旦修改后你通过uboot命令行就无法通过“seten bootdelay”来修改启动延时了,因为它每次都取的是你源码中设置的值。

### U-Boot 启动内核的命令及相关使用方法 U-Boot 是一个功能强大的引导加载程序,用于初始化硬件并启动操作系统内核。在 U-Boot 中,启动内核的过程由特定的命令控制,这些命令通过 `U_BOOT_CMD` 宏定义,并且每个命令都有其特定的功能和用法。 #### 命令定义 U-Boot 的命令是通过 `U_BOOT_CMD` 宏来定义的,格式如下: ```c U_BOOT_CMD(name, maxargs, repeatable, command, "usage", "help") ``` 其中: - `name` 是命令的名称。 - `maxargs` 是命令支持的最大参数数量。 - `repeatable` 表示该命令是否可以重复执行。 - `command` 是指向实现该命令功能的函数指针。 - `"usage"` 是命令的简要用法说明。 - `"help"` 是更详细的帮助信息[^2]。 #### 启动内核的命令 U-Boot 中用于启动内核的主要命令是 `boot` 和 `bootm`。 1. **`boot` 命令** - 该命令是一个通用的启动命令,会根据配置自动选择合适的启动方式。 - 使用方法:直接输入 `boot` 即可触发默认的启动流程。 - 默认情况下,`boot` 命令会调用 `bootm` 命令来启动内核。 2. **`bootm` 命令** - `bootm` 是 U-Boot 中专门用于启动内核的命令。 - 使用方法: ```bash bootm <kernel_addr> [<initrd_addr> <fdt_addr>] ``` - `<kernel_addr>` 是内核镜像在内存中的地址。 - `<initrd_addr>` 是初始化 RAM 磁盘(initrd)的地址(可选)。 - `<fdt_addr>` 是设备树(Device Tree Blob, DTB)的地址(可选)[^1]。 3. **`go` 命令** - 该命令用于跳转到指定地址并开始执行代码。 - 使用方法: ```bash go <address> ``` - `<address>` 是要跳转的内存地址。 #### 示例代码 以下是一个典型的 U-Boot 启动内核的流程: ```bash # 加载内核到内存地址 0x80000000 tftp 0x80000000 uImage # 如果需要加载 initrd 和 dtb tftp 0x81000000 uInitrd tftp 0x82000000 uDtb # 启动内核 bootm 0x80000000 0x81000000 0x82000000 ``` #### 配置选项 在某些情况下,可能需要通过配置文件启用特定的启动介质支持。例如,启用从 SPI 闪存启动的支持可以通过以下配置实现: ```makefile # Boot media CONFIG_SPI_BOOT=y CONFIG_BOOTDELAY=3 ``` 上述配置表示启用了从 SPI 闪存启动的支持,并设置了 3 秒的启动延迟[^3]。 #### 注意事项 - 在使用 `bootm` 命令时,确保内核、initrd 和 DTB 的地址正确无误。 - 如果系统中没有 DTB initrd,则可以省略对应的参数。 - 不同平台的 U-Boot 可能有不同的命令扩展功能,具体请参考相关文档。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值