關於U boot中命令相關的程式設計

2021-04-22 09:49:44 字數 3090 閱讀 6743

@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 ...