天天看點

uboot指令說明

A:Uboot的指令功能

Uboot在硬體初始化完成之後 調用 main_loop()進入一個無限循環,等待使用者輸入指令

當使用者輸入指令之後,首先将調用run_command()函數, 然後調用find_cmd()函數把使用者從終端輸入的指令進行比較,當find_cmd()傳回值 不等于0,則将調用指令處理函數

find_cmd()函數将從系統預設的指令表中查詢一個比對的指令,

指令表(定義在board/fads/u-boot.lds中)

_uboot_cmd_start = .;

.u_boot_cmd : {*(.u_boot_cmd)}

_uboot_cmd_end = .;

u_boot_cmd中是定義的指令(定義在command.h中)

#define Struct_Section __attribute__ ((unused,section(".uboot_cmd")))

#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \ cmd_tbl_t  __u_boot_cmd_##nameStruc_Section {#name, maxargs, rep , cmd, usage}

command.c中定義了和指令本身相關的指令處理程式,而cmd_***檔案則是某一類型的指令處理程式,這些指令處理程式構成了U-boot指令處理功能(Uboot指令以16進制的格式顯示)

B:指令使用

1.資訊顯示

bdinfo(縮寫bdi), 列印開發的資訊

coninfo(縮寫conin),列印序列槽裝置資訊

flinfo(縮寫fli),列印目前系統flash資訊

iminfo(縮寫imi),列印映像頭部資訊

help,列印幫助資訊

2.記憶體控制指令

base,列印和設定記憶體中的位址偏移量

crc32計算校驗和,用于計算一段記憶體空間的檢驗和,當該指令帶3個參數表示把計算出來的校驗和寫到第三個參數所在的存儲單元中

cmp,記憶體比較,用于比較兩端記憶體内容是否相同

cp,資料拷貝,可以進行燒錄flash,也可以進行記憶體中的資料拷貝

md,記憶體顯示

erase,擦除flash中的内容,每次flash燒錄前必須先對flash進行擦除

protect 打開和關閉寫保護,防止flash重要區域不被誤寫

3.運作控制指令

bootm-加載和啟動映像

bootm用于加載并啟動使用mkimage工具(tools中)打包過的映像

bootm用于将核心映像加載到指定的位址,如果需要還要進行解壓映像

然後給核心傳遞不同的核心參數,最後啟動核心

bootm可以有2個參數,第1個參數為核心映像的位址,第二個為可選參數,即initrd映像位址

當采用ramdisk作為根檔案系統時需要使用bootm第二個參數,當需要加載initrd時,uboot把核心映像加載到指定位址,然後把Ramdisk映像的大小和位址告訴核心

go-啟動映像

go指令時另外一種啟動映像的指令,go将直接跳轉到某個位址然後執行放在該位址處的核心映像

go指令不設定環境變量,也不能解析映像

4.資料下載下傳指令

tftpboot通過tftp協定下載下傳映像

需配置dhcp伺服器和tftp伺服器,tftpboot指令之會到指定的目錄下載下傳映像

即:/etc/xinetd.d/tftp下server_args中配置的目錄下,

5.環境變量設定指令

printenv(pri)列印目前環境變量

setenv-設定環境變量

當setenv有一個參數時,就是删除該環境變量,當有兩個參數則把第二個參數作為環境變量

設定完要使用saveenv儲存環境變量

如果想講某個環境變量設定為多條語句,則需使用雙引号

ep:

setenv bootcmd “tftpboot 0x100000000 uImage; bootm 0x10000000”

C、U-Boot環境變量

當uboot啟動時,首先将調用env_init()進行初始化,從配置的環境變量所在位址CFG_ENV_ADDR

(該位址在environment.h中定義,被定義成CFG_FLASH_BASE + CFG_ENV_OFFSET)讀取指定大小

的資料來計算循環備援校驗值CRC,并計算出CRC值是否和存放在環境變量區開頭的CRC值相等,若相等,則證明資料沒有被破壞,是以将把儲存在FLASH上的位址作為環境變量位址(gd->env_addr設定為offsetof(env_t,data))

預設的環境變量設定在 default_environment中

unchar default_environment[] = {

#ifdef CONFIG_BOOTARGS

"bootargs=" CONFIG_BOOTARGS "\0"

#endif

#ifdef CONFIG_BOOTCOMMAND

"bootcmd=" CONFIG_BOOTCOMMAND "\0"

#ifdef CONFIG_NFSBOOTCOMMAND

"nfsboot=" CONFIG_NFSBOOTCOMMAND "\0"

#if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)

"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"

...

}

從上面可以看出,一個環境變量的設定取決于響應的宏是否已經被定義,例如隻有定義的宏CONFIG_BOOTARGS才會定義環境變量”bootargs“

環境變量設定分為動态設定(通過剛才的宏)與靜态設定(通過setenv)

重要的環境變量:

1.bootcmd

  環境變量用于設定啟動時自動加載的指令序列,但該環境變量隻有在設定了CONFIG_BOOTDELAY時才會生效,實際上 main_loop()函數隻有在CONFIG_BOOTDELAY被定義且大于0時,才會對”bootcmd“進行解析

2.bootargs

bootargs可以設定核心啟動參數,即用于設定傳遞給核心的參數

核心啟動時,将對這些啟動參數進行處理,即拷貝到相應的記憶體位址處

lib_arm目錄下的armlinux.c檔案中的函數 do_bootm_linux()将對啟動參數進行分析

必須定義了CONFIG_CMDLINE_TAG時才會對指令進行分析

首先 調用commandline=getenv("bootargs")獲得系統設定的指令行參數

調用 setup_commandline_tag()對核心指令參數進行處理

,在setup_commandline_tag()判斷指令行的有效性,并拷貝到全局變量params中

params = (struct tag *)bd->bi_boot_params;

而響應的bi_boot_params是在闆級對應的檔案中初始化的,

gd->bd->bi_bot_params=0x10000100

這裡指定的位址必須與作業系統核心指定的核心位址一緻

arch/arm/mach-omap/innovator.c

MACHINE_START(INNOVATOR, "TI-Innovator/OMAP1510")

MAINTAINER("Monta Visa Software, Inc")

BOOT_MEM(0x100000000, 0xe0000000, 0xe0000000)

BOOT_PARAMS(0X10000010)  //uboot中的bi_bot_params 位址要與這裡一緻

FIXUP(fixup_innovator)

MAPIO(innovator_map_io)

INITIRQ(innovator_init_irq)

MACHINE_END