一、uboot命令体系简介
-
- 1、uboot命令体系实现代码在哪里
uboot命令体系的实现代码在uboot/common/cmd_xxx.c中。有若干个.c文件和命令体系有关。(还有command.c
main.c也是和命令有关的)。
uboot实现命令体系的方法是每一个uboot命令对应一个函数,与shell的实现是一致的。
- 2、命令参数以argc&argv传给函数
(1)有些uboot的命令还支持传递参数。也就是说命令背后对应的函数接收的参数列表中有argc和argv,然后命令体系会把我们执行命令时的命令+参数(md
30000000 10)以argc(3)和argv(argv[0]=md, argv[1]=30000000
argv[2]=10)的方式传递给执行命令的函数。
二.uboot命令解析和执行过程分析
1、从main_loop说起 (转载:http://blog.51cto.com/9291927/1792776)
(1)
uboot在启动进入BL2阶段后最终执行在main_loop函数,如果在自动倒计时时没有按下字符键,uboot将自动启动kernel;如果按下了字符键,uboot将进入人机交互命令行的主循环,读取命令、解析命令、执行命令。
2.uboot命令的解析
main_loop函数中会先执行getenv
(“bootcmd”),如果bootcmd环境变量设置的是启动kenel的命令,则在自动倒计时结束后如果没有字符输入,则uboot会自动执行bootcmd的命令,默认即执行启动kernel。如果自动倒计时结束前有字符输入,则进入命令行提示符状态阻塞等待用户输入命令。
readline函数读取用户输入命令,进而通过run_command函数解析、运行命令
run_command函数会将接收的命令用parse_line函数解析,主要是将接收的命令字符串根据空格、分号分割成几部分,
利用find_cmd函数遍历查找命令集,看uboot中是否有输入的命令,如果没有输入的命令,打印提示符。如果有当前输入的命令,调用当前输入命令的命令结构体的函数指针成员cmd执行命令对应的函数。
**int run_command (const char \*cmd, int flag)**
**{**
**.......................**
**while (\*str) {**
**//对命令字符串进行简单分割**
**for (inquotes = 0, sep = str; \*sep; sep++) {**
**if ((\*sep=='\\'') &&**
** (\*(sep-1) != '\\\\'))**
**inquotes=!inquotes;**
**if (!inquotes &&**
** (\*sep == ';') &&/\* separator\*/**
** ( sep != str) &&/\* past string start\*/**
** (\*(sep-1) != '\\\\'))/\* and NOT escaped\*/**
**break;**
**}**
**/\***
** \* Limit the token to data between separators**
** \*/**
**token = str;**
**if (\*sep) {**
**str = sep + 1;/\* start of command for next pass \*/**
**\*sep = '\\0';**
**}**
**else**
**str = sep;/\* no more commands for next pass \*/**
**\#ifdef DEBUG_PARSER**
**printf ("token: \\"%s\\"\\n", token);**
**\#endif**
**/\* find macros in this token and replace them \*/**
*