u-boot取消或修改啟動延時bootdelay


轉自:https://blog.csdn.net/itdo_just/article/details/78361519

在我們的實際項目中都希望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”來修改啟動延時了,因為它每次都取的是你源碼中設置的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM