天天看點

UBOOT添加指令的執行流程

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指令。

繼續閱讀