u-boot中添加命令

简介
U-Boot中每个命令都通过U_BOOT_CMD宏来定义,格式如下。宏U_BOOT_CMDinclude/command.h中定义。
 
U_BOOT_CMD(name, maxargs, repeatable, command, "usage", "help")
 
各项参数的意义为:
Ø name:命令的名字,注意,它不是一个字符串,不要用双引号括起来。
Ø maxargs:最大的参数个数
Ø repeatable:命令是否可重复,指运行一个命令后,下次敲回车即可再次运行。
Ø command:对应的函数指针,类型为(*cmd)(struct cmd_tbl_s *, int, int, char *[])。
Ø usage:简短的使用说明,这是个字符串。
Ø help:较详细的使用说明,这是个字符串。
 
对于每个使用U_BOOT_CMD宏来定义的命令,其实都是在“.u_boot_cmd”段中定义一个cmd_tbl_t结构。连接脚本u-boot.lds中有这么一段:
 
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
 
程序中就是根据命令的名字在内存段__u_boot_cmd_start~__u_boot_cmd_end找到它的cmd_tbl_t结构,然后调用它的函数,请参考common/command.c中的find_cmd函数。其中,cmd_tbl_t结构在include/command.h中定义。
 
添加自己的命令示例
在common目录下添加一个cmd_hello.c命令的文件,然后修改common/Makefile,添加:
 
COBJS-y += cmd_hello.o
 
cmd_hello.c内容如下:
 
#include<common.h>
#include<command.h>
 
int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
     printf("hello,world\n");
}
 
U_BOOT_CMD(
     hello, CONFIG_SYS_MAXARGS, 1, do_hello,
     "hello - myfirstcommand'\n",
     "hello, world embeded'\n"
     "have a study\n"
);
 
上例中,CONFIG_SYS_MAXARGS 在头文件include/configs/smdk2410.h中定义,默认值16。