zoukankan      html  css  js  c++  java
  • UBOOT添加命令的执行流程 分类: arm-linux-Ubuntu HI3531 2013-12-24 09:24 514人阅读 评论(0) 收藏

    BootLoader(引导装载程序)是嵌入式系统软件开发的第一个环节,它把操作系统和硬件平台衔接在一起,对于嵌入式系统的后续软件开发十分重要,在整个开发中也占有相当大的比例。U-BOOT是当前比较流行、功能强大的BootLoader,可以支持多种体系结构。LH7A400是Sharp公司生产的一款基于ARM922T内核的32位RISC芯片,本文详细介绍U-BOOT的功能、特点以及在LH7A400处理器上的移植过程。希望对大家有所帮助,更好的了解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命令。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706687.html
Copyright © 2011-2022 走看看