zoukankan      html  css  js  c++  java
  • uboot自定义添加命令

    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 ");

          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 
    ");
            return 0;
    }
    U_BOOT_CMD(
    hello,1,0,do_hello,"usage:test
    ","help:test
    "
    );
    #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
    }

    1、u-boot添加命令
    1) u-boot正常运行后等待用户输入命令,想要为u-boot添加新命令,操作步骤很简单,原因是u-boot有现成的命令添加框架。
    2)第一步,在common文件夹下新增c文件,cmd_xx.c,xx就是新增命令。
    3)第二步,cmd_xx.c文件中添加头文件,及命令声明和命令实现函数。
    #include <common.h>
    #include <command.h>

    static int do_help(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
    {
    cmd_tbl_t *start = ll_entry_start(cmd_tbl_t, cmd);
    const int len = ll_entry_count(cmd_tbl_t, cmd);
    return _do_help(start, len, cmdtp, flag, argc, argv);
    }

    U_BOOT_CMD(
    help, CONFIG_SYS_MAXARGS, 1, do_help,
    "print command description/usage",
    " "
    " - print brief description of all commands "
    "help command ... "
    " - print detailed usage of 'command'"
    );
    4)第三步,common/Makefile文件添加cmd_xx.o,实现命令编译,完成命令添加。

    5)如上,只需要三步,同把大象装进冰箱是一个道理。

  • 相关阅读:
    正则表达式
    cookie和session的区别(转载)
    Http协议
    10倍工程师
    10倍工程师
    HTML介绍
    HTML介绍
    网络基础之网络协议篇
    网络基础之网络协议篇
    计算机中的进制和编码
  • 原文地址:https://www.cnblogs.com/Ph-one/p/11532098.html
Copyright © 2011-2022 走看看