一、u-boot命令执行原理
u-boot命令在common目录中,格式cmd_name cmd_param1 cmd_param2
1、每一个u-boot命令所对应的源代码在编译后都分布在DDR2的.text段中。
2、每一个u-boot命令都对应一个结构体,结构体的第一个成员是命令的名称,另外还有一个成员是函数指针,指向命令的代码块。
这些结构体在编译链接的时候放在DDR2的自定义的.u_boot_cmd段中。
二、调用u-boot命令
调用接口:run_command( )
三、自定义命令:
1、先做好命令的代码块,可以在common目录中创建一个新文件cmd_xxx.c
int do_xxx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[ ])
{
……
……
}
2、调用宏U_BOOT_CMD,它的原型(宏在command.h文件):
#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}
(1)有6个参数。
(2)cmd_tbl_t :结构体类型
typedef struct cmd_tbl_s cmd_tbl_t;
struct cmd_tbl_s {
char *name; /* Command Name */
int maxargs; /* maximum number of arguments */
int repeatable; /* autorepeat allowed? */
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
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};
(3)__u_boot_cmd_##name :结构体变量名
如:__u_boot_cmd_##go
(4)Struct_Section :
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
__attribute__ : 告诉编译器,将某个变量编译到某个段中,此处是将结构体变量 __u_boot_cmd_##name,链接到.u_boot_cmd段。
总结:宏
U_BOOT_CMD的作用定义一个结构体变量,并且用宏所带的参数给这个结构体变量初始化。
3、修改当前目录的Makefile文件和include/configs/smdkv210single.h文件
上面的自定义命令代码块do_xxx和宏U_BOOT_CMD都是在cmd_xxx.c文件中。
Makefile文件:添加cmd_xxx.o
include/configs/smdkv210single.h文件:添加cmd_xxx.o文件是否编译的宏