@main_loop:這個函式裡有太多編譯選項,對於smdk2410,去掉所有選項後等效下面的程式
複製內容到剪貼簿
**:void main_loop()
;int len;
int rc = 1;
int flag;
char *s;
int bootdelay;
s = getenv ("bootdelay"); //自動啟動核心等待延時
bootdelay = s ? (int)******_strtol(s, null, 10) : config_bootdelay;
debug ("### main_loop entered: bootdelay=%d/n/n", bootdelay);
s = getenv ("bootcmd"); //取得環境中設定的啟動命令列
debug ("### main_loop: bootcmd=/"%s/"/n", s ? s : "");
if (bootdelay >= 0 && s && !abortboot (bootdelay))
for (;;)
}
@run_comman(); 在命令table中查詢匹配的命令名稱,得到對應命令結構體變數指標,以解析得到的引數呼叫其處理函式執行命令
@命令結構構體型別定義:command.h中,
複製內容到剪貼簿
**:struct cmd_tbl_s
;typedef struct cmd_tbl_s cmd_tbl_t;
//定義section屬性的結構體。編譯的時候會單獨生成乙個名為.u_boot_cmd的section段。
#define struct_section __attribute__ ((unused,section (".u_boot_cmd")))
//這個巨集定義乙個命令結構體變數。並用name,maxargs,rep,cmd,usage,help初始化各個域。
#define u_boot_cmd(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name struct_section =
2、在u-boot中,如何新增乙個命令:
1)cfg_cmd_* 命令選項位標誌。在include/cmd_confdefs.h 中定義。
每個板子的配置檔案(如include/config/smdk2410.h)中都可以定義u-boot
需要的命令,如果要新增乙個命令,必須新增相應的命令選項。如下:
複製內容到剪貼簿
**:#define config_commands /
(config_cmd_dfl | /
cfg_cmd_cache | /
/*cfg_cmd_nand |*/ /
/*cfg_cmd_eeprom |*/ /
/*cfg_cmd_i2c |*/ /
/*cfg_cmd_usb |*/ /
cfg_cmd_reginfo | /
cfg_cmd_date | /
cfg_cmd_elf)
定義這個選項主要是為了編譯命令需要的原始檔,大部分命令都在common資料夾下對應乙個原始檔
cmd_*.c ,如cmd_cache.c實現cache命令。檔案開頭就有一行編譯條件:
#if(config_commands&cfg_cmd_cache)
也就是說,如果配置標頭檔案中config_commands不或上相應命令的選項,這裡就不會被編譯。
2)定義命令結構體變數,如:
複製內容到剪貼簿
**:u_boot_cmd(
dcache, 2, 1, do_dcache,
"dcache - enable or disable data cache/n",
"[on, off]/n"
" - enable or disable data (writethrough) cache/n"
);
其實就是定義了乙個cmd_tbl_t型別的結構體變數,這個結構體變數名為__u_boot_cmd_dcache。
其中變數的五個域初始化為括號的內容。分別指明了命令名,引數個數,重複數,執行命令的函式,命令提示。
每個命令都對應這樣乙個變數,同時這個結構體變數的section屬性為.u_boot_cmd.也就是說每個變數編譯結束
在目標檔案中都會有乙個.u_boot_cmd的section.乙個section是連線時的乙個輸入段,
如.text,.bss,.data等都是section名。
最後由鏈結程式把所有的.u_boot_cmd段連線在一起,這樣就組成了乙個命令結構體陣列。
u-boot.lds中相應指令碼如下:
複製內容到剪貼簿
**:. = .;
__u_boot_cmd_start = .;
.u_boot_cmd :
__u_boot_cmd_end = .;
可以看到所有的命令結構體變數集中在__u_boot_cmd_start開始到__u_boot_cmd_end結束的連續位址範圍內,
這樣形成乙個cmd_tbl_t型別的陣列,run_command函式就是在這個陣列中查詢命令的。
3)實現命令處理函式。命令處理函式的格式:
void function (cmd_tbl_t *cmdtp, int flag, int argc, char *argv)
總體來說,如果要實現自己的命令,應該在include/com_confdefs.h中定義乙個命令選項標誌位。
在板子的配置檔案中新增命令自己的選項。按照u-boot的風格,可以在common/下面新增自己的cmd_*.c,並且定義自己的命令結構體變數,如
複製內容到剪貼簿
**:u_boot_cmd(
mycommand, 2, 1, do_mycommand,
"my command!/n",
".../n"
" ../n"
);
uboot 中 env相關問題
根據uboot 2011,env的初始化主要是用env relocate來實現。它的實現主要有 1 如果gd env valid等於1,那麼,從dataflash中讀出資料,呼叫env relocate spec。2 如果gd env valid等於0,那麼,直接使用default的env,這是直接...
u boot 中的命令實現
u boot 中的命令實現 我們知道,u boot的執行過程是首先進行一些初始化化工作,然後在乙個死 迴圈中不斷接收串列埠的命令並進行解釋執行,下面我們就看看執行部分 的實 現,見common main.c中的run command int run command const char cmd,in...
u boot中新增命令
看下ping命令實現的例子 檔案common cmd net.c static int do ping cmd tbl t cmdtp,int flag,int argc,char const argv printf host s is alive n argv 1 return 0 u boot ...