u-boot添加命令

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 命令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值