U_BOOT_CMD是一个宏定义,具体功能是定义一个struct cmd_tbl_s的结构体变量,U_BOOT_CMD宏传递的参数是该结构体变量的成员变量。通过U_BOOT_CMD定义的变量会通过脚本链接到uboot指定的一个section中,然后可以通过find_cmd遍历这个section找到这个cmd,可以通过run_command(cmd, flag)函数执行具体命令。
在进行uboot裁剪和移植时我们需要加入我们自己定制的命令那么如何添加一条命令:
其实添加起来很简单,主要涉及到的几个文件
1 、uboot/common/Makefile 添加我们命令的实现文件 cmd_xxx.c
obj-$(CONFIG_CMD_NET) += cmd_xxx.o
2、uboot/commom/cmd_xxx.c 具体的实现过程文件(以添加一个NFS为例)
#if defined(CONFIG_CMD_NFS)
static int do_nfs(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
return netboot_common(NFS, cmdtp, argc, argv);
}
U_BOOT_CMD(
nfs, 3, 0, do_nfs,
"boot image via network using NFS protocol",
"[loadAddress] [[hostIPaddr:]bootfilename]"
);
#endif
接下来如何添加一条命令:
修改5个地方:(以添加exit命令为例)
- /include/config_cmd_all.h 添加CONFIG_CMD_EXIT宏
- /include/config_cmd_default.h 同上
- /include/configs/smdk2410.h 添加宏 (以上头文件的修改,都是为了条件编译做准备的)
- /common/cmd_exit.c 具体实现命令的函数 (命令的实现与命令的注册都在这儿)
- /common/Makefile 把自己写的实现命令文件添加到Makefile
1)实现命令的具体功能,在comman文件夹中建立对应的cmd_exit.c文件。
2)如果要添加指令,首先为了能让系统找到该指令,所以要在命令表中注册一下。
④led命令执行过程:
在串口终端输入"led"命令时,串口接收到数据,并传递给run_command()函数,run_command()函数调用common/command.c中实现的find_cmd()函数在u_boot_list段内查找命令,并返回cmd_tbl_t结构。然后run_command()函数使用返回的cmd_tbl_t结构中的函数指针调用do_led(),从而完成命令的执行。