标签:uboot repeat 基于 目录 ifd maximum 基本 UNC mes
1、添加命令
1.u-boot的命令格式:
U_BOOT_CMD(name,maxargs,repeatable,command,”usage”,"help")
name:命令的名字,不是一个字符串;
maxargs:最大的参数个数;
repeatable:命令是可重复的;
command:对应的函数指针
2.在uboot/common目录下,随便找一个cmd_xxx.c文件,将cmd_xxx.c文件拷贝一下,并重新命名为cmd_hello.c
cp cmd_xxx.c cmd_hello.c
3.进入到cmd_hello.c中,修改
a:修改宏U_BOOT_CMD
U_BOOT_CMD宏参数有6个:
第一个参数:添加的命令的名字
第二个参数:添加的命令最多有几个参数(注意,假如你设置的参数个数是3,而实际的参数个数是4,那么执行命令会输出帮助信息的)
第三个参数:是否重复(1重复,0不重复)(即按下Enter键的时候,自动执行上次的命令)
第四个参数:执行函数,即运行了命令具体做啥会在这个函数中体现出来
第五个参数:帮助信息(short)
第六个参数:帮助信息(long)
b:定义执行函数
执行函数格式:int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
然后在该函数中添加你想要做的事,比如打印一行信息
int do_hello(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
printf("hello world\n");
return 0;
}
c:uboot中添加命令基本操作已经做完,但是还差一步,就是将该命令添加进uboot中,
之前的操作虽然添加了一个cmd_hello.c文件,但是还没有将该文件放进Uboot的代码中,
所以,我们需要在uboot下common文件的Makfile中添加一行:
COBJS-y += cmd_hello.o
#include<command.h> #include<common.h> #ifdef CONFIG_CMD_HELLO int do_hello(cmd_tbl_t *cmdtp,int flag,int argc,char *argv) { printf("my test \n"); return 0; } U_BOOT_CMD( hello,1,0,do_hello,"usage:test\n","help:test\n" ); #endif
2、uboot命令解析
uboot的命令基本都是基于宏U_BOOT_CMD实现的,所以解析下该宏:
通过搜索,我们找到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}
1.#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))
由定义可知该命令在链接的时候链接的地址或者说该命令存放的位置是u_boot_cmd section
2.typedef struct cmd_tbl_s cmd_tbl_t 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) */
char *help
}
标签:uboot repeat 基于 目录 ifd maximum 基本 UNC mes
原文地址:https://www.cnblogs.com/FREMONT/p/9824226.html