簡單介紹一下uboot的基本配置流程。和絕大多數(shù)源碼編譯安裝一樣,uboot在執(zhí)行make之前需要執(zhí)行make XXXconfig來配置相關(guān)信息,而且uboot本身是針對多種平臺的bootloader,所以編譯的過程也會有一點(diǎn)小麻煩,需要對它的源碼結(jié)構(gòu)有一點(diǎn)了解。移植uboot,大體上的流程是:配置uboot->編譯->配置相關(guān)平臺的啟動程序->燒錄
選平臺&工具鏈
平臺就是CPU的架構(gòu),即exynos4412的平臺就是arm,所以ARCH=arm,交叉編譯工具鏈我這里用的是arm-none-linux-gnueabi-,因?yàn)槲业碾娔X中有很多工具鏈,而很多工具鏈的工具名字還有所重疊,所以最好只有一個是apt-get安裝的,其他的都通過tar包安裝,這樣可以避免多個工具鏈都去修改環(huán)境變量,一旦我用的工具在多個工具鏈中都存在,就很可能導(dǎo)致我實(shí)際用的工具不是我想用的,因?yàn)橄到y(tǒng)會匹配它第一個在PATH中尋找到的工具。解決這個問題的一個方法就是每次使用工具的時候都指定相應(yīng)的路徑,比如我這里就應(yīng)該是CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-,如果覺得每次都要修改uboot的頂層Makefile或者傳入這么長的一個變量很麻煩,可以寫一個shell腳本。我這里就使用shell腳本的方式配置相應(yīng)的環(huán)境變量
export ARCH=armexport CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-。。。
配置流程
uboot的頂層配置主要依靠下面的這棵樹
.├── Makefile├── mkconfig├── include │? ? ├── config.mk │?? └── config.h └── boards.cfg
uboot的配置就是通過鍵入相應(yīng)的命令將相應(yīng)的Makfile變量賦值,通過你的配置,Makefile相應(yīng)的變量就知道編譯哪個平臺下的哪個cpu的哪個版本的開發(fā)板。通過頂層的README我們可以看到:
注意:不同版本的uboot的配置命令可能是不同的,拿到源碼包看README是個很好的習(xí)慣,比如uboot-2016-07的配置命令是這個樣子的:
在uboot-2013-01中,我們?nèi)サ巾攲幽夸浵碌腷oards.cfs文件中查看它支持的開發(fā)板和相應(yīng)的信息,需要注意的是這個文件可不是README,后續(xù)的編譯過程需要讀取文件中的信息,所以不要隨意修改,同理,如果我們需要配置我們自己的開發(fā)板,也就需要對其中的信息進(jìn)行相應(yīng)的修改
了解了這些,手癢的話就可以先執(zhí)行下面的腳本試一下,但是并不會生成真正適配我們板子的uboot,只是適配參考板
#!/bin/bashexport ARCH=armexport CROSS_COMPILE=/opt/arm-cross-compile/arm-none-linux-gnueabi-2014-05/bin/arm-none-linux-gnueabi-make origen_config make all
編譯流程簡析
首先,當(dāng)我們鍵入make origen_config的時候,顯然是打算創(chuàng)建makefile里面的一個叫origen_config的目標(biāo)。根據(jù)Makefile的語法,我們就可以找到下面這一段(然而并不是想象中的origen_config:)
根據(jù)Makefile語法,%是Makefile中的通配符,表示任意字符串,所以我們的origen_config就會與之相匹配,這個目標(biāo)的依賴于unconfig,就是說如果你鍵入兩次make origen_config,那么它最終只會形成一個相應(yīng)的配置文件,這種寫法在Makefile中很常見,可以學(xué)習(xí)。這個目標(biāo)的生成方法是執(zhí)行$(MKCONFIG) -A $(@:_config=),查看Makefile開頭可以知道這個MKCONFIG就是頂層目錄下的mkconfig腳本,而$(@:_config=)就是去除目標(biāo)中的_config串,所以實(shí)際上就是去到頂層目錄下執(zhí)行$mkconfig -A origen這個命令。我們?nèi)ダ锩婵纯此甲隽耸裁?br>
一上來我們就知道,我們傳入的參數(shù)會導(dǎo)致腳本執(zhí)行這個if里面的內(nèi)容,即使用擴(kuò)展正則表達(dá)式去頂層目錄下的boads.cfg文件中提取含有origen相應(yīng)的行到line變量中,并把line設(shè)置為新的參數(shù)列表。取得了這個參數(shù)字符串,mkconfig就可以把相應(yīng)的頭文件,鏈接和全局變量準(zhǔn)備好,我們來稍微看點(diǎn)細(xì)節(jié),首先,line里應(yīng)該有的內(nèi)容是我們在Boards.cfg中搜到的這個:
根據(jù)boards.cfg,這幾個參數(shù)分別是:TARGET,ARCH,CPU,Board name,Vendor,SoC,Options(origen只有6個,加上之前的$1一共7個參數(shù)),So執(zhí)行的代碼是:
從中可以看出,這段代碼就是把之前l(fā)ine的內(nèi)容分段并賦值給開頭的arch``cpu``board等變量,顯然,這些變量對于我們找到相應(yīng)的目錄,相應(yīng)的文件進(jìn)行編譯至關(guān)重要。這些信息,會在mkconfig的之后寫入到相應(yīng)的文件中:
此外,還要建立一些硬鏈接:
至此,我們需要的include/config.mk就配置完成了,這個文件是長成這個樣子的:
除了生成include/config.mk,mkconfig還負(fù)責(zé)生成include/config.h文件,不過有了之前準(zhǔn)備好的變量,這部分只不過是將上面的變量和相應(yīng)的文件夾進(jìn)行了初步的定位,代碼就是下面這部分:
它生成的include/config.h最終是長成這個樣子的:
有了這兩個文件,當(dāng)我們再執(zhí)行make的時候就可以找到相應(yīng)的文件了。
評論
查看更多