我们初步了解U-Boot执行流程后,知道
U-Boot的每一个命令都是通过U_BOOT_CMD宏定义的。这个宏在include/command.h头文件中定义,每一个命令定义一个cmd_tbl_t结构体。# /*命令宏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结构体描述一个命令
1. struct cmd_tbl_s {
2. char *name; /* Command Name */
3. int maxargs; /* maximum number of arguments */
4. int repeatable; /* autorepeat allowed? */
5. /* Implementation function */
6. int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);
7. char *usage; /* Usage message (short) */
8. #ifdef CFG_LONGHELP
9. char *help; /* Help message (long) */
10. #endif
11. #ifdef CONFIG_AUTO_COMPLETE
12. /* do auto completion on the arguments */
13. int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);
14. #endif
15. };
参数意义是:
name | 这是命令名字,不需要用双引号括起来 |
maxargs | 最大参数的个数 |
rep | 命令是否可重复,就是下一次按回车时再执行 |
cmd | 对应的函数指针 |
usage | 字符串表示的简短说明 |
help | 字符串表示的详细说明 |
在源代码里可发现命令都是在cmd_xxx.c里实现的
现在我们添加一个简单的测试命令
1、在common目录下添加一个hello.c文件
1. #include <common.h>
2. #include <command.h>
3.
4. #ifdef CONFIG_CMD_HELLO
5. int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
6. {
7. int i;
8. printf("argc = %d\n",argc);
9. for(i = 0; i < argc; i++)
10. printf("i = %d, %s\n",i,argv[i]);
11. return 0;
12. }
13. U_BOOT_CMD(hello,CONFIG_SYS_MAXARGS,0,do_h
do_xxx函数必须定义成这样形式:
- 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添加如下内容:
4、编译后下到板上
1. U-Boot 2009.11 (12鏈?14 2011 - 00:44:00)
2.
3.
4. DRAM: 64 MB
5.
6. Flash: 512 kB
7.
8. NAND: NAND_ECC_NONE selected by board driver. This is not recommended !!
9.
10. 64 MiB
11.
12. In: serial
13.
14. Out: serial
15.
16. Err: serial
17.
18. Net: dm9000
19.
20. Hit any key to stop autoboot: 0
21.
22. BAI2011/12/13 # hello
23.
24. argc = 1
25.
26. i = 0, hello
27.
28. BAI2011/12/13 # hello this is my test!
29.
30. argc = 5
31.
32. i = 0, hello
33.
34. i = 1, this
35.
36. i = 2, is
37.
38. i = 3, my
39.
40. i = 4, test!
41.
42. BAI2011/12/13 #