uboot之uboot的命令体系

一、uboot命令的使用:

    1、uboot启动进入命令环境下,在此输入命令按回车结束,uboot会收取这个命令然后解析,然后执行。

    2、uboot命令体系的实现代码uboot/common/cmd_xxx.c中。有若干个.c文件和命令体系有关。

    3、每一个uboot的命令背后都对应一个函数。这就是uboot实现命令体系的一种思路和方法。

    4、有些命令还支持传递参数。也就是说命令背后对应的函数接收的参数列表中有argc和argv,然后命令体系会把

        我们执行命令时的命令+参数(md 30000000 10)以argc(3)和argv(argv[0]=md, argv[1]=30000000

         argv[2]=10)的方式传递给执行命令的函数。

二、uboot的命令解析和执行过程分析

    1、从main_loop说起

        (1)、uboot启动的第二阶段,在初始化了所有该初始化的东西后,进入了一个死循环,死循环的循环体就是

        main_loop。

        (2)、main_loop函数执行一遍,就是一个获取命令、解析命令、执行命令的过程。

        (3)、run_command函数就是用来执行命令的函数。

    2、run_command函数详解

        (1)、控制台命令获取。

        (2)、命令解析。parse_line函数把"md 30000000 10"解析成argv[0]=md, argv[1]=30000000 argv[2]=10。

        (3)、命令集中查找命令。find_cmd(argv[0])函数去uboot的命令集合当中搜索有没有argv[0]这个命令。

        (4)、执行命令。最后用函数指针的方式调用执行了对应函数。

    3、命令结构体cmd_tbl_t

        struct cmd_tbl_s {

char *name; /* Command Name */

int maxargs; /* maximum number of arguments */

int repeatable; /* autorepeat allowed? */

/* Implementation function */

int (*cmd)(struct cmd_tbl_s *, int, int, char *[]);

char *usage; /* Usage message (short) */

#ifdef CFG_LONGHELP

char *help; /* Help  message (long) */

#endif

#ifdef CONFIG_AUTO_COMPLETE

/* do auto completion on the arguments */

int (*complete)(int argc, char *argv[], char last_char, int maxv, char *cmdv[]);

#endif

};

typedef         struct cmd_tbl_s         cmd_tbl_t;

        (1)name:命令名称,字符串格式。

        (2)maxargs:命令最多可以接收多少个参数

        (3)repeatable:指示这个命令是否可重复执行。重复执行是uboot命令行的一种工作机制,就是直接按回车则

        执行上一条执行的命令。

        (4)cmd:函数指针,命令对应的函数的函数指针,将来执行这个命令的函数时使用这个函数指针来调用。

        (5)usage:命令的短帮助信息。对命令的简单描述。

        (6)help:命令的长帮助信息。细节的帮助信息。

        (7)complete:函数指针,指向这个命令的自动补全的函数。

        总结:uboot的命令体系在工作时,一个命令对应一个cmd_tbl_t结构体的一个实例,然后uboot支持多少个命令,

        就需要多少个结构体实例。uboot的命令体系把这些结构体实例管理起来,当用户输入了一个命令时,uboot会

        去这些结构体实例中查找(查找方法和存储管理的方法有关)。如果找到则执行命令,如果未找到则提示命令未知。    

三、在uboot中增加自定义命令

    1、在已有的c文件中直接添加命令

        (1)、在uboot/common/command.c中添加一个命令,叫:mycmd。

        (2)、在已有的.c文件中添加命令比较简单,直接使用U_BOOT_CMD宏即可添加命令,给命令提供一个

        do_xxx的对应的函数这个命令就齐活了。

        (3)、添加完成后要重新编译工程(make distclean; make x210_sd_config; make),然后烧录新的

        uboot去运行即可体验新命令。

        (4)、还可以在函数中使用argc和argv来验证传参。

    2、自己建一个c文件并添加命令

        (1)、在uboot/common目录下新建一个命令文件,叫cmd_aston.c(对应的命令名就叫aston,对应的函数

        就叫do_aston函数),然后在c文件中添加命令对应的U_BOOT_CMD宏和函数。注意头文件包含不要漏掉。

        (2)、在uboot/common/Makefile中添加上aston.o,目的是让Make在编译时能否把cmd_aston.c编译链接进去。

        (3)、重新编译烧录。重新编译步骤是:make distclean; make x210_sd_config; make

总结:uboot命令体系本身比较复杂,但是写好之后就不用动了。我们后面在移植uboot时也不用动uboot的命令体系。

        我们向uboot中去添加命令,也非常的简单。

欢迎各位指出不足之处


猜你喜欢

转载自blog.csdn.net/qq_41003024/article/details/80439835