Exynos4412 Uboot 移植(三)—— Uboot新增自定義命令
Uboot新增自定義命令:uboot中的命令使用U_BOOT_CMD這個巨集宣告來註冊進系統,連結指令碼會把所有的cmd_tbl_t結構體放在相鄰的地方。
UBoot版本:u-boot-2013.01
一、U-Boot命令的格式
即使是核心的啟動,也是通過U-Boot命令來實現的。U-Boot中每個命令都是通過 U_BOOT_CMD 巨集來定義的,格式如下:
U_BOOT_CMD(name,maxargs,repeatable,command,"usage","help")
各項引數的意義如下:
1) -- name:命令的名字,注意,它不是一個字串(不要用雙引號括起來);
2)-- maxargs:最大的引數個數;
3)-- repeatable:命令是否可以重複,可重複是指執行一個命令後,下次敲回車即可再次執行;
4)-- command:對應的函式指標,型別為(*cmd)(struct cmd_tbl_s *, int, int, char *[]);
5) -- usage:簡單的使用說明,這是個字串;
6)-- help:較詳細的使用說明,這是個字串。
巨集U_BOOT_CMD 在include/command.h中定義,如下所示
而U_BOOT_CMD 是用一個struct cmd_tbl_s 結構體定義,這個結構體仍是在include/command.h中實現:
可以看出,對於每個使用U_BOOT_CMD 巨集來定義的命令,就是巨集 U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)將struct cmd_tbl_s這樣的一個命令結構體放到U-BOOT連線指令碼 board/xxx/u-boot.lds中定義的".u-boot_cmd"段所在的記憶體區域,即在".u_boot_list.cmd"段中定義一個 cmd_tbl_t 結構。
連線指令碼U-Boot.lds中有如下程式碼:
當用戶在u-boot的shell中輸入命令時,就會在".u_boot_list.cmd"這個記憶體區域中查詢( _u_boot_list_cmd__start - _u_boot_list_cmd__end),當該區域中某一個cmd_tbl_s命令結構體的cmd_tbl_s.name和輸入的命令字串相符時,就呼叫該命令結構體的cmd_tbl_s.cmd()函式。
二、新增自定義命令
自定義命令設為"myubootcmd",不可與u-boot命令重名,
1、新增命令列配置資訊
在u-boot-2013.01/include/configs/fs4412.h(由具體開發板來配置,這裡使用fs4412)中新增 #define CONFIG_CMD_MYUBOOT,如下:
2、編寫命令列對應的源程式
在u-boot-2013.01/common/目錄下,建立相應的命令執行檔案cmd_hello.c
注意命名的規範,必須是cmd_xxx.c才行。裡面的內容也是有格式要求的,如函式的格式,必須指定引數的;還有相應結尾部分的U_BOOT_CMD定義部分,使不能預設的。如果命令不需要跟引數,則把maxargs設定為1即可了。內容如下所示:
#include <common.h>
#include <command.h>
#ifdef CONFIG_CMD_HELLO
void helloword (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
printf("hello world by xiaoqiang! \n");
}
U_BOOT_CMD(hello,1,2,helloword,
"hello command","xiaoqing add hello command!\n");
#endif
3、修改Makefile
在common/Makefile中增加一項.
4、編譯
5、測試