创建自定义的u-boot命令

电子说

1.2w人已加入

描述

 


 

开篇

为什么会有这篇文章,因为小生被u-boot源码的设计所吸引了(源码对命令的处理过程)。自定义u-boot命令属于u-boot源码的开发技术啦,可能u-boot官方开发人员、芯片原厂或者硬件板卡BSP开发人员会接触到这一块。

既然被我碰着了,那就皱眉一笑轻提笔,在此一文奉上。

对于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)
  • 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[]);
  • 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 

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

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

U_BOOT_CMD(showIriczhaoInfo,CONFIG_SYS_MAXARGS,0,do_showIriczhaoInfo,"do_showIriczhaoInfo","command 
");

(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中。

在u-boot源码中,其命令与命令处理函数的绑定过程是一个非常精彩的技术点,先留着点,下回分析啦!

 审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分