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