1.u-boot命令机制
u-boot中,每个命令都使用一个struct cmd_tbl_s结构体定义,该定义在include/command.h中实现:
struct cmd_tbl_s{
  char *name,//u-boot中执行的命令
  int maxargs,//命令所能带的参数个数,最少为1
  int repeatable,//该命令是否可重复
  int (*cmd)(struct cmd_tbl_s *,int,int,char*[]),//指向该命令对应的源函数
  char *usage,//命令的使用提示
  char *help//在线帮助信息
}; u-boot中定义的命令能与具体的函数程序相对应,通过指针  int (*cmd)(struct cmd_tbl_s *,int,int,char*[]) 实现。 在include/command.h中定义了U_BOOT_CMD宏:
#define Struct_Section  __attribute__ ((unused,section (".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} “##”与"#"都是预编译操作符,“##”有字符串连接功能,"#"表示后面紧跟的是一个字符串。
宏 U_BOOT_CMD(name, maxargs, rep, cmd, usage, help) 就是将
struct cmd_tbl_s {
  char *name,
  int maxargs,
  int repeatable,
  int (*cmd)(struct cmd_tbl_s *,int,int,char*[]),
  char *usage,
  char *help
};
这样的一个命令结构体放到U-BOOT连接脚本 board/xxx/u-boot.lds中定义的".u-boot_cmd"段所在的内存区域.当用户在u-boot的shell中输入命令时,就会在".u_boot_cmd"这个内存区域中查找,当该区域中某一个cmd_tbl_s命令结构体的
cmd_tbl_s.name和输入的命令字符串相符时,就调用该命令结构体的cmd_tbl_s.cmd()函数. 2.添加自定义命令
自定义命令设为"myubootcmd",不可与u-boot命令重名, <1>添加命令行配置信息,在u-boot-1.3.2/include/configs/smdk2410.h中添加 #define CONFIG_CMD_MYUBOOT,如下:
#define CONFIG_CMD_CACHE
#define CONFIG_CMD_DATE
#define CONFIG_CMD_ELF
#define CONFIG_CMD_PING
#define CONFIG_CMD_NET
#define CONFIG_CMD_MYUBOOT <2>编写命令行对应的源程序,u-boot-1.3.2/board/smdk2410/中添加文件myuboot.c,内容如下所示 #include
#include
#include
#ifdef CONFIG_CMD_MYUBOOT
void myubootcmd(void)
{
    printf("Hello,my u-boot!\n");
} U_BOOT_CMD( myuboot,                             //uboot命令
        1,                                       //不带参数
        2,                                       //可重复
        myubootcmd,                              //命令对应函数
        "hello-my uboot command",                //用法提示
        "my uboot test command in u-boot 1.3.2\n"//在线帮助信息
        );
#endif <3>添加编译 u-boot-1.3.2/board/smdk2410/Makefile 中添加myuboot.o
include $(TOPDIR)/config.mk
LIB = $(obj)lib$(BOARD).a
COBJS := smdk2410.o flash.o myuboot.o <4>编译u-boot
# make smdk2410_config CROSS_COMPILE=arm-linux-
Configuring for smdk2410 board...
# make ARCH=arm  CROSS_COMPILE=arm-linux- all <5>运行
SMDK2410
# help myuboot
myuboot my uboot test command in u-boot 1.3.2 SMDK2410
# myuboot
Hello,my u-boot!
SMDK2410 http://blog.sina.com.cn/s/blog_4c02ba150101cp97.html

u-boot中添加自定义命令的更多相关文章

  1. uboot中添加自定义命令

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

  2. 在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 ...

  3. linux中添加自定义命令

    centos下设置alias别名,比较简单,例如: vim /root/.bashrc addalias rm='rm -i' Linux alias设置指令的别名命令详解 功能说明:设置指令的别名. ...

  4. uboot中的命令体系

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

  5. linux运维中的命令梳理(四)

    ----------管理命令---------- ps命令:查看进程 要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps (1) ps :是显示瞬间进程的状态,并不 ...

  6. springboot(十一):Spring boot中mongodb的使用

    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多.由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置 ...

  7. (转)Spring Boot(十一):Spring Boot 中 MongoDB 的使用

    http://www.ityouknow.com/springboot/2017/05/08/spring-boot-mongodb.html MongoDB 是最早热门非关系数据库的之一,使用也比较 ...

  8. Spring Boot 中配置文件application.properties使用

    一.配置文档配置项的调用(application.properties可放在resources,或者resources下的config文件夹里) package com.my.study.contro ...

  9. 学习Spring Boot:(二十三)Spring Boot 中使用 Docker

    前言 简单的学习下怎么在 Spring Boot 中使用 Docker 进行构建,发布一个镜像,现在我们通过远程的 docker api 构建镜像,运行容器,发布镜像等操作. 这里只介绍两种方式: 远 ...

随机推荐

  1. el表达式 多条件判断

      el表达式 多条件判断 CreationTime--2018年9月13日08点59分 Author:Marydon 1.情景展示 ACCESS_ID == 'APP1039' 且 CARDTYPE ...

  2. HDU 3316 My Brute(二维费用流)经典

    My Brute Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  3. centos7 卸载 gitlab

    标黑的就是关键命令,先停止gitlab服务,然后rpm -e卸载,然后查看剩余gitlab进程,然后杀死主进程,然后删除所有相关目录 1 [liuyx@MiWiFi-R3L-srv ~]$ sudo ...

  4. HDUOJ----旋转的二进制

    旋转的二进制 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submis ...

  5. Flyod 算法(两两之间的最短路径)

    Flyod 算法(两两之间的最短路径)动态规划方法,通过相邻矩阵, 然后把最后的结果存在这么一个矩阵里面,(i,j), #include <iostream> #include <v ...

  6. laravel-v5.1分页并带参数

    控制器的代码中

  7. 关于JavaScript中Get/Set访问器

    有时候大家可能会纳闷,在使用JavaScript的时候,只需要给一个系统变量赋值就可以触发一系列操作去相应. 但是我们在写Js的时候,修改了一个自定义变量,却连个P都没有.是不是很郁闷呢? 其实,我们 ...

  8. js时间戳转成日期格式

    将时间戳转换成日期格式:// 简单的一句代码var date = new Date(时间戳); //获取一个时间对象 注意:如果是uinx时间戳记得乘于1000.比如php函数time()获得的时间戳 ...

  9. $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别

    当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件.ready() 函数仅能用于当前文档,因此无需选择器.所以document选择器可以不要,那么就可以 ...

  10. 转 Python标准库01 正则表达式 (re包)

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我将从正则表达式开始讲Python的标准库.正则表达式是文字处理中常用的工具,而且 ...