1.添加命令

若要向Uboot中添加自己的命令,而自己又不想知道命令实现的原理,可以按照以下做法:

  1.在uboot/common目录下,随便找一个cmd_xxx.c文件,将cmd_xxx.c文件拷贝一下,并重新命名为cmd_hello.c

    cp cmd_xxx.c cmd_hello.c

  2.进入到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

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
};