每个命令都是通过U_BOOT_CMD宏来定义的。这个宏定义了一个相关的结构体,文件是uboot/include/command.h,结构体为cmd_tbl_s。
具体的命令定义为:
#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(name,maxargs,repeatable,command,"usage","help")
name: is the name of the commad. THIS IS NOT a string.
maxargs: the maximumn numbers of arguments this function takes
command: Function pointer (*cmd)(struct cmd_tbl_s *, int, int, char *[])
usage: Short description. This is a string
help:long description. This is a string
每一个 U-Boot 命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参,数个数、重复数、命令执行函数、用法、帮助。
而相关命令的具体执行在uboot/common/cmd_xxxx.c文件中实现的。
接着,以我自己添加的MYTEST命令为例子,讲述添加命令的过程。
1)在对应的开发板配置文件中,添加相应命令的宏定义。如:在uboot/include/configs/mx25_3stack.h文件中,添加#define CONFIG_CMD_MYTEST。
当然,也可以在uboot/include/config_cmd_default.h文件中,添加该命令的宏定义。
2)在uboot/common/目录下,建立相应的命令执行文件,如cmd_mytest.c,注意命名的规范,必须是cmd_xxx.c才行。
里面的内容也是又格式要求的,如函数的格式,必须指定参数的;还有相应结尾部分的U_BOOT_CMD定义部分,使不能缺省的。如果命令不需要跟参数,则把maxargs设置为1即可了。
在U_BOOT_CMD中指明的命令执行函数,在该函数中,就是我们要设计的命令 *** 作内容。也就是说,这部分完成的我们定制的命令的功能的。还有,要在uboot/comman/Makefile文件中,加入生成相应的.o文件才可以的。
3)重新编译uboot文件,会在uboot/common/中,生成相应的.o文件。将生成的uboot下载到开发板后,通过终端可以看到我们加入的命令。在终端中输入问号或者help命令即可。执行该命令,只学要输入命令的名字,在回车就可以运行了。
通过在uboot中加入命令,可以完成我们的一些特定的 *** 作,实现调试和测试目的等。
直接 setenv bootcmdtftp;setenv 既可以增加变量,也可以修改,也可以删除。
setenv bootcmdtftp 20008000,是修改和增加
setenv bootcmdtftp是删除
U_BOOT_CMD宏定义是在文件include/command.h中,添加自己的命令时一般是在common/目录下新建一个C文件,C文件中包含的头文件可以从该目录下其他命令文件(如cmd_nand.c)复制过来,新建的C文件中一般使用宏U_BOOT_CMD进行声明,例如U_BOOT_CMD(lcdmenu, CFG_MAXARGS, 0, do_lcd_menu,
"menu - display the myown menu!\n",
"menu - long help for the menu command!\n"
)
然后再在本文件中定义一个函数do_lcd_menu作为该命令的具体实现函数。
为了让新建的C文件参与编译,在common/makefile文件中找到
COBJS = 许多的 .o目标文件
在其它.o文件的后面添加上 lcd_cmd.o(新建的C文件名为lcd_cmd.c)即可。最后重新编译。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)