一、uboot的命令体系介绍以及实例分析:

U-Boot 的命令实现大多在 common 目录下。在该目录下命令的代码文件都是以“ cmd_”开头的,如下图所示:

      

  其中每一个文件都是一个命令实现的代码文件,而且文件名和命令名称是相关的,例如 cmd_nand.c 是实现 nand 命令的文件,从而实现模块化,这样就可以方便我们管理和添加自己的命令。

下面,我们用一个示例来讲解u-boot中如何管理这套命令体系的,以及如何添加一个自定义的命令。

    

这里涉及了几个要点,第一个是cmd_tbl_t结构体:

  

  不难看出cmd_tbl_t结构体主要是包含了命令的一些信息,最关键的是想通过回调函数的形式来实现用户的自定义功能。

那么接下来来分析一个重点 U_BOOT_CMD:

  

  这里会涉及一些编译器相关的知识,struct_Section的意思是想将一个结构体标记成".u_boot_cmd"属性(__attribute__是编译器的扩展属性,具体可以查看gcc手册)。而这里的 __u_boot_cmd##name 的含义是将 name添加上 __u_boot_cmd_ 前缀。

于是我们可以将最上面的version例子来拆解:

  

二、uboot中对命令的注册、存储、索引:

  结合上面的例子,发现使用U_BOOT_CMD宏可以向uboot添加一条命令, 通过填充该宏的参数,完成对该条命令对应的结构体的填充,便完成了注册的功能。

而在U_BOOT_CMD宏中给每条命令声明了 用户自定义段属性,使得在链接时会将具有该段属性的结构体按照顺序排布在一起,类似于结构体数组,这就是uboot命令的存储方式。

既然在uboot中存储了具有段属性的结构体数组,那么在查找命令的时候,只需要遍历该数组,如果找到返回该命令结构体的首地址即可。在uboot中是通过find_cmd函数查找命令的,如下图所示:

 /**
* find command table entry for a command
* 如果查找成功,返回结构体首地址
*/
cmd_tbl_t *find_cmd_tbl (const char *cmd, cmd_tbl_t *table, int table_len)
{
cmd_tbl_t *cmdtp;
cmd_tbl_t *cmdtp_temp = table; /*Init value */
const char *p;
int len;
int n_found = ; /*
* Some commands allow length modifiers (like "cp.b");
* compare command name only until first dot.
*/
len = ((p = strchr(cmd, '.')) == NULL) ? strlen (cmd) : (p - cmd); for (cmdtp = table; cmdtp != table + table_len;cmdtp++) {
if (strncmp (cmd, cmdtp->name, len) == ) {
if (len == strlen (cmdtp->name))
return cmdtp; /* 完全匹配 */ cmdtp_temp = cmdtp; /* abbreviated command ? */
n_found++;
}
}
if (n_found == ) { /* exactly one match */
return cmdtp_temp;
} return NULL; /* 没有找到命令 */
} cmd_tbl_t *find_cmd (const char *cmd)
{
/* __u_boot_cmd_end 和 __u_boot_cmd_start 是链接脚本中标记命令结构体数组的首尾地址*/
int len = &__u_boot_cmd_end - &__u_boot_cmd_start;
return find_cmd_tbl(cmd, &__u_boot_cmd_start, len);
}

链接脚本(u-boot.lds):

  

三、向uboot中添加自定义命令:

  通过分析,我们也可以自己实现一个uboot命令。

    1. 在common文件夹下建立一个以"cmd_xxx"的文件
    2. 参考cmd_version.c并结合具体的业务修改。
    3. 修改uboot/common/Makefile,添加上xxx.o(xxx为对应的命令文件): 
    4. 重新编译链接,下载烧录测试。

  这样一个uboot命令就添加成功了。当然我们这里只是简单的介绍了uboot中的命令体系,实际的产品需要根据您的业务来编写具体的命令函数等。

uboot中的命令体系的更多相关文章

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

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

  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. uboot中添加自定义命令

    uboot中可以通过修改源程序来添加自定义命令,进一步扩展uboot的功能. 我想在uboot下添加一条新的命令(名为varcpy),用来拷贝uboot中的环境变量. 修改方式如下: 创建新文件com ...

  5. uboot中fdt命令的使用

    转载:https://blog.csdn.net/voice_shen/article/details/7441894 依linux community的要求,从linux-3.5后,新提交的code ...

  6. uboot中ftd命令

    可以从u-boot官网源码下载一个比较新的u-boot, 查看它的cmd/fdt.cftp://ftp.denx.de/pub/u-boot/ fdt命令使用示例nand read.jffs2 320 ...

  7. uboot 的命令体系

    1.代码位置 (1)uboot命令体系的实现代码在uboot/common/cmd_xxx.c中.有若干个.c文件和命令体系有关.(还有command.c  main.c也是和命令有关的) 2.传参方 ...

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

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

  9. uboot中的快捷菜单的制作说明 【转】

    转自:http://blog.chinaunix.net/uid-22030783-id-366971.html   在uboot中加入快捷操作菜单的方法非常简单,在论坛发布的uboot201003V ...

随机推荐

  1. java.sql.SQLException: ORA-01841

    1.错误描述 body = (null) clientId = "DB719904-1E0C-35DC-725D-86ABCF2B6EEC" correlationId = &qu ...

  2. Linux系统安装软件出错

    root@youhaidong-Edge-E545:/home/youhaidong# apt-get install install_flash_player_11_linux.x86_64.tar ...

  3. Python与Mongodb交互

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案 MongoDB 将数据存储为一个文档,数据结构由键值 ...

  4. Java 第二章 变量、数据类型和运算符

    第二章      变量.数据类型和运算符 什么是变量: 变量代表一块内存区域,变量类型不一样,这一块内存的大小也不一样. #在编程语言里面,你可以通过定义变量,向内存里添加数据或者修改内存已有的数据. ...

  5. Python基础__函数

    本节将进入函数的介绍,函数是Python基础中最精彩的部分之一,接下来将对函数做详细介绍.函数 函数就是对代码进行一个封装.把实现某一功能的代码进行封装到一起.下次需要使用时不需要进行编写代码直接调用 ...

  6. 【CJOJ2512】gcd之和(莫比乌斯反演)

    [CJOJ2512]gcd之和(莫比乌斯反演) 题面 给定\(n,m(n,m<=10^7)\) 求 \[\sum_{i=1}^n\sum_{j=1}^mgcd(i,j)\] 题解 首先把公因数直 ...

  7. 【BZOJ4736】温暖会指引我们前行(Link-Cut Tree)

    [BZOJ4736]温暖会指引我们前行(Link-Cut Tree) ##题面 神TM题面是UOJ的 题解 LCT傻逼维护最大生成树 不会的可以去做一做魔法森林 #include<iostrea ...

  8. SPOJ1825:Free tour II

    题意 luogu的翻译 给定一棵n个点的树,树上有m个黑点,求出一条路径,使得这条路径经过的黑点数小于等于k,且路径长度最大 Sol 点分治辣 如果是等于\(k\)的话,开个桶取\(max\)就好了 ...

  9. [ZJOI2006]书架(树状数组水过)

    这道题显然平衡树,splay,treap什么的随便切 然而我不想打,决定水过这道题 把空间开3倍,树状数组维护它前面的树的个数,开个id数组记录位置 找一个数排名直接二分加求前缀和,log^2的搞一搞 ...

  10. 使用Ant打包Web前台程序

    概述 本文通过一个简单的Web项目作为例子描述如何用ANT完成Web前台程序的打包工作.包含文件拷贝.编译.打包三部分:完成这三部就可以得到一个War了,放到Tomcat下就可以运行了. ANT的安装 ...