新手看招了解UBOOT添加命令的执行流程

文章作者 100test 发表时间 2007:07:02 11:42:49
来源 100Test.Com百考试题网


这个应该对我有帮助,使我能够更好的了解uboot命令的执行流程。

具体内容如下:

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选项在开发板的配置文件中定义。例如:SMDK2410平台在include/configs/smdk2410.h中有如下定义。

/***********************************************************

 * Command definition

 ***********************************************************/

#define CONFIG_COMMANDS \

                 (CONFIG_CMD_DFL  | \

                 CFG_CMD_CACHE     | \

                 CFG_CMD_REGINFO    | \

                 CFG_CMD_DATE      | \

                 CFG_CMD_ELF)

按照这3步,就可以添加新的U-Boot命令。


src="/linux/js/wxgg_linux.js">

相关文章


高手进阶:配置Domino服务器详细步骤
让远程Windows系统访问本地Linux打印机
Linux操作系统下ADSL拨号上网详细步骤
新手看招Linux系统下设置用户登录环境
新手看招了解UBOOT添加命令的执行流程
Linux操作系统个性化配置技巧详细介绍
新手学堂Linux操作系统下设置NFS共享
Linux学习笔记虚拟专用网VPN实验PPTP
Linux安全攻略服务器与网络设备的维护
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛