08 uboot上增加自己的命令

在实现前需了解lds和里面的段



在uboot源码目录里include/command.h:

struct cmd_tbl_s {
    char        *name;    
    int     maxargs;   //命令功能函数支持的最大参数的个数
    int     repeatable; //此命令执行完后,再按"enter"键时是否重复执行.                 
    int     (*cmd)(struct cmd_tbl_s *, int, int, char * const []); //命令的功能函数
    char        *usage;    // 打"help"时,此命令相关的内容
    char        *help;     // help 命令
    ...
};

typedef struct cmd_tbl_s    cmd_tbl_t;

#define U_BOOT_CMD(_name, _maxargs, _rep, _cmd, _usage, _help)      \
    U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, NULL)

191 #define U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, _comp) \
192     ll_entry_declare(cmd_tbl_t, _name, cmd) =           \
193         U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd,  \
194                         _usage, _help, _comp);

// 这个宏用于声变结构体变量并指定存入在段".uboot_list_2_#_name"
150 #define ll_entry_declare(_type, _name, _list)               \
151     _type _u_boot_list_2_##_list##_2_##_name __aligned(4)       \
152             __attribute__((unused,              \
153             section(".u_boot_list_2_"#_list"_2_"#_name)))

// 这个宏用于结构全变量的初始化
186 #define U_BOOT_CMD_MKENT_COMPLETE(_name, _maxargs, _rep, _cmd,      \
187                 _usage, _help, _comp)           \
188         { #_name, _maxargs, _rep, _cmd, _usage,         \
189             _CMD_HELP(_help) _CMD_COMPLETE(_comp) }

//////////////////////////////////////////////////////

在uboot里增加自定义的命令, 只要实现一个功能函数,再调用U_BOOT_CMD宏即可.
uboot里命令统一放在源码目录里的cmd目录.每个文件表示一类或一个命令.

如实现一个自己的命令,在cmd目录里:
cmd_mytest.c

    #include <common.h>
    #include <command.h>

    int do_mytest(struct cmd_tbl_s *tbl, int flag, int argc, char * const argv[])
    {
        int i;

        printf("in mytest : \n");
        for (i = 0; i < argc ; i++)
        {   
        printf("argv[%d] : %s\n", i, argv[i]);
        }   

        return 0;
    }

    U_BOOT_CMD(mytest, 5, 1, do_mytest, "mytest - usage of mytest", "help of mytest");

修改cmd目录里的Makefile, 在第16行:
    obj-y += cmd_mytest.o  

回到orangepi_sdk目录下:
    make uboot   
    make install_uboot sdcard=/dev/sdb

/////////////////////////////////
重新启动后,在uboot上输入 "help"命令:
   可以查看到:
    mytest  - mytest - usage of mytest

   执行命令:
    mytest 11 22 34 55

    in mytest : 
    argv[0] : mytest
    argv[1] : 11
    argv[2] : 22
    argv[3] : 34
    argv[4] : 55


//////////////////////////
 在uboot里每个命令都有一个功能函数,我们可以在自己实现的命令函数里调用其它命令的功能函数来实现相应的功能.
如启动系统的命令:
extern int do_fat_fsload (cmd_tbl_t *, int, int, char * const []);
extern int do_bootm (cmd_tbl_t *, int, int, char * const []);
int do_mybootcmd(struct cmd_tbl_s *tbl, int flag, int argc, char * const argv[])
{
    // fatoad mmc 0:1 0x43000000 /script.bin
    char *argvs_script[] = {"fatload", "mmc", "0:1", "0x43000000", "/script.bin"};

    // fatload mmc 0:1 0x42000000 /uImage
    char *argvs_uimage[] = {"fatload", "mmc", "0:1", "0x42000000", "/uImage"};

    // bootm 0x42000000
    char *argvs_bootm[] = {"bootm", "0x42000000"};


    if (0 != do_fat_fsload(NULL, 0, 5, argvs_script))
        return;

    if (0 != do_fat_fsload(NULL, 0, 5, argvs_uimage))
        return;

    return do_bootm(NULL, 0, 2, argvs_bootm);
}

U_BOOT_CMD(mybootcmd, 5, 1, do_mybootcmd, "boot system...", "help of mybootcmd");
### 创建和添加自定义命令 #### 添加命令行配置信息 为了使 U-Boot 支持新的命令,在特定开发板对应的头文件中需加入宏定义 `CONFIG_CMD_MYUBOOTCMD`。例如,针对 fs4412 开发板,在路径 u-boot-2013.01/include/configs/fs4412.h 中应添加如下代码: ```c #define CONFIG_CMD_MYUBOOTCMD ``` 此操作确保编译器能够识别并集成新命令到最终固件之中[^1]。 #### 实现命令逻辑 接下来需要编写实际处理该命令的功能函数。通常情况下,这些新增加命令会被放置于 `/cmd` 文件夹内。创建一个新的 C 文件用于实现名为 "myubootcmd" 的指令集,并按照标准模板填充必要的结构体成员以及入口点方法。 以下是简化版的框架示意: ```c #include <common.h> #include <command.h> static int do_myubootcmd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { printf("Executing my custom command!\n"); /* Add your specific implementation here */ return 0; } U_BOOT_CMD( myubootcmd, // Command name CFG_MAXARGS, // Maximum number of arguments supported by this cmd 1, // Repeatable? (true/false) do_myubootcmd, // Function to execute when the user runs this cmd "Description of what this does",// Help string describing usage "" // Detailed help message or additional parameters info ); ``` 上述代码片段展示了如何声明一个简单的命令处理器及其关联的帮助文档字符串。注意这里的 `CFG_MAXARGS` 需要根据具体情况调整最大参数数量限制[^2]。 #### 更新 Makefile 和 Kconfig 文件 为了让构建系统知道存在这样一个外部模块,还需要修改相应的 Makefile 及 Kconfig 文件以便将其纳入编译流程当中去。这一步骤涉及到向顶层 makefile 添加子目录列表项以及更新配置选项菜单以允许用户选择是否启用这个特性。 对于大多数现代版本而言,默认已经包含了自动扫描机制因此可能不需要手动干预;但对于较老版本如文中提到的 u-boot-2013.01,则建议查阅官方手册确认具体的改动位置[^3]。 完成以上步骤之后重新编译整个项目即可让定制化命令生效。一旦成功加载进入内存空间后就可以像其他内置工具一样调用了[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值