對於這個專案,最開始接觸的將是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...