1.啟動(dòng)延時(shí)
如果配置了啟動(dòng)延遲功能,U-Boot等待用戶(hù)從控制臺(tái)(一般為串口)輸入字符,等待的時(shí)間由頂層配置文件中的宏定義 CONFIG_BOOTDELAY 決定 。在此期間,只要用戶(hù)按下任意按鍵就會(huì)中斷等待,進(jìn)入命令行輸入模式。
如果沒(méi)有配置啟動(dòng)延時(shí)功能或者啟動(dòng)延時(shí)超過(guò)了設(shè)置的時(shí)間, U-Boot 運(yùn)行啟動(dòng)命令行參數(shù),啟動(dòng)命令參數(shù)在頂層配置文件中,由 CONFIG_BOOTCOMMAND宏定義。
2.讀取命令行輸入
命令行輸入模式實(shí)際上是一個(gè)死循環(huán),循環(huán)體簡(jiǎn)化后如下所示:
for (;;) {
len = readline (CONFIG_SYS_PROMPT);
flag = 0; /* assume no special flags for now */
if (len > 0)
strcpy (lastcommand, console_buffer);
else if (len == 0)
flag |= CMD_FLAG_REPEAT;
if (len == -1)
puts ("< INTERRUPT >n");
else
rc = run_command(lastcommand, flag);
if (rc <= 0) {
/* invalid command or not repeatable, forget it */
lastcommand[0] = 0;
}
}
每次循環(huán)調(diào)用readline函數(shù)從控制臺(tái)讀取命令行,并且讀取到的字符存儲(chǔ)在console_buffer緩沖區(qū)中。
console_buffer緩沖區(qū)的長(zhǎng)度在頂層文件中通過(guò)CONFIG_SYS_CBSIZE宏定義。
當(dāng)該函數(shù)在接收到一個(gè)回車(chē)鍵時(shí)認(rèn)定為命令行輸入結(jié)束,返回命令行長(zhǎng)度len。
如果len大于0,將存儲(chǔ)在緩沖區(qū)的命令行拷貝至靜態(tài)數(shù)組lastcommand中,flag設(shè)置為0。
如果len等于0,即readline函數(shù)僅僅接收到一個(gè)回車(chē)鍵,即直接返回,flag設(shè)置為CMD_FLAG_REPEAT,lastcommand數(shù)組存放的數(shù)據(jù)不變。
flag用于標(biāo)志是否重復(fù)上次操作,每個(gè)命令都有一個(gè) repeatable標(biāo)志,當(dāng)命令的該標(biāo)志為1時(shí),此時(shí),命令能夠重復(fù)操作。
把lastcommand和flag作為run_command函數(shù)的參數(shù),進(jìn)而調(diào)用run_command函數(shù)。
從 run_command 函數(shù)是否會(huì)返回的角度看,U-Boot 的命令分為兩類(lèi)。
一類(lèi)是函數(shù)返回?cái)?shù)值rc,rc小于等于0 ,則傳入的命令行參數(shù)有誤,命令無(wú)效,此時(shí)把lastcommand數(shù)組清零,不再執(zhí)行重復(fù)操作。
另外一類(lèi)是不再返回,一去不再?gòu)?fù)返 ,例如bootm、go等命令,這類(lèi)用于啟動(dòng)內(nèi)核,將CPU的管理權(quán)從U-Boot交付給內(nèi)核,完成自己?jiǎn)?dòng)內(nèi)核的終極使命。
3.解析命令行
傳入的 lastcommand 參數(shù)僅僅是 readline 函數(shù)讀取到用戶(hù)輸入的字符,接下來(lái)最主要的工作是解析命令行。
首先判斷傳入的lastcommand參數(shù)是否為空,如果是返回?1,否則繼續(xù)往下解析。截取函數(shù)的關(guān)鍵代碼如下,str指針指向 lastcommand區(qū)域 。
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;
}
U-Boot允許命令行存在多個(gè)命令,命令間用“;”或者“;”字符分割。
token = str;
if (*sep) {
str = sep + 1; /* start of command for next pass */
*sep = '?';
}
else
str = sep; /* no more commands for next pass */
/* Extract arguments */
if ((argc = parse_line (finaltoken, argv)) == 0) {
rc = -1; /* no command at all */
continue;
}
if (cmd_process(flag, argc, argv, &repeatable, NULL))
rc = -1;
首先解析一個(gè)命令,token指向待解析命令的地址。
parse_line函數(shù)分離出命令的各個(gè)參數(shù),分別存放在argv中,參數(shù)的數(shù)目為argc,接著調(diào)用common/command.c文件中的cmd_process函數(shù)處理解析得到的命令。
值得注意的是, 命令的第一個(gè)參數(shù)是命令的名稱(chēng) 。當(dāng)前命令處理完畢后, token指向命令行中的下一個(gè)命令,直到所有的命令都處理完畢。
-
Linux
+關(guān)注
關(guān)注
87文章
11211瀏覽量
208721 -
控制臺(tái)
+關(guān)注
關(guān)注
0文章
85瀏覽量
10328 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4284瀏覽量
62325 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28127
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論