u boot的配置過程

2021-06-17 20:19:12 字數 4657 閱讀 9397

1.頂層makefile

這裡我們將以smdk2410為例來介紹,uboot是u-boot-2009.03,首先我們應該開啟u-boot的頂層makefile,這裡按照人的思維來說,我們應該首先去看看smdk2410的配置項:

smdk2410_config:

2830 smdk2410_config :       unconfig

2831         @$(mkconfig) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

關注2831行,了解makefile語法的朋友一定對$(@:_config=)在做什麼很了解,其實它就是將$@即目標 smdk2410_config的後面的_config替換成空,所以結果就是'smdk2410',另外我們在搜尋一下makefile,就可以找到下面的語句:

106 srctree         := $(curdir)

...111 mkconfig        := $(srctree)/mkconfig

112 export mkconfig

很明顯@$(mkconfig)就是當前目錄下面的mkconfig。所以執行上面的2831行其實就是執行./mkconfig smdk2410 arm arm920t smdk2410 samsung s3c24x0 ,ok到了這一步我們就應該去看看mkconfig。

2.mkconfig

開啟mkconfig,整個指令碼很短,只有88行。

a.   我們應該先看看最上面的注釋:

3 # script to create header files and links to configure

4 # u-boot for a specific board.

5 #6 # parameters:  target  architecture  cpu  board [vendor] [soc]

3,4行告訴你這個指令碼的作用,6行介紹了它的引數的含義。

b. 接下來,獲得board_name:

12 board_name=""   # name to print in make output

13 14 while [ $# -gt 0 ] ; do

15         case "$1" in

16         --) shift ; break ;;

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

19         *)  break ;;

20         esac

21 done

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

24 25 [ $# -lt 4 ] && exit 1

26 [ $# -gt 6 ] && exit 1

27 28 echo "configuring for $ board..."

14行,判斷引數的個數($#)是否大於零,之後判斷$1中有沒有-,有的話就左移乙個位置,沒有就出來,很明顯引數中沒有帶-的,那麼就會執行到23行,&&相當於「if...then...」,而||相當於「if not...then...」,所以這裡就表示如果 board_name為空,就使 board_name=$1,即 board_name為'smdk2410'.  25, 26行判斷引數的個數必須為5,不然就退出。

c. 建立到平台,開發板相關的標頭檔案的鏈結

30 #

31 # create link to architecture specific headers

32 #

33 if [ "$srctree" != "$objtree" ] ; then

34         mkdir -p $/include

35         mkdir -p $/include2

36         cd $/include2

37         rm -f asm

38         ln -s $/include/asm-$2 asm

39         lnprefix="../../include2/asm/"

40         cd ../include

41         rm -rf asm-$2

42         rm -f asm

43         mkdir asm-$2

44         ln -s asm-$2 asm

45 else

46         cd ./include

47         rm -f asm

48         ln -s asm-$2 asm

49 fi

50 51 rm -f asm-$2/arch

52 53 if [ -z "$6" -o "$6" = "null" ] ; then

54         ln -s $arch-$3 asm-$2/arch

55 else

56         ln -s $arch-$6 asm-$2/arch

57 fi

58 59 if [ "$2" = "arm" ] ; then

60         rm -f asm-$2/proc

61         ln -s $proc-armv asm-$2/proc

62 fi

33行判斷原始碼目錄跟目標檔案目錄是否一致,不一致的話就在目標檔案目錄建立相關的檔案和鏈結,這樣可以使原始碼目錄保持乾淨,不過我們一般都是直接在原始碼目錄進行編譯的,所以這裡執行的是 else後面的語句,46-48行,進入./include中,刪除掉原來的asm目錄,因為可能你之前就已經編譯過了,然後再次建立asm,並讓它鏈結到asm-$2,這裡是連線到asm-arm。 

之後51行刪除到asm-$2下面的arch,53行因為$6為s3c24x0,不為空也不為null,所以將會執行56行,而 lnprefix為空,所以這句實際上執行的是「ln -s arch-$6 asm-$2/arch」,也就是建立asm-arm/arch ,並將其鏈結到arch-s3c24x0。

59-61行,如果$2=arm的話,重新建立一下asm-arm/proc目錄,並將它鏈結到 proc-armv。

d. 之後建立頂層makefile包含的檔案include/config.mk

64 #

65 # create include file for make

66 #

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

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

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

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

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

這幾句很簡單,就是建立config.mk,請注意,之前46行我們就已經在include目錄下面了,因此這幾行執行完成後,config.mk的內容就應該是下面的樣子:

arch            =     arm

cpu               =     arm920t

board          =     smdk2410

vendor       =     samsung

soc                     =     s3c24x0

e.  最後就開始建立include/config.h:

75 #

76 # create board specific header file

77 #

79 then

80         echo >> config.h

81 else

82         > config.h              # create new config file

83 fi

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

85 echo "#include " >>config.h

86 echo "#include " >>config.h

87 88 exit 0

到這裡這個mkconfig檔案就完了,這裡我稍微小結一下這個檔案所做的工作,不然頭會有點暈:

(1).   board_name='smdk2410'

(2).   ln -s asm-arm asm

ln -s arch-s3c24x0 asm-arm/arch

ln -s proc-armv asm-arm/proc

(3).   建立include/config.mk

(4).   建立include/config.h

到了這裡我們就已經可以算是配置完成了,為什麼了?請注意最後生成的include/config.h之中包含了兩個標頭檔案,對於2410來說的這兩個標頭檔案就是config/smdk2410.h,以及asm/config.h(asm-arm/config.h), 如果你開啟這兩個檔案就會發現很多config_的巨集定義(當然 asm-arm/config.h沒有定義任何東西,但是在其他平台的這個檔案中就有一些巨集定義了)。

uboot配置過程詳解

當我們在編譯uboot的時候,要分為兩個階段,乙個階段是配置,配置用的命令是make x210 sd config。配置完成後開始正式的編譯,命令為make,當然,編譯命令可以加什麼的引數,比如多執行緒編譯 make j4,比如靜默編譯 make s等。在這一篇文章中,我將單獨詳細分析uboot的配...

uboot學習 配置過程分析

一 uboot的功能分析 結合uboot 1.1.16版本說明uboot的配置過程。二 uboot的配置 編譯和鏈結過程分析 結合頂層makefile 編譯乙個可用的uboot.bin檔案一般經過以下步驟 首先是配置,make smdk2410 config,然後是make all完成編譯,最後生成...

uboot配置過程詳解1

1 mkconfig指令碼的6個引數 config arm s5pc11x x210 samsung s5pc110 指的是目標 x210 sd config裡的 config部分用空替換,得到 x210 sd,這就是第乙個引數,所以 1 x210 sd 2 arm 3 s5pc11x 4 sams...