1. 程式人生 > >Exynos4412 Uboot 移植(三)—— Uboot新增自定義命令

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、測試