uboot之 U_BOOT_CMD分析

在command.h里面有U_BOOT_CMD的定义

	#ifndef __COMMAND_H
	#define __COMMAND_H
	
	#ifndef NULL
	#define NULL	0
	#endif
	
	#ifndef	__ASSEMBLY__
	/*
	 * Monitor Command Table
	 */
	
	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
	};
	
	typedef struct cmd_tbl_s	cmd_tbl_t;
	
	extern cmd_tbl_t  __u_boot_cmd_start;
	extern cmd_tbl_t  __u_boot_cmd_end;
	
	
	/* common/command.c */
	cmd_tbl_t *find_cmd(const char *cmd);
	
	#ifdef CONFIG_AUTO_COMPLETE
	extern void install_auto_complete(void);
	extern int cmd_auto_complete(const char *const prompt, char *buf, int *np, int *colp);
	#endif
	
	/*
	 * Monitor Command
	 *
	 * All commands use a common argument format:
	 *
	 * void function (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
	 */
	
	typedef	void 	command_t (cmd_tbl_t *, int, int, char *[]);
	
	#endif	/* __ASSEMBLY__ */
	
	/*
	 * Command Flags:
	 */
	#define CMD_FLAG_REPEAT		0x0001	/* repeat last command		*/
	#define CMD_FLAG_BOOTD		0x0002	/* command is from bootd	*/
	
	/*
	 * Configurable monitor commands definitions have been moved
	 * to include/cmd_confdefs.h
	 */
	
	
	#define Struct_Section  __attribute__ ((unused,section (".u_boot_cmd")))
	
	#ifdef  CFG_LONGHELP
	
	#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}
	
	#else	/* no long help info */
	
	#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \
	cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}
	
	#endif	/* CFG_LONGHELP */
	
	#endif	/* __COMMAND_H */
定义了cmd区域,在何处使用的呢,比如在cmd_boot.c里面有:
U_BOOT_CMD(
	go, CFG_MAXARGS, 1,	do_go,
	"go      - start application at address 'addr'\n",
	"addr [arg ...]\n    - start application at address 'addr'\n"
	"      passing 'arg' as arguments\n"
);

extern int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);

U_BOOT_CMD(
	reset, CFG_MAXARGS, 1,	do_reset,
	"reset   - Perform RESET of the CPU\n",
	NULL
);

调用的地方,

int run_command (const char *cmd, int flag)//里面有

	cmd_tbl_t *find_cmd (const char *cmd)
	{
		cmd_tbl_t *cmdtp;
		cmd_tbl_t *cmdtp_temp = &__u_boot_cmd_start;	/*Init value */
		const char *p;
		int len;
		int n_found = 0;
	
		/*
		 * Some commands allow length modifiers (like "cp.b");
		 * compare command name only until first dot.
		 */
		len = ((p = strchr(cmd, '.')) == NULL) ? strlen (cmd) : (p - cmd);
	
		for (cmdtp = &__u_boot_cmd_start;
		     cmdtp != &__u_boot_cmd_end;
		     cmdtp++) {
			if (strncmp (cmd, cmdtp->name, len) == 0) {
				if (len == strlen (cmdtp->name))
					return cmdtp;	/* full match */
	
				cmdtp_temp = cmdtp;	/* abbreviated command ? */
				n_found++;
			}
		}
		if (n_found == 1) {			/* exactly one match */
			return cmdtp_temp;
		}
	
		return NULL;	/* not found or ambiguous command */
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值