没有合适的资源?快使用搜索试试~ 我知道了~
如何在UBOOT中添加命令的方法

温馨提示


试读
19页
此文档简单的介绍了如何在UBOOT中添加命令,例子是实现快捷菜单命令menu,在命令提示中输入menu就执行menu命令,进入自己设定的快捷菜单
资源推荐
资源详情
资源评论


















下面以添加 menu 命令为例分析 U-Boot 添加命令的方法。
(1) 在 common 目录下新建 cmd_menu.c 文件
习惯上把通用命令源代码放在 common 目录下,与开发板专有命令源代码则放在
board/<board_dir>目录下,命名方式只是习惯而已。为了方便阅读和查询习惯以“cmd_<
命令名>.c”为文件名。
(2) 定义“menu”命令
在 cmd_menu.c 中使用如下的代码定义“menu”命令:
U_BOOT_CMD(
menu, 3, 0, do_menu,
"menu - display a menu, to select the items to do something",
" - display a menu, to select the items to do something"
);
其中 U_BOOT_CMD 命令格式如下:
U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)
各个参数的意义如下:
name:命令名,非字符串,但在 U_BOOT_CMD 中用“#”符号转化为字符串
maxargs:命令的最大参数个数
rep:是否自动重复(按 Enter 键是否会重复执行)
cmd:该命令对应的响应函数
usage:简短的使用说明(字符串)
help:较详细的使用说明(字符串)
在内存中保存命令的 help 字段会占用一定的内存,通过配置 U-Boot 可以选择是否保
存 help 字段。若在 include/configs/mini2440.h 中定义了 CONFIG_SYS_LONGHELP 宏,

则在 U-Boot 中使用 help 命令查看某个命令的帮助信息时将显示 usage 和 help 字段的内容,
否则就只显示 usage 字段的内容。
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}
“##”与“#”都是预编译操作符,“##”有字符串连接的功能,“#”表示后面紧接着的是一个字
符串。
其中的 cmd_tbl_t 在 include/command.h 中定义如下:
struct cmd_tbl_s {
char *name; /* 命令名 */
int maxargs; /* 最大参数个数 */
int repeatable; /* 是否自动重复 */
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]); /* 响应函数 */
char *usage; /* 简短的帮助信息 */
#ifdef CONFIG_SYS_LONGHELP
char *help; /* 较详细的帮助信息 */
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* 自动补全参数 */
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};

typedef struct cmd_tbl_s cmd_tbl_t;
一个 cmd_tbl_t 结构体变量包含了调用一条命令的所需要的信息。
其中 Struct_Section 在 include/command.h 中定义如下:
#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
凡是带有__attribute__ ((unused,section (".u_boot_cmd"))属性声明的变量都将被存放
在".u_boot_cmd"段中,并且即使该变量没有在代码中显式的使用编译器也不产生警告信息。
在 U-Boot 连接脚本 u-boot.lds 中定义了".u_boot_cmd"段:
. = .;
__u_boot_cmd_start = .; /*将 __u_boot_cmd_start 指定为当前地址 */
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .; /* 将__u_boot_cmd_end 指定为当前地址 */
这表明带有“.u_boot_cmd”声明的函数或变量将存储在“u_boot_cmd”段。这样只要将
U-Boot 所有命令对应的 cmd_tbl_t 变量加上“.u_boot_cmd”声明,编译器就会自动将其放在
“u_boot_cmd”段,查找 cmd_tbl_t 变量时只要在__u_boot_cmd_start 与
__u_boot_cmd_end 之间查找就可以了。
因此“menu”命令的定义经过宏展开后如下:
cmd_tbl_t __u_boot_cmd_menu __attribute__ ((unused,section (".u_boot_cmd"))) =
{menu, 3, 0, do_menu, "menu - display a menu, to select the items to do something\n", " -
display a menu, to select the items to do something"}
实质上就是用 U_BOOT_CMD 宏定义的信息构造了一个 cmd_tbl_t 类型的结构体。编
译器将该结构体放在“u_boot_cmd”段,执行命令时就可以在“u_boot_cmd”段查找到对应的
cmd_tbl_t 类型结构体。
(3) 实现命令的函数
即 U_BOOT_CMD(name,maxargs,rep,cmd,usage,help)中的 cmd 参数

在 cmd_menu.c 中添加“menu”命令的响应函数的实现。具体的实现代码略:
int do_menu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
/* 实现代码略 */
}
(4) 将 common/cmd_menu.c 编译进 u-boot.bin
在 common/Makefile 中把目标代码 cmd_menu.o 也加入一起编译:
在 include/configs/mini2440.h 加入如代码:
#define CONFIG_BOOT_MENU 1
重新编译下载 U-Boot 就可以使用 menu 命令了
(5)menu 命令执行的过程
在 U-Boot 中输入“menu”命令执行时,U-Boot 接收输入的字符串“menu”,传递给
run_command 函数。run_command 函数调用 common/command.c 中实现的 find_cmd 函
数在__u_boot_cmd_start 与__u_boot_cmd_end 间查找命令,并返回 menu 命令的
cmd_tbl_t 结构。然后 run_command 函数使用返回的 cmd_tbl_t 结构中的函数指针调用
menu 命令的响应函数 do_menu,从而完成了命令的执行。
(6)例子:TFTP 下载,命令很简单。
#include <common.h>
#include <command.h>
/**功能:等待键盘输入***/
static char awaitkey(unsigned long delay, int* error_p)
{
int i;
剩余18页未读,继续阅读

kuishanpark
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制

- 1
- 2
- 3
- 4
前往页