bootloader(引導裝載程式)是嵌入式系統軟體開發的第一個環節,它把作業系統和硬體平台銜接在一起,對于嵌入式系統的後續軟體開發十分重要,在整個開發中也占有相當大的比例。u-boot是目前比較流行、功能強大的bootloader,可以支援多種體系結構。lh7a400是sharp公司生産的一款基于arm922t核心的32位risc晶片,本文詳細介紹u-boot的功能、特點以及在lh7a400處理器上的移植過程。希望對大家有所幫助,更好的了解uboot指令的執行流程。
具體内容如下:
u-boot的指令為使用者提供了互動功能,并且已經實作了幾十個常用的指令。如果開發闆需要很特殊的操作,可以添加新的u-boot指令。
u-boot的每一個指令都是通過u_boot_cmd宏定義的。這個宏在include/command.h頭檔案中定義,每一個指令定義一個cmd_tbl_t結構體。
#define u_boot_cmd(name,maxargs,rep,cmd,usage,help) /
cmd_tbl_t __u_boot_cmd_##name struct_section =
{#name, maxargs, rep, cmd, usage, help}
這樣每一個u-boot指令有一個結構體來描述。結構體包含的成員變量:指令名稱、最大參數個數、重複數、指令執行函數、用法、幫助。
從控制台輸入的指令是由common/command.c中的程式解釋執行的。(這就是我要找的)find_cmd()負責比對輸入的指令,從清單中找出對應的指令結構體。
基于u-boot指令的基本架構,來分析一下簡單的icache操作指令,就可以知道添加新指令的方法。
(1)定義cache指令。在include/cmd_confdefs.h中定義了所有u-boot指令的标志位。
#define cfg_cmd_cache 0x00000010ull /* icache, dcache */
如果有更多的指令,也要在這裡添加定義。
(2)實作cache指令的操作函數。下面是common/cmd_cache.c檔案中icache指令部分的代碼。
#if (config_commands & cfg_cmd_cache)
static int on_off (const char *s)
{ //這個函數解析參數,判斷是打開cache,還是關閉cache
if (strcmp(s, "on") == 0) { //參數為“on”
return (1);
} else if (strcmp(s, "off") == 0) { //參數為“off”
return (0);
}
return (-1);
int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ //對指令cache的操作函數
switch (argc) {
case 2: /* 參數個數為1,則執行打開或者關閉指令cache操作 */
switch (on_off(argv[1])) {
case 0: icache_disable(); //打開指令cache
break;
case 1: icache_enable (); //關閉指令cache
/* fall trough */
case 1: /* 參數個數為0,則擷取指令cache狀态*/
printf ("instruction cache is %s/n",
icache_status() ? "on" : "off");
return 0;
default: //其他預設情況下,列印指令使用說明
printf ("usage:/n%s/n", cmdtp->usage);
return 1;
……
u_boot_cmd( //通過宏定義指令
icache, 2, 1, do_icache, //指令為icache,指令執行函數為do_icache()
"icache - enable or disable instruction cache/n", //幫助資訊
"[on, off]/n"
" - enable or disable instruction cache/n"
);
#endif
u-boot的指令都是通過結構體__u_boot_cmd_##name來描述的。根據u_boot_cmd在include/command.h中的兩行定義可以明白。 #define u_boot_cmd(name,maxargs,rep,cmd,usage,help) /
還有,不要忘了在common/makefile中添加編譯的目标檔案。
(3)打開config_commands選項的指令标志位。這個程式檔案開頭有#if語句需要預處理是否包含這個指令函數。config_commands選項在開發闆的配置檔案中定義。例如:smdk2410平台在include/configs/smdk2410.h中有如下定義。
/***********************************************************
* command definition
***********************************************************/
#define config_commands /
(config_cmd_dfl | /
cfg_cmd_cache | /
cfg_cmd_reginfo | /
cfg_cmd_date | /
cfg_cmd_elf)
按照這3步,就可以添加新的u-boot指令。