從0移植uboot (一) _配置分析
來源:Linux社區 作者:xiaojiang1025 :http://www.linuxidc.com/Linux/2017-02/141018.htm
和絕大多數源碼編譯安裝一樣,uboot的編譯流程也類似於"make config->make->make install"**三步,只是由於uboot本身是針對多種平臺的bootloader,軟件的復雜性和通用型決定了編譯uboot需要自行填補很多坑。本文主要討論的就是移植uboot-2013.01的第一個坑——uboot分析。
配置編譯環境
既然要編譯uboot,首先就要有相應的編譯器,我的目標板是三星的exynos4412,就是一個ARM核的SoC,這意味著兩件事,第一,我編譯的時候必須寫明"export ARCH=arm"
export ARCH=arm
export CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-
...
config的流程
uboot的頂層配置主要依靠下面的這棵樹
.
├── Makefile
├── mkconfig
├── include
│ ├── config.mk
│ └── config.h
└── boards.cfg
uboot的配置就是通過鍵入相應的命令將相應的Makfile變量賦值,通過你的配置,Makefile相應的變量就知道編譯哪個平臺下的哪個cpu的哪個版本的開發板。註意:不同版本的uboot的配置命令可能是不同的,拿到源碼包看README是個很好的習慣,比如uboot-2013-01的配置命令是下面這個樣子的,但uboot-2016.10的配置命令就不是這個,感興趣的可以查一下。:
在uboot-2013-01中,頂層目錄下的boards.cfs文件中查看它支持的開發板和相應的信息,這個文件就像一個全局的"字典",後續的編譯過程需要根據配置名檢索到相應的信息,所以不要隨意修改。下面這個就是字典的樣子
了解了這些,手癢的話就可以先執行下面的腳本試一下,但是並不會生成真正適配我們板子的uboot,只是適配參考板
#!/bin/bash
export ARCH=arm
export CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-
make origen_config
make all
config的分析
首先,當我們"make origen_config"的時候,顯然是打算創建makefile裏面的一個叫origen_config的目標。根據Makefile的語法,我們就可以找到下面這一段(然而並不是想象中的origen_config:)
Makefile
--770-->unconfig目標的作用是刪除所有由於配置產生的文件
--775-->%是Makefile中的通配符,表示任意字符串,所以我們的origen_config
就會與之相匹配,這個目標的依賴於unconfig
,即每次config之前都會刪除之前的配置。如果你鍵入兩次"make xxx_config",那麽它最終只會形成一個相應的配置文件,這種寫法值得借鑒
--776-->"MKCONFIG"就是頂層目錄下的mkconfig腳本,而"$(@:_config=)"
就是去除目標中的"_config"串,所以實際上就是去到頂層目錄下執行"$mkconfig -A origen"。
我們去到這個mkconfig看看它都做了什麽
mkconfig
--22-->我們傳入的參數會導致腳本執行這個if裏面的內容
--23-31-->用擴展正則表達式去頂層目錄下的boads.cfg文件中提取含有origen
相應的行到line
變量中,並把line設置為新的參數列表。取得了這個參數字符串,mkconfig就可以把相應的頭文件,鏈接和全局變量準備好。
我們來稍微看點細節,首先,line裏應該有的內容是我們在Boards.cfg中搜到的這個:
根據boards.cfg,這幾個參數分別是:TARGET,ARCH,CPU,Board name,Vendor,SoC,Options(origen只有6個,加上之前的$1
一共7個參數),So執行的代碼是:
從中可以看出,這段代碼就是把之前line的內容分段並賦值給開頭的arch、cpu、board等變量,顯然,這些變量對於我們找到相應的目錄,相應的文件進行編譯至關重要。這些信息,會在mkconfig的之後寫入到相應的文件中:
此外,還要建立一些硬鏈接:
至此,我們需要的"include/config.mk"就配置完成了,這個文件是長成這個樣子的:
除了生成"include/config.mk",mkconfig還負責生成"include/config.h"文件,不過有了之前準備好的變量,這部分只不過是將上面的變量和相應的文件夾進行了初步的定位,代碼就是下面這部分:
它生成的"include/config.h"最終是長成這個樣子的:
有了這兩個文件,當我們再執行"$make"的時候就可以找到相應的文件了。
從0移植uboot (一) _配置分析