在我们的实际项目中都希望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
“1”表示uboot启动延时为1s,“首次”烧写uboot你可以根据这个值来进行修改启动时间,一旦烧写进单板后,以后uboot都是按这个 1 秒来延时,你可以通过以下的uboot命令来进行修改,如下:
seten bootdelay 2
saveen
- 1
- 2
这样设置后这个2就会被读入uboot的环境变量区保存起来。但我们可能会遇到一个问题,如果设置为“0”后呢,如下:
seten bootdelay 0
- 1
这样设置后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);
- 1
- 2
- 3
- 4
先去取了环境变量的值做判断,有就直接用,那直接把这个判断去掉并改为每次都取“CONFIG_BOOTDELAY”的值不就行了,如下:
#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
s = getenv ("bootdelay");
bootdelay = CONFIG_BOOTDELAY;
debug ("### main_loop entered: bootdelay=%d\n\n", bootdelay);
- 1
- 2
- 3
- 4
这样我们再去修改“uboot/include/configs/xxxx.h”下的 CONFIG_BOOTDELAY 这个宏就可以了,把他改为 1 就是延时 1 秒,改为 0 就每次启动都没有延时,这样也符合我们的产品需求。但一般是最后阶段我们才做这个修改,因为这里一旦修改后你通过uboot命令行就无法通过“seten bootdelay”来修改启动延时了,因为它每次都取的是你源码中设置的值。