U-boot分析と移植(4)----U-boot追加コマンド


U-Bootの実行プロセスを初歩的に理解した後、
U-Bootの各コマンドはU_を通りますBOOT_CMDマクロ定義.このマクロはinclude/command.hヘッダファイルで定義し、コマンドごとにcmd_を定義するtbl_t構造体.
/* U_BOOT_CMD*/
#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_CMD用cmd_tbl_t構造体記述コマンド
struct cmd_tbl_s {
	char		*name;		/* Command Name			*/
	int		maxargs;	/* maximum number of arguments	*/
	int		repeatable;	/* autorepeat allowed?		*/
					/* Implementation function	*/
	int		(*cmd)(struct cmd_tbl_s *, int, int, char *[]);
	char		*usage;		/* Usage message	(short)	*/
#ifdef	CFG_LONGHELP
	char		*help;		/* Help  message	(long)	*/
#endif
#ifdef CONFIG_AUTO_COMPLETE
	/* do auto completion on the arguments */
	int		(*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};

パラメータの意味は次のとおりです.
name
これはコマンド名です.二重引用符で囲む必要はありません.
maxargs
最大パラメータの数
rep
命令を繰り返すことができるかどうかは、次の車を押すときに実行します.
cmd
対応する関数ポインタ
usage
文字列表示の簡単な説明
help
文字列表示の詳細
ソースコードにコマンドがcmd_にあることがわかりますxxx.cで実現した
簡単なテストコマンドを追加します
1、commonディレクトリの下にhelloを追加する.cファイル
#include <common.h>
#include <command.h>

#ifdef CONFIG_CMD_HELLO 
int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
    int i;
    printf("argc = %d
",argc); for(i = 0; i < argc; i++) printf("i = %d, %s
",i,argv[i]); return 0; } U_BOOT_CMD(hello,CONFIG_SYS_MAXARGS,0,do_h

do_xxx関数は、次のように定義する必要があります.
cmd_tbl_s    int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);

int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 
パラメータの個数を記入するときは、CONFIG_に注意してください.SYS_MAXARGSはinclude/configs/smdk 2140である.hで定義されている、デフォルト16 2、common/Makefileの#commandには以下の内容が追加されています.
         COBJS-$(CONFIG_CMD_TEST) += cmd_hello.o
3、include/configs/smdk 2410.h(このファイル名は実際の操作に基づいて、smdk 2410.hなどの自分のプラットフォームファイルに対して変更する)は以下の内容を追加する.
にある
#include 後に追加:
              #define CONFIG_CMD_HELLO
または
include/config_cmd_default.hファイルに、このコマンドのマクロ定義を追加します. 
4、コンパイルしてからボードに降りる
U-Boot 2009.11 (12 ?14 2011 - 00:44:00)


DRAM:  64 MB

Flash: 512 kB

NAND:  NAND_ECC_NONE selected by board driver. This is not recommended !!

64 MiB

In:    serial

Out:   serial

Err:   serial

Net:   dm9000

Hit any key to stop autoboot:  0 

BAI2011/12/13 # hello

argc = 1

i = 0, hello

BAI2011/12/13 # hello this is my test!

argc = 5

i = 0, hello

i = 1, this

i = 2, is

i = 3, my

i = 4, test!

BAI2011/12/13 #