Uboot筆記檔案 0 mkconfig分析

2021-07-04 21:11:52 字數 3820 閱讀 4670

對於這個專案,最開始接觸的將是uboot的配置編譯這一塊的內容。以前配置uboot的時候都是參考的文件,直接將uboot中的**修改但是並不知道「為什麼這樣修改」。搞技術不應該這樣子滴,應該「知其然,更要知其所以然」。但是,如果不參考文件,自己就不知道要修改哪些檔案,有什麼好的辦法嗎?

《嵌入式linux應用開發完全手冊》第249頁中:「在修改**前,先看看上面的命令」make smdk2410_config「、」make all「做了什麼事情,以了解程式流程,知道要修改哪些檔案。」

"make smdk2410_config"與「make all」命令是對於開發板s3c2410uboot的配置和編譯,可以先了解開發板smdk2410的配置編譯過程中修改了哪些檔案,然後照葫蘆畫瓢。

當在終端輸入「make smdk2410_config」之後,就會執行uboot頂層makefile的這一行:

關於變數mkconfig的定義在uboot頂層makefile的這一行:

關於變數srctree的定義在uboot頂層makefile的這一行:

最後找到變數「curdir」,但是curdir這個變數在此makefile中沒有定義,那麼這個變數是什麼意思呢?

在《managing projects with gnu make

》一書第57-58頁中:

curdir是make中的標準變數,一般指的是make執行時的目錄。因此當在uboot的頂層目錄執行make時,curdir代指的是uboot的頂層目錄。

由此可知,makefile中第1879行smdk_config中的變數」mkconfig「指代的就是uboot頂層目錄下的mkconfig。

知道這之後,那麼下面這條命令是什麼意思呢?

「@」符號的作用是關閉命令回顯,意思是這條命令將不會被顯示在終端。$(@:_config=)的結果是將smdk2410_config中的_config去掉。首先$@表示的是檔案smdk2410_config;$(@:_config=)有乙個固定的格式為:$(var:***=yyy)。此句的意思是將變數var中以***結尾的部分替換成yyy。那麼$(@:_config=)的意思是:去掉_config(因為等號後面無內容)。此時,上面的命令就可以下面的形式:

./mkconfig smdk2410 arm arm920t smdk2400 null s3c24x0

下面分析一下mkconfig這個指令碼。

while [ $# -gt 0 ] ; do

case "$1" in

--) shift ; break ;;

-n) shift ; board_name="$" ; shift ;;

*) break ;;

esac

done

[ "$" ] || board_name="$1"

"$#"表示什麼意思呢?可以在mkconfig指令碼中加入列印資訊:echo "*****$#******";輸入上面的命令後,出現:

「$#」表示的是傳入的引數個數;-gt表示第乙個引數是否大於第二個引數;如果「$#」大於0則執行下面的語句。在終端列印出「$1」-"$6"的值分別為:

「$1」與下面的都不相等。因此,程式執行「*) break ;;」這一句,最後跳出迴圈。「[ ]」起到判斷的作用,判斷變數board_name是否為真(或者是否有內容);當執行完這一句,變數board_name被賦值為smdk2410.。

fi這一段**的作用是建立開發板或者平台的特定的標頭檔案的鏈結

if條件語句判斷變數「srctree」與變數「objtree」是否相等,列印出的結果如下:

可以看到這兩個變數是相等的,那麼就會執行緊跟的一些列的命令。結束if……else之後又會緊接著執行後面的if語句。

在shell指令碼中,if[-z $a]的意思是:如果a為空串;-o 表示表示邏輯或。那麼

if [ -z "$6" -o "$6" = "null" ] 的意思:"$6" = s3c24x0不為空串,則-z "$6"為假,且"$6"= "null" 也為假,通過-o將這兩個條件連線起來之後就是假,因此執行else後的命令

#

# create include file for make

#echo "arch = $2" > config.mk

echo "cpu = $3" >> config.mk

echo "board = $4" >> config.mk

[ "$5" ] && [ "$5" != "null" ] && echo "vendor = $5" >> config.mk

[ "$6" ] && [ "$6" != "null" ] && echo "soc = $6" >> config.mk

## create board specific header file

#then

echo >> config.h

else

> config.h # create new config file

fiecho "/* automatically generated - do not edit */" >>config.h

echo "#include " >>config.h

exit 0

開始建立config.h檔案,並且將上面輸出的結果全部重定向到此檔案裡。

uboot移植筆記

uboot的作用 1,初始化必要的硬體 如cpu,記憶體,flash,網絡卡,串列埠等 這一部分通常即為移植的重點。2,引導作業系統,即核心。通常在部分1中設定好以後,核心引導就可交給uboot進行。沒有核心的話uboot啟動將會停在某一位置。處於等待使用者輸入命令狀態。配置和編譯uboot 2,修...

除錯U Boot筆記(二)

大概的思路就是用axd來除錯u boot,方法很簡單。在linux下編譯u boot的目錄除了生成u boot.bin檔案,還有乙個u boot檔案。將u boot,u boot.bin這兩個檔案複製到windows下的乙個目錄下,如 e u boot gdb。然後將 u boot 重新命名為 u ...

Uboot學習筆記(三)Uboot編譯過程分析

mkconfig分析 makefile分析 通過閱讀訊為提供的使用手冊,我們可以知道三星exynos4412的uboot的編譯是通過呼叫build uboot.sh來實現的,這個指令碼檔案通過傳入引數的不同來生成不同記憶體大小 emmc大小的核心板的uboot.bin二進位制檔案,例如 scp封裝2...