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