開(kāi)篇
為什么會(huì)有這篇文章,因?yàn)樾∩籾-boot源碼的設(shè)計(jì)所吸引了(源碼對(duì)命令的處理過(guò)程)。自定義u-boot命令屬于u-boot源碼的開(kāi)發(fā)技術(shù)啦,可能u-boot官方開(kāi)發(fā)人員、芯片原廠或者硬件板卡BSP開(kāi)發(fā)人員會(huì)接觸到這一塊。
既然被我碰著了,那就皺眉一笑輕提筆,在此一文奉上。
對(duì)于u-boot來(lái)說(shuō),其核心功能是使用命令來(lái)執(zhí)行對(duì)應(yīng)的操作。在u-boot源碼/cmd目錄下則放置了關(guān)于u-boot所支持的所有命令,如下圖所示:

(.o文件是編譯后生成的)
一、基礎(chǔ)
(1-1)命令定義
在實(shí)際開(kāi)發(fā)中,我們可以創(chuàng)建新的命令結(jié)構(gòu),然后將命令添加到U-Boot中。步驟大致如下:首先在命令描述文件中包含command.h,然后再使用U_BOOT_CMD()
或U_BOOT_CMD_COMPLETE
宏來(lái)填充struct cmd_tbl
結(jié)構(gòu):
U_BOOT_CMD(name,maxargs,repeatable,command,"usage","help")
U_BOOT_CMD_COMPLETE(name,maxargs,repeatable,command,"usage,"help",comp)
- name:命令名稱。注意:這不是一個(gè)字符串。
- maxargs:此函數(shù)接受的最大參數(shù)值,包括命令本身。
- repeatable:0 - 不允許自動(dòng)重復(fù);1 - 允許自動(dòng)重復(fù)。
- command:指向命令函數(shù)的指針。這是在u-boot命令行下發(fā)出命令時(shí)調(diào)用的函數(shù)。
- usage:用于描述命令的提示信息。是一個(gè)字符串。
- help:長(zhǎng)描述。這是一個(gè)字符串。只有定義了CONFIG_SYS_LONGHELP時(shí),長(zhǎng)描述才可用。
- comp:指向補(bǔ)全函數(shù)的指針??赡苁荖ULL。如果在輸入命令參數(shù)以完成輸入時(shí)按下TAB鍵,則調(diào)用此函數(shù)。命令補(bǔ)全僅在定義了CONFIG_AUTO_COMPLETE時(shí)可用。
(1-2)命令函數(shù)
命令函數(shù)指針聲明如下:
int(*cmd)(structcmd_tbl*cmdtp,intflag,intargc,constchar*argv[]);
- cmdtp:描述該命令的表?xiàng)l目。
- flag:可以包含以下幾種選項(xiàng):CMD_FLAG_REPEAT - 重復(fù)執(zhí)行最后一條命令;CMD_FLAG_BOOTD - 該命令由bootd命令調(diào)用;CMD_FLAG_ENV - 該命令由run命令調(diào)用。
- argc:包括命令在內(nèi)的參數(shù)的數(shù)目。
- argv:參數(shù)。允許的返回值為:CMD_RET_SUCCESS - 標(biāo)志命令執(zhí)行成功;CMD_RET_FAILURE - 命令執(zhí)行失??;CMD_RET_USAGE - 使用無(wú)效參數(shù)調(diào)用命令。這個(gè)值將顯示用法字符串。
二、創(chuàng)建自定義的u-boot命令
在第一小節(jié)中,已經(jīng)描述了關(guān)于u-boot命令的基礎(chǔ)知識(shí),本小節(jié)將來(lái)實(shí)現(xiàn)一個(gè)具體的u-boot命令。
這里假設(shè)這個(gè)命令命名為:showIriczhaoInfo
。當(dāng)我們?cè)趗-boot的命令行下輸入這個(gè)命令后,將打印出“[iriczhao]:u-boot hello world!!!”。
(2-1)命令創(chuàng)建過(guò)程
(1)在u-boot的/cmd目錄下創(chuàng)建一個(gè)文件,命名為command_test.c。
(2)添加頭文件。在command_test.c文件中添加如下的頭文件信息:
#include
#include
(3)定義showIriczhaoInfo的命令處理函數(shù)
staticintdo_showIriczhaoInfo(structcmd_tbl*cmdtp,intflag,intargc,char*constargv[])
{
printf("[iriczha]:u-boothelloworld!!!");
return0;
}
(4)使用U_BOOT_CMD關(guān)聯(lián)命令和命令處理函數(shù)
U_BOOT_CMD(showIriczhaoInfo,CONFIG_SYS_MAXARGS,0,do_showIriczhaoInfo,"do_showIriczhaoInfo","command
");
(5)將command_test.c文件添加到makefile文件中,如下圖所示:

(6)以Snadbox方式編譯u-boot源碼(注:也可以編譯其他架構(gòu)下的u-boot)
(7)在宿主機(jī)終端中運(yùn)行u-boot snadbox,效果如下:

從上圖可見(jiàn),當(dāng)我們?cè)趗-boot的命令行上輸入showIriczhaoInfo后,按下回車鍵,輸出了[iriczhao]:u-boot hello world!!!信息,結(jié)果與預(yù)期效果一樣。
三、總結(jié)
在u-boot的命令描述文件中,是按照模塊來(lái)進(jìn)行文件劃分的。例如對(duì)于ext4文件系統(tǒng)的命令操作就會(huì)放到ext4.c
文件中,在該文件中放置操作ext4的所有命令。在分析u-boot的命令源碼時(shí)候,可根據(jù)該種思路來(lái)尋找具體的命令處理過(guò)程。
本文描述了u-boot命令行的定義過(guò)程,描述如何實(shí)現(xiàn)一個(gè)自定義命令并將其添加到u-boot中。
在u-boot源碼中,其命令與命令處理函數(shù)的綁定過(guò)程是一個(gè)非常精彩的技術(shù)點(diǎn),先留著點(diǎn),下回分析啦!
審核編輯:湯梓紅
-
u-boot
+關(guān)注
關(guān)注
0文章
121瀏覽量
38475 -
命令
+關(guān)注
關(guān)注
5文章
706瀏覽量
22246
原文標(biāo)題:自定義u-boot命令,有意思!
文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
u-boot命令之EMMC和SD卡操作命令詳解
U-boot的基本介紹

飛凌全志T527開(kāi)發(fā)板U-Boot添加自定義菜單
【OK210試用體驗(yàn)】u-boot篇 -- u-boot初體驗(yàn)(續(xù))
【OK210試用體驗(yàn)】u-boot篇 -- 自定義單板
具有自定義phy的自定義板的u-boot錯(cuò)誤怎么解決?
Porting U-Boot to the Control
u-boot簡(jiǎn)介
U-Boot命令介紹
詳解U-Boot引導(dǎo)內(nèi)核分析

uboot自定義命令
Linux U-Boot開(kāi)發(fā)指南

評(píng)論