• 【u-boot】如何自定义u-boot的命令


    开篇

    对于u-boot来说,其核心功能就是使用命令来执行对应的操作。在u-boot源码/cmd目录下则放置了关于u-boot所支持的所有命令,如下图所示:

    (.o文件是编译后生成的)

    一、基础

    (1-1)命令定义

    在实际开发中,我们可以创建新的命令结构,然后将命令添加到U-Boot中。步骤大致如下:首先在命令描述文件中包含command.h,然后再使用U_BOOT_CMD()U_BOOT_CMD_COMPLETE宏来填充struct cmd_tbl结构:

    U_BOOT_CMD(name, maxargs, repeatable, command, "usage", "help")
    U_BOOT_CMD_COMPLETE(name, maxargs, repeatable, command, "usage, "help", comp)
    
    • 1
    • 2
    • name:命令名称。注意:这不是一个字符串。
    • maxargs:此函数接受的最大参数值,包括命令本身。
    • repeatable:0 - 不允许自动重复;1 - 允许自动重复。
    • command:指向命令函数的指针。这是在u-boot命令行下发出命令时调用的函数。
    • usage:用于描述命令的提示信息。是一个字符串。
    • help:长描述。这是一个字符串。只有定义了CONFIG_SYS_LONGHELP时,长描述才可用。
    • comp:指向补全函数的指针。可能是NULL。如果在输入命令参数以完成输入时按下TAB键,则调用此函数。命令补全仅在定义了CONFIG_AUTO_COMPLETE时可用。

    (1-2)命令函数

    命令函数指针声明如下:

    int (*cmd)(struct cmd_tbl *cmdtp, int flag, int argc, const char *argv[]);
    
    • 1
    • cmdtp:描述该命令的表条目。
    • flag:可以包含以下几种位图:CMD_FLAG_REPEAT - 重复执行最后一条命令;CMD_FLAG_BOOTD - 该命令由bootd命令调用;CMD_FLAG_ENV - 该命令由run命令调用。
    • argc:包括命令在内的参数的数目。
    • argv:参数。允许的返回值为:CMD_RET_SUCCESS - 标志命令执行成功;CMD_RET_FAILURE - 命令执行失败;CMD_RET_USAGE - 使用无效参数调用命令。这个值将显示用法字符串。

    二、创建自定义的u-boot命令

    在第一小节中,已经描述了关于u-boot命令的基础知识,本小节将来实现一个具体的u-boot命令。

    这里假设这个命令命名为:showIriczhaoInfo。当我们在u-boot的命令行下输入这个命令后,将打印出“[iriczhao]:u-boot hello world!!!”。

    (2-1)命令创建过程

    (1)在u-boot的/cmd目录下创建一个文件,命名为command_test.c。

    (2)添加头文件。
    在command_test.c文件中添加如下的头文件信息:

    #include 
    #include 
    
    • 1
    • 2

    (3)定义showIriczhaoInfo的命令处理函数

    static int do_showIriczhaoInfo(struct cmd_tbl *cmdtp, int flag, int argc ,char *const argv[])
    {
      printf("[iriczha]:u-boot hello world!!!");
      
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (4)使用U_BOOT_CMD关联命令和命令处理函数

    U_BOOT_CMD(showIriczhaoInfo,CONFIG_SYS_MAXARGS,0,do_showIriczhaoInfo,"do_showIriczhaoInfo","command \n");
    
    • 1

    (5)将command_test.c文件添加到makefile文件中,如下图所示:

    (6)以Snadbox方式编译u-boot源码(也可以编译其他架构下的u-boot)

    (7)在宿主机终端中运行u-boot snadbox,效果如下:

    综上,当我们在u-boot的命令行上输入showIriczhaoInfo后,按下回车键,输出了[iriczhao]:u-boot hello world!!!信息,结果与预期效果一样。

    三、总结

    在u-boot的命令描述文件中,是按照模块来进行文件划分的。例如对于ext4文件系统的命令操作就会放到ext4.c文件中,在该文件中放置操作ext4的所有命令。在分析u-boot的命令源码时候,可根据该种思路来寻找具体的命令处理过程。

    本文描述了u-boot命令行的定义过程,描述如何实现一个自定义命令并将其添加到u-boot中。

  • 相关阅读:
    如何分析精准分析出问题件
    Android 在TextView前面添加多个任意View且不影响换行
    MCDF--lab03
    ffmpeg录制系统声音
    别再盯着40系,这些才是目前性价比最高的显卡
    DOM 事件及事件委托
    汽车租赁系统毕业设计,汽车租赁管理系统设计与实现,毕业设计论文毕设作品参考
    详解Linux的grep命令
    【TypeScript基础】TypeScript之常用类型(下)
    【eBPF-01】初见:基于 BCC 框架的第一个 eBPF 程序
  • 原文地址:https://blog.csdn.net/iriczhao/article/details/126186639