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
}

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",
"\n"
" - print brief description of all commands\n"
"help command ...\n"
" - print detailed usage of 'command'"
);
4)第三步,common/Makefile文件添加cmd_xx.o,实现命令编译,完成命令添加。

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

uboot自定义添加命令的更多相关文章

  1. u-boot界面添加命令[demo]

    目标板:2440 如何在u-boot界面中增加命令 在/common/目录下建立文件,调用执行函数do_bootm就行,然后在修改Makefile,就OK了. 比如在u-boot界面添加命令test ...

  2. 在u-boot中添加命令

    转:http://www.embedu.org/Column/Column464.htm 作者:曾宏安,华清远见嵌入式学院讲师. u-boot是嵌入式系统中广泛使用的一种bootloader.它不仅支 ...

  3. 在U-Boot中添加自定义命令以实现自动下载程序【转】

    本文转载自:https://gaomf.cn/2016/06/26/%E5%9C%A8U-Boot%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%87%AA%E5%AE%9A%E4%B9 ...

  4. VisualStudio 自定义外部命令

    通过自定义命令,可以在 VisualStudio 加上一些自定义命令,可以快速启动 git 或者做其他的事情 添加命令 首先打开工具 外部命令,点击添加,然后在弹出的窗口输入下面内容 例如添加内容是打 ...

  5. uboot中添加自己的命令【转】

    本文转载自:http://blog.csdn.net/huanghai381/article/details/51206646 每个命令都是通过U_BOOT_CMD宏来定义的.这个宏定义了一个相关的结 ...

  6. MyEclipse中自定义maven命令(添加maven 命令)

    关于常用的Maven命令 mvn archetype:create :创建 Maven 项目 mvn compile :编译源代码 mvn test-compile :编译测试代码 mvn test ...

  7. uboot启动 及命令分析(3)

    u-boot命令 先贴一个重要结构,位于uboot/include/command.h,这个结构代表每个uboot命令 struct cmd_tbl_s { char     *name;   /* ...

  8. uboot中的命令体系

    一.uboot的命令体系介绍以及实例分析: U-Boot 的命令实现大多在 common 目录下.在该目录下命令的代码文件都是以“ cmd_”开头的,如下图所示: 其中每一个文件都是一个命令实现的代码 ...

  9. u-boot中添加自定义命令

    1.u-boot命令机制u-boot中,每个命令都使用一个struct cmd_tbl_s结构体定义,该定义在include/command.h中实现:struct cmd_tbl_s{ char * ...

随机推荐

  1. python中read()、readline()、readlines()区别

    1.read([size])方法 read([size])方法从文件当前位置读取size个字节,若无参数size,则表示读取至文件结束位置,它范围为字符串对象   2.readline()方法 从字面 ...

  2. 【TestNG】使用代码方式调用TestNG用例执行

    TestNG的用例除了直接运行之外,还可以使用代码来调用,这样做的好处在于我们可以将其嵌入其他代码中,来执行这些TestNG用例,方法如下: 1.直接调用用例类 范例:定义了两个测试用例类为Depen ...

  3. unittest 运行slenium(二)---打开浏览器及元素操作

    一: 打开win10中安装的浏览器 1. 打开的浏览器有:谷歌/火狐/ie/edge 2. 当浏览器的driver没有配置在path环境下时,在启动浏览器时需要传入driver的所在位置 3. 其中火 ...

  4. SUSE CaaS Platform 4 - 使用 NFS 作为持久存储

    SUSE CaaS Platform 4 - 持久存储使用 NFS

  5. 3.Git 命令行操作

    1.Git 命令行操作(本地库操作): 1.1. 创建本地库(本地库初始化): 第一步:首先在D盘建了个名为git空文件夹,命令行中cd到这个文件夹: 第二步:通过git init命令把这个目录变成G ...

  6. -bash: zip: command not found提示解决办法

    -bash: zip: command not found是因为liunx服务器上没有安装zip命令,需要安装一下即可linux安装zip命令:apt-get install zip 或yum ins ...

  7. Linux网络编程综合运用之MiniFtp实现(六)

    间隔了一周时间没写了,由于今年的股势行情貌似不错的样子,对于对股市完全不懂的我也在蠢蠢欲动,所以最近一周业余时间在“不务正业”-----学习炒股.发现学习它其实挺费神的,满脑子都是走势图,而且是神经有 ...

  8. C++11新特性之operator "" xxx(const char *, size_t n)

    从C++11开始,我们可以使用以下形式通过常量字符串构造自定义类型, 比如: class Person { public: Person(const std::string& name): _ ...

  9. 小技巧:with用法 pycharm控制台输出带颜色的文字 打印进度条的

    with用法 with用法在python中是一个很独特的用法,因为别的语言的中没有这个用法.所以针对这个特点我们来做一次总结,什么样的情况下可以同with  我们学到的有文件的操作,和acquire  ...

  10. 6 webpack-dev-server配置命令的第2种方式

    // 导入webpack模块,这是启用热更新的第2步 const webpack=require('webpack') devServer:{ // 这是配置dev-server命令参数的第二种形式, ...