Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1975573
  • 博文数量: 185
  • 博客积分: 10707
  • 博客等级: 上将
  • 技术积分: 1777
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-19 17:31
文章分类

全部博文(185)

文章存档

2014年(1)

2012年(6)

2011年(27)

2010年(13)

2009年(75)

2008年(63)

分类: LINUX

2008-12-15 17:05:35

u-boot的命令为用户提供了交互功能,并且已经实现了几十个常用的命令。如果开发板需要很特殊的操作,可以添加新的u-boot命令。

u-boot的每一个命令都是通过U_Boot_CMD宏定义的。这个宏在include/command.h头文件中定义,每一个命令定义一个cmd_tbl_t结构体。

#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}

这样每一个u-boot命令有一个结构体来描述。结构体包含的成员变量:命令名称、最大参数个数、重复数、命令执行函数、用法、帮助。

从控制台输入的命令是由common/command.c中的程序解释执行的。find_cmd()负责匹配输入的命令,从列表中找出对应的命令结构体。

基于U-Boot命令的基本框架,来分析一下简单的icache操作命令,就可以知道添加新命令的方法。

(1)定义CACHE命令。在include/cmd_confdefs.h中定义了所有u-boot命令的标志位。

    #define CFG_CMD_CACHE       0x00000010ULL    /* icache, dcache       */

如果有更多的命令,也要在这里添加定义。

(2)实现CACHE命令的操作函数。下面是common/cmd_cache.c文件中icache命令部分的代码。

    #if (CONFIG_COMMANDS & CFG_CMD_CACHE)
    static int on_off (const char *s)
    {        //这个函数解析参数,判断是打开cache,还是关闭cache
        if (strcmp(s, "on") == 0) {  //参数为“on”
            return (1);
        }
        else if (strcmp(s, "off") == 0) {  //参数为“off”
            return (0);
        }
    return (-1);
   }

int do_icache ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{        //对指令cache的操作函数
    switch (argc) {
        case 2:               /* 参数个数为1,则执行打开或者关闭指令cache操作 */
            switch (on_off(argv[1])) {
            case 0:
                icache_disable();        //打开指令cache
                break;
            case 1:
                icache_enable ();        //关闭指令cache
                break;
            }
        /* FALL TROUGH */
        case 1:        /* 参数个数为0,则获取指令cache状态*/  
            printf ("Instruction Cache is %s\n",
            icache_status() ? "ON" : "OFF");
            return 0;
        default:        //其他缺省情况下,打印命令使用说明
            printf ("Usage:\n%s\n", cmdtp->usage);
             return 1;
    }
    return 0;
}
……
U_Boot_CMD( //通过宏定义命令
    icache,   2,   1,     do_icache,  //命令为icache,命令执行函数为do_icache()
    "icache  - enable or disable instruction cache\n",   //帮助信息
    "[on, off]\n"
    "    - enable or disable instruction cache\n"
);
……
#endif

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

#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}

还有,不要忘了在common/Makefile中添加编译的目标文件。

(3)打开CONFIG_COMMANDS选项的命令标志位。这个程序文件开头有 #if语句需要预处理是否包含这个命令函数。CONFIG_COMMANDS选项在开发板的配置文件中定义。例如:MPC8280平台在 include/configs/MPC8280.h中有如下定义。

/***********************************************************
* Command definition
***********************************************************/
#define CONFIG_COMMANDS \
                (CONFIG_CMD_DFL | \
                CFG_CMD_CACHE | \
                CFG_CMD_REGINFO | \
                CFG_CMD_DATE | \
                CFG_CMD_ELF)



阅读(1151) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~