U-Boot
的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的
U-Boot
命令。
U-Boot
的每一个命令都是通过
U_Boot_CMD
宏定义的。这个宏在
include/command.h
头文件中定义,每一个命令定义一个
cmd_tbl_t
结构体。
#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
命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参数个数、重复数、命令执行函数、用法、帮助。
从控制台输入的命令是由
common/command.c
中的程序解释执行的。
find_cmd()
负责匹配输入的命令,从列表中找出对应的命令结构体。
基于
U-Boot
命令的基本框架,来分析一下简单的
icache
操作命令,就可以知道添加新命令的方法。
(
1
)定义
CACHE
命令。在
include/cmd_confdefs.h
中定义了所有
U-Boot
命令的标志位。
#define CFG_CMD_CACHE 0x00000010ULL /* icache, dcache */
如果有更多的命令,也要在这里添加定义。
(
2
)实现
CACHE
命令的操作函数。下面是
common/cmd_cache.c
文件中
icache
命令部分的代码。
#if (CONFIG_COMMANDS & CFG_CMD_CACHE)
static int on_off (const char *s)
{ //
这个函数解析参数,判断是打开
cache
,还是关闭
cache
if (strcmp(s, "on") == 0) { //
参数为“
on
”
return (1);
} else if (strcmp(s, "off") == 0) { //
参数为“
off
”
return (0);
}
return (-1);
}
int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{ //
对指令
cache
的操作函数
switch (argc) {
case 2: /*
参数个数为
1
,则执行打开或者关闭指令
cache
操作
*/
switch (on_off(argv[1])) {
case 0: icache_disable(); //
打开指令
cache
break;
case 1: icache_enable (); //
关闭指令
cache
break;
}
/* FALL TROUGH */
case 1: /*
参数个数为
0
,则获取指令
cache
状态
*/
printf ("Instruction Cache is %s\n",
icache_status() ? "ON" : "OFF");
return 0;
default: //
其他缺省情况下,打印命令使用说明
printf ("Usage:\n%s\n", cmdtp->usage);
return 1;
}
return 0;
}
……
U_Boot_CMD( //
通过宏定义命令
icache, 2, 1, do_icache, //
命令为
icache
,命令执行函数为
do_icache()
"icache - enable or disable instruction cache\n", //
帮助信息
"[on, off]\n"
" - enable or disable instruction cache\n"
);
……
#endif
U-Boot
的命令都是通过结构体
__U_Boot_cmd_##name
来描述的。根据
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}
还有,不要忘了在
common/Makefile
中添加编译的目标文件。
(
3
)打开
CONFIG_COMMANDS
选项的命令标志位。这个程序文件开头有
#if
语句需要预处理是否包含这个命令函数。
CONFIG_COMMANDS
选项在开发板的配置文件中定义。例如:
SMDK2410
平台在
include/configs/smdk2410.h
中有如下定义。
/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \
CFG_CMD_CACHE | \
CFG_CMD_REGINFO | \
CFG_CMD_DATE | \
CFG_CMD_ELF)
按照这
3
步,就可以添加新的
U-Boot
命令。