uboot命令添加过程

来源:互联网 发布:初中学学士后java 编辑:程序博客网 时间:2024/05/19 20:22
uboot命令添加过程

    U-Boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的U-Boot命令。
    U-Boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在<include/command.h>头文件中定义
#ifdef CFG_LONGHELP#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}#else    /* no long help info */#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}#endif    /* CFG_LONGHELP */

  每一个命令定义一个cmd_tbl_t结构体,而cmd_tbl_t只不过是cmd_tbl_s的一个typedef,如下所示:

typedef struct cmd_tbl_s cmd_tbl_t;

  而cmd_tbl_s的定义则在同一文件<command.h>下,如下所示:

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)  */#ifdef    CFG_LONGHELP    char       *help;        /* Help message    (long)  */#endif#ifdef CONFIG_AUTO_COMPLETE    /* do auto completion on the arguments */    int        (*complete)(int argc, char *argv[], char last_char,                            int maxv, char *cmdv[]);#endif};

这样每一个U-Boot命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参数个数、重复数、命令执行函数、用法、帮助。
    从控制台输入的命令是由common/command.c中的程序解释执行的。find_cmd()负责匹配输入的命令,从列表中找出对应的命令结构体并返回指向这一结构体的指针。
   基于U-Boot命令的基本框架,来分析一下简单的ping操作命令,就可以知道添加新命令的方法。
  
  (1)定义PING命令
   在<config_cmd_all.h>与<config_cmd_default.h>中定义了所有UBOOT支持的命令的标志位

#define CONFIG_CMD_PING

其中,<config_cmd_default.h>中定义的命令是由板子默认支持的,这是由于在板子的配置文件中包含进了该头文件,如果让板子支持<config_cmd_default.h>中没有而<config_cmd_all.h>中命令,还必须在板子的配置文件中进行相关的定义,如我的<config_cmd_default.h>并没有进行PING的相关定义,我要想板子支持ping,我只需要在我的板子配置文件<mypxa255.h>中加入上面那句就可。也可以直接把定义语句写在<config_cmd_default.h>中。
   (2)定义PING命令的操作函数。下面是ping命令的具体实现,在<common/cmd_net.c>中。

#if defined(CONFIG_CMD_PING)int do_ping (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]){    if (argc < 2)        return -1;    NetPingIP = string_to_ip(argv[1]);    if (NetPingIP == 0) {        printf ("Usage:\n%s\n", cmdtp->usage);        return -1;    }    if (NetLoop(PING) < 0) {        printf("ping failed; host %s is not alive\n", argv[1]);        return 1;    }    printf("host %s is alive\n", argv[1]);    return 0;}U_BOOT_CMD(//通过宏定义命令    ping,    2,    1,    do_ping,// 命令为ping,对应的执行函数为do_ping    "ping\t- send ICMP ECHO_REQUEST to network host\n",    "pingAddress\n");#endif

U-Boot的命令都是通过结构体__u_boot_cmd_##name来描述的。根据U_Boot_CMD在<include/command.h>中的两行定义可以明白。

#define Struct_Section __attribute__ ((unused,section (".u_boot_cmd")))#ifdef CFG_LONGHELP#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}#else    /* no long help info */#define U_BOOT_CMD(name,maxargs,rep,cmd,usage,help) \cmd_tbl_t __u_boot_cmd_##name Struct_Section = {#name, maxargs, rep, cmd, usage}#endif    /* CFG_LONGHELP */

按照这2步就可以添加U-BOOT命令了。
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 公租房5年以后怎么办 教务系统密码忘记了怎么办 林科大教务处密码忘记了怎么办 智学号密码忘了怎么办 正方教务管理系统忘记密码怎么办 正方教务系统忘记密码怎么办 教务网密码忘了怎么办 电动车解除限速报警器不响怎么办 公租房住满5年怎么办 广州公租房收入超标怎么办 深圳法院拍卖房子不肯搬走怎么办 上海奉贤公租房的期满怎么办 公租房人口少了怎么办 公租房太远了怎么办 商品房没有门厅业主该怎么办 公帐付款备注错了怎么办 我是农村户口在外省交社保怎么办 北京租房遇到黑中介怎么办 上海租房子不让带孩子怎么办 租的房子没窗户怎么办 北京安河桥安河家园租房被骗怎么办 领完失业金后怎么办 北京公租房太小怎么办 申请公租房太小怎么办 房东电费收贵了怎么办 申请公租房工资超了怎么办 重庆公租房工资超了怎么办 公租房申请父母房子贷款怎么办 公产房父母去世办公证怎么办 动迁过程中承租人去世了怎么办 公租房的房间带阳台怎么办 公租房合同到期没有社保怎么办 租房合同没有到期违约了怎么办 租房户到期不搬怎么办 公租房摇号摇到了又怎么办 公租房被清退会怎么办 公租房摇不到号怎么办 公租房到期不搬怎么办 租房到期租客不搬怎么办 房产证面积与实际不符怎么办 社保晚交了1天怎么办