08 uboot上增加自己的命令

来源:互联网 发布:查看数据库命令 编辑:程序博客网 时间:2024/05/29 13:35

在实现前需了解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");
原创粉丝点击