1. 程式人生 > >uboot的移植之配置及編譯過程詳解5

uboot的移植之配置及編譯過程詳解5

/***********************************************************************************
    分析物件:原始碼主Makefile中進行配置時的一個重要的指令碼:mkconfig(MKCONFIG)
    原始碼來源:以朱有鵬課程中的uboot-samsung-dev為分析物件
    作者:cryil先森
    時間:2018.11月下旬

文末附有uboot的原始碼連結
***********************************************************************************/    

***mkcongfig具體的功能:
    1.確定了開發板的一些名稱資訊,
    2.建立了相關標頭檔案的連結。
    3.根據具體板子的資訊,在根目錄下建立config.mk檔案,
    注:mkconfig是uboot的連結指令碼。


    
***Makefile中和mkconfig有關的東西:

smdkv210onenand_config : unconfig
	@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110
	@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk
	@echo "CONFIG_ONENAND_U_BOOT = y" >> $(obj)include/config.mk

   分析: $# = 6$(@:_config=) :將_config用等號後面的內容替換掉,即得到了smdkv210onenand

    makefile給mkconfig傳入的6個引數:$(@:_config=) arm s5pc11x smdkc110 samsung s5pc110  

    $1=smdkv210onenand
    $2: arm 
    $3:s5pc11x 
    $4:smdkc110 
    $5:samsung 
    $6:s5pc110        


***mkconfig的具體分析:

while [ $# -gt 0 ] ; do
		case "$1" in
		--) shift ; break ;;
		-a) shift ; APPEND=yes ;;
		-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
		*)  break ;;
		esac
	done


  注: $1=smdkv210onenand  則均不能匹配,直至*萬用字元,退出while迴圈。
        
 

   [ "${BOARD_NAME}" ] || BOARD_NAME="$1"  

注:查詢BOARD_NAME是否有值,沒有的話賦值為$1(smdkv210onenand) 

    [ $# -lt 4 ] && exit 1
    [ $# -gt 6 ] && exit 1


    注:規定了傳入引數的個數要求,$#必須大於4小於6  即傳入的引數必須4~6

    **33~118行:建立符號連結。
    符號連結檔案是我們整個配置過程的核心,這些符號連結檔案(資料夾)的主要作用是給標頭檔案包含等過程提供指向性連結,是的uboot的有可移植性。
    uboot的移植原理:在uboot之中有很多彼此平行的程式碼,各自屬於各自不同的架構/CPU/開發板,我們在具體到某個開發板的編譯時用符號連線的方式提供一個具體名字的資料夾供編譯器使用。就可以在配置過程中通過配置使用不同的檔案,就可以正確的包含正確的檔案。

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

rm -f asm-$2/arch

 1.進行一個簡單的判斷,然後建立了連個資料夾include和include2

   並在進行判斷之後最終在include目錄下建立asm檔案,指向sam-arm  

注:此時有一個重要的資訊:我們所在的目錄是根目錄下的/include 目錄下,之後的操作如果路徑發生的變化自己一定要記住,這關乎檔案的位置,十分的重要。

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


    判斷$6是否為空,然後在對應的路徑下建立連線檔案

   在本文分析的情況下(一般都是這樣的)在include/asm-arm下建立一個arch檔案,指向include/asm-arm/arch-s5pc110  

 

# create link for s3c24xx SoC
if [ "$3" = "s3c24xx" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

# create link for s3c64xx SoC
if [ "$3" = "s3c64xx" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

# create link for s5pc1xx SoC
if [ "$3" = "s5pc1xx" ] ; then
        rm -f regs.h
        ln -s $6.h regs.h
        rm -f asm-$2/arch
        ln -s arch-$3 asm-$2/arch
fi

# create link for s5pc11x SoC
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

# create link for s5p64xx SoC
if [ "$3" = "s5p64xx" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

# create link for s5p644x SoC
if [ "$3" = "s5p644x" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

    一系列與板子直接相關的判斷資訊,通過與傳入mkconfig的六個引數的比較,建立與自己板子相匹配的連結檔案。
    在本次分析裡:在include目錄下建立一個reg.h檔案,指向include/s5pc110.h檔案    

 

  並在include/asm-arm下建立一個arch檔案,指向include/asm-arm/arch-s5pc11x  (覆蓋了2中的符號連結)  
  

if [ "$2" = "arm" ] ; then
	rm -f asm-$2/proc
	ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi

  對$2進行判斷,然後在inlude目錄下建立了proc檔案,指向 include/asm-$2/procproc-armv   


    注:在將來的程式碼之中標頭檔案的包含將用到這些連結檔案。

  

  echo "ARCH   = $2" >  config.mk
    echo "CPU    = $3" >> config.mk
    echo "BOARD  = $4" >> config.mk


    在include目錄下建立了config.mk檔案。
    注:>:檢查目錄,如果檔案不存在則建立,然後在檔案內追加>之前的內容。
        >>:在檔案內的尾行追加>>之前的內容
 
    
  

 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


    簡單的判斷之後在include目錄下下建立一個<config/smdkc110onenand.h>檔案。                                              <config/smdkc110onenand.h>檔案是我們移植是最重要的檔案,
    涉及我們對開發板的巨集定義配置檔案。
    注:<config/smdkc110onenand.h>是針對smdkc110onenand板子的標頭檔案。
    這些<config/*****.h>檔案會被用來生成一個autoconfig.mk檔案,而這個生成的檔案會被主Makefile引用,指導整個編譯過程,這裡面的巨集定義會影響我們對uboot中大部分.c檔案的條件編譯的選擇,從而實現可移植性。

uboot的原始碼:

https://pan.baidu.com/s/1uoHGGgpQCMRa5kkagQOA8Q

提取碼:n0r4

END...............