1. 程式人生 > >U-boot根目錄下的mkconfig分析

U-boot根目錄下的mkconfig分析

原文地址:http://blog.csdn.net/qq_28992301/article/details/51812103

U-boot根目錄下的mkconfig分析

此檔案位於uboot原始碼的根目錄下,是原始碼自帶的shell指令碼檔案,主要功能是建立符號連結以及一些標頭檔案(擁有符號連結的功能)。 
輸入make x210_sd_config時,本指令碼將會被主Makefile呼叫執行。 
其內容主要結構為: 
1.解析輸入引數 
2.建立符號連結及一些標頭檔案 
需要注意的是,結構順序不代表程式碼執行順序,關於程式碼的執行順序以及推薦閱讀順序請移步 

[ U-boot配置及編譯階段流程巨集觀分析 ]

1.解析輸入引數

這個指令碼在主makefile中被執行前,會被傳入6個引數,分別是:x210_sd,arm,s5pc11x,x210,samsung,s5pc110。所以和引數有關的變數為$#=6($#的值是輸入引數個數),$1=x210_sd $2=arm $3=s5pc11x $4=x210 $5=samsung $6=s5pc110

  • 本段程式碼的功能為解析傳入本指令碼的引數,首先利用了一個while迴圈,判斷$#的值(即引數個數),是否大於0,如果大於0則進入迴圈
  • shell的switch case語法中是不需要break的,故此處的switch case是為了跳出外面的while迴圈
  • 此外每個case的結束都需要加’;’執行語句結束也要加’;’,所以在每行case的最後都會有兩個分號
  • 這段程式碼上來先判斷$1的值(即第一個引數),如果為一些特定的值,那麼會進行shift操作,即向左移動引數列表一次,將第一個引數移出引數列表
  • 但由於我們第一個引數為x210_sd,故只符合最後一個case即*,也就是萬用字元,直接break跳出了while迴圈。其實這整段程式碼對我們沒有產生什麼作用。
APPEND=no   # Default: Create new config file
BOARD_NAME=""   # Name to print in make output
while [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; *) break ;; esac done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 本句是縮寫的if判斷語句,判斷變數BOARD_NAME是否不為空,由於在12行處對其賦為空值,所以此處將它的值賦為第一個引數的值,即x210_sd
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
  • 1
  • 2
  • 開頭兩句是縮寫的if判斷語句,如果引數個數小於4,則這個指令碼程式將退出,並返回1(表示出錯);同樣,如果引數個數大於6,則這個指令碼程式將退出,並返回1(表示出錯)
  • 最後一句為列印配置資訊
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
echo "Configuring for ${BOARD_NAME} board..."
  • 1
  • 2
  • 3

2.建立符號連結及一些標頭檔案

從這裡開始的程式碼便是建立符號連結及一些標頭檔案,其根本目的是使uboot具有可移植性。uboot中有很多功能平行的程式碼檔案,各自屬於各自不同的平臺/開發板/cpu。通過傳入此shell指令碼的引數,來建立指向我們需要的檔案的符號連結。但uboot並不直接與這些功能平行的程式碼建立聯絡,符號連結幫助uboot遮蔽了許多用不到的程式碼。比如某原始檔中包含了一個 #include “asm/xx.h”,其中asm為本指令碼檔案建立的符號連結,它指向的地址為根目錄下include/asm-arm,由此便可以定位到真正的路徑,即”根目錄下include/asm-arm/xx.h”。綜上所述,建立符號連結的本質是通過不同的引數,令原始碼檔案包含特定的檔案

  • 本段程式碼功能是確定和彙編指令集相關資料夾
  • 首先判斷是否使用了“外部輸出資料夾編譯”功能,如果未使用則進入原始碼目錄下的include目錄,刪除原本存在的符號連結asm
  • 最後建立符號連結asm,使其連結到asm-arm資料夾
if [ "$SRCTREE" != "$OBJTREE" ] ; then
    mkdir -p ${OBJTREE}/include
    mkdir -p ${OBJTREE}/include2
    cd ${OBJTREE}/include2
    rm -f asm
    ln -s ${SRCTREE}/include/asm-$2 asm
    LNPREFIX="../../include2/asm/"
    cd ../include
    rm -rf asm-$2
    rm -f asm
    mkdir asm-$2
    ln -s asm-$2 asm
else
    cd ./include
    rm -f asm
    ln -s asm-$2 asm
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 刪除指令集資料夾下原本存在的符號連結arch
  • 然後確定指令集資料夾下的架構資料夾,但是這段程式碼其實是歷史遺留程式碼,建立的是有問題的,真正的確定架構資料夾是在後面
rm -f asm-$2/arch

if [ -z "$6" -o "$6" = "NULL" ] ; then
    ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
    ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 本段程式碼旨在確定cpu的暫存器標頭檔案,和確定指令集資料夾下的架構資料夾
  • 首先判斷第三個引數是不是s5pc11x,然後刪除原本存在的符號連結regs.h,再建立regs.h連結到s5pc110.h
  • 最後刪除原本./include/asm-arm目錄下的存在的符號連結arch,再在./include/asm-arm目錄下建立arch連結到arch-s5pc110這個架構資料夾
這裡省略了一堆和其他soc有關的程式碼,只保留了我們的s5pv210
if [ "$3" = "s5pc11x" ] ; then
        rm -f regs.h
        ln -s $6.h regs.h
        rm -f asm-$2/arch
        ln -s arch-$3 asm-$2/arch
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 本段程式碼旨在確定指令集資料夾下的proc資料夾。在./include/asm-arm目錄下建立proc,指向proc-armv資料夾
if [ "$2" = "arm" ] ; then
    rm -f asm-$2/proc
    ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 本段是建立include/config.mk,由於之前所停留的目錄一直是include目錄下,故config.mk將被建立在include目錄下
  • bash語法中的>功能是建立檔案並填充內容,>>功能是額外新增內容,所以第2,3,4個引數都被新增到這個檔案中去了,當56存在且不為0時,第5,6個引數才被新增
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 本段的功能主要是建立根目錄下include/config.h這個檔案,這個.h檔案內只有一句話,即#include “configs/x210_sd.h”
  • 從某種意義上來說,./include/config.h這個檔案的功能就是符號連結,它指向了真正的配置標頭檔案 
    ./include/configs/x210_sd.h
  • APPEND變數是在本檔案一開始的地方定義的,值預設是no,當本指令碼檔案被傳引數-a時,它會被賦值yes(具體程式碼大概在25行左右)
  • 建立完config.h之後,再向其填充入內容,最後shell結束,返回值0(表示正常)
if [ "$APPEND" = "yes" ]   # Append to existing config file
then
    echo >> config.h
else
    > config.h      # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h

exit 0