前言:qljt跟u-boot的Makefile里面开发商相对应 ;qljt2440是我开发板的名字
原理:
每个命令都有一个命令结构体
struct cmd_tbl_s {
char *name; / * 将来在u-boot命令行执行的命令,该字串名字不用""括起来,只要不要与现有函数同名就行*/
int maxargs; /* 最多有多少个参数,注意至少为1,因为在u-boot命令行执行时命令本身算一个参数*/
int repeatable; /* 命令是否可重复,可重复是指运行一个命令后,下次敲回车即可再次运行*/
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]); /* 你定义的执行的函数*/
char*usage; /* 使用提示*/
char*help; /* 帮助信息*/
};
去定义它。Cmd为要调用的命令函数!name为该命令名字符串,不要用""括起来,不要与现有函数同名。
在u-boot里面有这样的宏
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
#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,rep,cmd,usage,help)就是将
cmd_tbl_s{
name,
maxargs,
rep,
cmd,
usage,
help
}这样的一个命令结构体放入内存.u_boot_cmd这个区域,.u_boot_cmd这个域在board/qljt2440/u-boot.lds中定义!在U-boot中的shell中,根据用户输入的命令,就会在.u_boot_cmd这个内存区域中查找,当.u_boot_cmd中某一个cmd_tbl_s命令结构体的cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令
结构体的cmd_tbl_s.cmd( ….)函数!
怎样添加命令函参数!
下面以添加 "Hello Word!" 命令为例!
(1)
在include/configs/qljt2440.h中增加一项:
#define CONFIG_CMD_ASKENV
#define CONFIG_CMD_CACHE
#define CONFIG_CMD_DATE
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_ELF
#define CONFIG_CMD_PING
#define CONFIG_CMD_NAND //ql18
#define CONFIG_CMD_REGINFO //ql18
#define CONFIG_CMD_HELLOWORD
(2)
在 /board/qljt/qljt2440/ 目录下添加 helloword.c 文件
内容如下
/*
*!ql add for test add u-boot command
*/
#include <config.h>
#include <common.h>
#ifdef CONFIG_CMD_HELLOWORD
void helloword(void)
{
qljt_printf("-----------------------------------------------Hello Word!/n");
}
U_BOOT_CMD(
hello,
1,
2,
helloword,
"hell - helloword command ",
" QL add u-boot command!/n"
);
#endif
(3)
在/board/qljt/qljt2440/ 目录下的Makefile 添加要编译的目标文件
(4)
重新编译u-boot,完毕!