U-Boot本身支持很多開發板,在其源代碼中,每個板子都對應一個board/目錄下的文件夾(筆者注:這並不確切,因爲有的文件夾是供應商名稱,下面可以有多個目標板目錄,這裏只考慮最簡單的情況),以及include/configs/目錄下的目標板配置頭文件。因此,要添加U-Boot對我們的目標板的支持,首先就是要建立目標板文件夾和配置頭文件,並修改相關的Makefile。
下面以實例說明爲U-Boot添加新的目標板定義的步驟和過程。
(1)在board/目錄下建立目標板目錄。
筆者的目標板是XSBASE270,處理器是PXA270。由於U-Boot中本身支持很多開發板和處理器,可以從中找出與自己處理器型號相同或相近的開發板,在此基礎上再做後續修改。
adsvix使用的也是PXA27x處理器,因此可以把它作爲模板。
-
cd board/
cp -arv adsvix xsbase270
mv xsbase270/adsvix.c xsbase270/xsbase270.c
(2)在include/configs/目錄下建立目標板配置頭文件。
-
cd include/configs/
cp adsvix.h xsbase270.h
(3)修改Makefile。
一是要在總的Makefile(U-Boot源碼頂層目錄下)中加入目標板的編譯配置選項,這也可以參考adsvix的進行修改,只要把目標板名稱改換爲xsbase270即可:
-
adsvix_config: unconfig
@$(MKCONFIG) $(@:_config=) arm pxa adsvix
xsbase270_config: unconfig
@$(MKCONFIG) $(@:_config=) arm pxa xsbase270
這裏xsbase270與board/目錄下目標板文件夾名稱xsbase270一致。
另外,還需要注意,該Makefile中定義了CROSS_COMPILE的值,以在交叉編譯時指定交叉編譯器。缺省情況下對ARM的CROSS_COMPILE定義如下:
-
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
endif
即定義交叉編譯器名的前綴爲arm-linux-,如果您使用的toolchain的名字不同,則需要作相應修改。例如筆者使用的是arm-iwmmxt-linux-gnueabi-gcc,因此要將上面改爲:CROSS_COMPILE = arm-iwmmxt-linux-gnueabi- 。
二是要修改board/xsbase270下的Makefile。
-
#COBJS := adsvix.o pcmcia.o
COBJS := xsbase270.o pcmcia.o
這是因爲前面將該目錄下的源文件adsvix.c改爲了xsbase270.c。
至此,將新的目標板xsbase270的定義添加到U-Boot中的工作就算完成了。下面的命令可以編譯得到xsbase270的U-Boot:
-
# assuming you are at the top directory of u-boot
# define a build directory to keep object files during make process and also finally u-boot image
export BUILD_DIR=~/u-boot_xsbase270/build/
make xsbase270_config
# if you edit your source file and want to make again, just type “make distclean”and then call the above commands again.
make
當然,要使編譯出來的這個u-boot能真正適用於我們的目標板,還有很多工作要做,包括處理器工作狀態、存儲器映射設置、網卡驅動的移植等等。所以,本篇的標題只是在U-Boot中添加對新目標板的“定義”,而非對新目標板的“支持”,這些工作需要對U-Boot的源代碼有整體的認識,並結合自己的目標板的特性來完成。後續的篇章將繼續介紹後面的內容。
作爲本篇的補充內容,您也許仍有必要了解以下要點:
(1) 在MAKEALL文件中可以將新的目標板xsbase270添加到下面的list中:
-
#########################################################
## Xscale Systems
#########################################################
LIST_pxa=" \
adsvix \
cerf250 \
cradle \
csb226 \
delta \
innokom \
lubbock \
pleb2 \
pxa255_idp \
wepep250 \
xaeniax \
xm250 \
xsengine \
zylonite \
"
這並不是必須的,因爲MAKEALL文件只用於爲其中的所有目標板都編譯一個u-boot時使用。
(2) 如何在U-Boot已有的目標板中找到與自己的目標板相近的目標板?
首要的是要找到與自己的目標板所用的處理器相同或統一系列的的目標板。在頂層目錄下的Makefile中有各個板子的config列表,例如XScale系列的板子列表如下:
-
#########################################################
## XScale Systems
#########################################################
adsvix_config : unconfig
@$(MKCONFIG) $(@:_config=) arm pxa adsvix
xsbase270_config: unconfig
@$(MKCONFIG) $(@:_config=) arm pxa xsbase270
cerf250_config : unconfig
@$(MKCONFIG) $(@:_config=) arm pxa cerf250
cradle_config : unconfig
@$(MKCONFIG) $(@:_config=) arm pxa cradle
csb226_config : unconfig
@$(MKCONFIG) $(@:_config=) arm pxa csb226
delta_config :
@$(MKCONFIG) $(@:_config=) arm pxa delta
# ..... 以下省略。
(3) 修改目標板的編譯優化選項。
在cpu/pxa/config.mk文件中定義了目標板的編譯優化選項PLATFORM_RELFLAGS和
PLATFORM_CPPFLAGS,您可以根據自己的需要進行修改。
筆者的交叉編譯器arm-iwmmxt-linux-gnueabi-gcc默認有-march=iwmmxt,遵循新的ARM EABI標準,但仍要保留PLATFORM_CPPFLAGS中的“-mapcs-32,-mabi=apcs-gnu”選項,使用舊的ABI標準來編譯,因爲u-boot的彙編代碼並非按照新的ABI規範編寫。可使用-march=armv5te來避免”warning: target CPU does not support interworking”警告。
如果編譯過程中出現了關於IDE方面的錯誤,應修改include/configs/xsbase270.h,註釋掉”#define CONFIG_CMD_IDE”這一行,以禁止編譯IDE的操作命令,因爲在目標板啓動階段不需要對IDE接口進行其他操作。