run_command 函数
run_command:执行命令
用来在代码中执行命令,比如在uboot 命令行中可以手动执行setenv等等命令,如果使用uboot程序执行就可以用run_command。
int run_command(const char *cmd, int flag)
cmd:要执行的命令。
flag:一般为0。
用法如下:
run_command("bootm $kernel_addr_r - $fdt_addr_r", 0);
U_BOOT_CMD:定义命令
不仅可以执行uboot 定义的标准命令 ,还能自定义命令,自定义命令在命令行中也同样能执行。
可以使用宏U_BOOT_CMD
定义命令。
参考bootm,看看U_BOOT_CMD 是如何定义命令的:
例如:"boodcmd=nand read.jffs2 0x30007FC0 kernel;bootm 0x30007FC0 "中bootm命令(定义过程,如何定义的)分析:
“bootm 0x30007FC0” 是使用bootm命令,参数为0x30007FC0, 该命令定义位于bootm.c
搜索do_bootm 函数,位于./cmd/bootm.C (命令文件都存在cmd文件夹里,bootm.c就是定义bootm命令的文件)
其中执行bootm这个命令时所执行对应的函数就是:
int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
这个do_bootm函数等于bootm命令里的宏U_BOOT_CMD->cmd
do_bootm()定义:
cmd_tbl_t *cmdtp : 指向命令段里的bootm命令结构体
flag : 参数
argc : 参数个数,例如"bootm 0x30007FC0",那么argc=2。
argv : 存参数的数组,共argc个.例如"bootm 0x30007FC0",那么argv[0]="bootm",argv[1]="0x30007FC0".
它在U_BOOT_CMD宏里,是因为每个命令都是通过U_BOOT_CMD宏定义调用的,如下:
U_BOOT_CMD( //U_BOOT_CMD宏里有bootm成员,CFG_MAXARGS成员等
bootm, CFG_MAXARGS, 1, do_bootm, // do_bootm是一个函数名
"bootm - boot application image from memory\n",
"[addr [arg ...]]\n - boot application image stored in memory\n" //usage成员,较短的帮助说明
"\tpassing arguments 'arg ...'; when booting a Linux kernel,\n"
"\t'arg' can be the address of an initrd image\n"
#ifdef CONFIG_OF_FLAT_TREE
"\tWhen booting a Linux kernel which requires a flat device-tree\n"
"\ta third argument is required which is the address of the of the\n"
"\tdevice-tree blob. To boot that kernel without an initrd image,\n"
"\tuse a '-' for the second argument. If you do not pass a third\n"
"\ta bd_info struct will be passed instead\n" //help成员,详细的帮助说明
#endif
);
查看U_BOOT_CMD宏的定义,宏U_BOOT_CMD在./include/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}
其中U_BOOT_CMD宏各个参数意义如下:
cmd_tbl_t: 定义__u_boot_cmd_bootm的类型为cmd_tbl_t结构体
##name: 指向name,其中name指向第2.1节里面U_BOOT_CMD宏里的第一个成员 bootm.
Struct_Section : 保存命令的段位置参数,在./include/Command.h中定义, “#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))”,section表示强制将 段属性设为.u_boot_cmd命令段
#name: U_BOOT_CMD宏里第一个成员,命令名字,等于"bootm"
maxargs: 最大参数个数,等于CFG_MAXARGS
rep: [repeat]是否支持重复,等于1,表示支持
cmd: 执行命令后对应的函数指针,执行命令时就会使用该指针 , 在2.1节里,
usage:保存字符串,用于较短的帮助说明,等于上面代码里"bootm - boot application image from memory\n"
help:用于详细的帮助说明,等于U_BOOT_CMD宏里usage成员后剩下的几行字符串 (它们之间没有加逗号,所以那几行字符串都是连接在一起的).
我们自己定义命令时,可以仿照bootm 来定义。
uboot 从usb 加载镜像
usb start;fatload usb 0:1 $kernel_addr_r uImage;fatload usb 0:1 $fdt_addr_r $fdt_image;bootm $kernel_addr_r - $fdt_addr_r