1. 程式人生 > >【Tiny4412】從0移植uboot (一) _配置分析

【Tiny4412】從0移植uboot (一) _配置分析

前段時間自己移植了tiny4412的uboot,只瞭解了一個大概的配置過程,下文是Linux社群大神詳細的分析。
甚好,收藏之。
原文連結在文末!!!

和絕大多數原始碼編譯安裝一樣,uboot的編譯流程也類似於“make config->make->make install”三步,只是由於uboot本身是針對多種平臺的bootloader,軟體的複雜性和通用型決定了編譯uboot需要自行填補很多坑。本文主要討論的就是移植uboot-2013.01的第一個坑——uboot分析。

配置編譯環境

既然要編譯uboot,首先就要有相應的編譯器,我的目標板是三星的exynos4412,就是一個ARM核的SoC,這意味著兩件事,第一,我編譯的時候必須寫明“export ARCH=arm”

來表明我要編譯的目標平臺。第二,必須選擇合適的開發工具,由於各種uboot各種linux都是對編譯器比較敏感的,所以強烈建議使用tar來安裝交叉編譯器而不是apt,這樣可以防止多個編譯工具的衝突,這裡,uboot作為裸板程式,我用的是arm-none-linux-guneabi-xxx的編譯器,所以用來編譯的指令碼加了下面兩句:

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”的時候就可以找到相應的檔案了。

致敬社群大神: 轉載出處
部落格園: 系列原文