U-boot分析与移植(4)-U-boot 添加命令
2016-04-13 11:07
351 查看
本文来源:/article/2459290.html
我们初步了解U-Boot执行流程后,知道
U-Boot的每一个命令都是通过U_BOOT_CMD宏定义的。这个宏在include/command.h头文件中定义,每一个命令定义一个cmd_tbl_t结构体。
[cpp]
view plain
copy
print?
/*命令宏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用cmd_tbl_t结构体描述一个命令
[cpp]
view plain
copy
print?
struct cmd_tbl_s {
char *name; /* Command Name */
int maxargs; /* maximum number of arguments */
int repeatable; /* autorepeat allowed? */
/* Implementation function */
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
char *usage; /* Usage message (short) */
#ifdef CFG_LONGHELP
char *help; /* Help message (long) */
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* do auto completion on the arguments */
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};
参数意义是:
在源代码里可发现命令都是在cmd_xxx.c里实现的
现在我们添加一个简单的测试命令
1、在common目录下添加一个hello.c文件
[cpp]
view plain
copy
print?
#include <common.h>
#include <command.h>
#ifdef CONFIG_CMD_HELLO
int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int i;
printf("argc = %d\n",argc);
for(i = 0; i < argc; i++)
printf("i = %d, %s\n",i,argv[i]);
return 0;
}
U_BOOT_CMD(hello,CONFIG_SYS_MAXARGS,0,do_h
do_xxx函数必须定义成这样形式:
[cpp]
view plain
copy
print?
cmd_tbl_s 结构体里的成员 int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
在填参数个数时要注意,CONFIG_SYS_MAXARGS是在include/configs/smdk2140.h里定义的,默认16
2、在common/Makefile中的#command添加如下内容:
COBJS-$(CONFIG_CMD_TEST) += cmd_hello.o
3、在include/configs/smdk2410.h(该文件名根据实际操作,要针对自己的平台文件改,如smdk2410.h等)添加如下内容:
在#include <config_cmd_default.h>后添加:
#define CONFIG_CMD_HELLO
或者在include/config_cmd_default.h文件中,添加该命令的宏定义。
4、编译后下到板上
[cpp]
view plain
copy
print?
U-Boot 2009.11 (12鏈?14 2011 - 00:44:00)
DRAM: 64 MB
Flash: 512 kB
NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!
64 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
BAI2011/12/13 # hello
argc = 1
i = 0, hello
BAI2011/12/13 # hello this is my test!
argc = 5
i = 0, hello
i = 1, this
i = 2, is
i = 3, my
i = 4, test!
BAI2011/12/13 #
我们初步了解U-Boot执行流程后,知道
U-Boot的每一个命令都是通过U_BOOT_CMD宏定义的。这个宏在include/command.h头文件中定义,每一个命令定义一个cmd_tbl_t结构体。
[cpp]
view plain
copy
print?
/*命令宏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*/ #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用cmd_tbl_t结构体描述一个命令
[cpp]
view plain
copy
print?
struct cmd_tbl_s {
char *name; /* Command Name */
int maxargs; /* maximum number of arguments */
int repeatable; /* autorepeat allowed? */
/* Implementation function */
int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
char *usage; /* Usage message (short) */
#ifdef CFG_LONGHELP
char *help; /* Help message (long) */
#endif
#ifdef CONFIG_AUTO_COMPLETE
/* do auto completion on the arguments */
int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
#endif
};
struct cmd_tbl_s { char *name; /* Command Name */ int maxargs; /* maximum number of arguments */ int repeatable; /* autorepeat allowed? */ /* Implementation function */ int (*cmd)(struct cmd_tbl_s *, int, int, char *[]); char *usage; /* Usage message (short) */ #ifdef CFG_LONGHELP char *help; /* Help message (long) */ #endif #ifdef CONFIG_AUTO_COMPLETE /* do auto completion on the arguments */ int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]); #endif };
参数意义是:
name | 这是命令名字,不需要用双引号括起来 |
maxargs | 最大参数的个数 |
rep | 命令是否可重复,就是下一次按回车时再执行 |
cmd | 对应的函数指针 |
usage | 字符串表示的简短说明 |
help | 字符串表示的详细说明 |
现在我们添加一个简单的测试命令
1、在common目录下添加一个hello.c文件
[cpp]
view plain
copy
print?
#include <common.h>
#include <command.h>
#ifdef CONFIG_CMD_HELLO
int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
int i;
printf("argc = %d\n",argc);
for(i = 0; i < argc; i++)
printf("i = %d, %s\n",i,argv[i]);
return 0;
}
U_BOOT_CMD(hello,CONFIG_SYS_MAXARGS,0,do_h
#include <common.h> #include <command.h> #ifdef CONFIG_CMD_HELLO int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { int i; printf("argc = %d\n",argc); for(i = 0; i < argc; i++) printf("i = %d, %s\n",i,argv[i]); return 0; } U_BOOT_CMD(hello,CONFIG_SYS_MAXARGS,0,do_h
do_xxx函数必须定义成这样形式:
[cpp]
view plain
copy
print?
cmd_tbl_s 结构体里的成员 int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
cmd_tbl_s 结构体里的成员 int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
在填参数个数时要注意,CONFIG_SYS_MAXARGS是在include/configs/smdk2140.h里定义的,默认16
2、在common/Makefile中的#command添加如下内容:
COBJS-$(CONFIG_CMD_TEST) += cmd_hello.o
3、在include/configs/smdk2410.h(该文件名根据实际操作,要针对自己的平台文件改,如smdk2410.h等)添加如下内容:
在#include <config_cmd_default.h>后添加:
#define CONFIG_CMD_HELLO
或者在include/config_cmd_default.h文件中,添加该命令的宏定义。
4、编译后下到板上
[cpp]
view plain
copy
print?
U-Boot 2009.11 (12鏈?14 2011 - 00:44:00)
DRAM: 64 MB
Flash: 512 kB
NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!
64 MiB
In: serial
Out: serial
Err: serial
Net: dm9000
Hit any key to stop autoboot: 0
BAI2011/12/13 # hello
argc = 1
i = 0, hello
BAI2011/12/13 # hello this is my test!
argc = 5
i = 0, hello
i = 1, this
i = 2, is
i = 3, my
i = 4, test!
BAI2011/12/13 #
相关文章推荐
- 利用pod trunk发布程序,让你的项目可以被pod search
- 线程创建方式
- java 获取classpath下文件多种方式
- linux内核驱动中_IO, _IOR, _IOW, _IOWR 宏的用法与解析(引用)
- Hql处理日期格式化问题
- maven 下载的包发布到本地仓库中
- break ,continue ,return 的区别及作用?
- 最快让你上手ReactiveCocoa之基础篇
- 字符串KMP小结
- 简单表单验证的公共函数
- iOS-OC-UITextField首行缩进
- 实例学习maven 项目构建
- 【转】JABC访问oracle数据库报ORA-12505
- unity3d插件Daikon Forge GUI 中文教程2-基础控件Label的使用
- java中删除list重复元素
- 如何实现高效的事件管理?
- cann't connect to mysql server on localhost(0)
- 三种解决UIWebView内js和objc 交互的思路
- select 1 from table 语句中的1代表什么意思
- iOS开发之网络编程篇六:AFNetworking3.0使用简介