LINUX-U-Boot簡介
1 U-Boot簡介
1.1 U-Boot
全稱Universal Boot Loader,是遵循GPL條款的開放源碼項目。從FADSROM、8xxROM、PPCBOOT逐步發展演化而來。其源碼目錄、編譯形式與Linux內核很相似,事實上,不少U-Boot源碼就是相應的Linux內核源程式的簡化,尤其是一些設備的驅動程式,這從U-Boot源碼的註釋中能體現這一點。但是U-Boot不僅僅支援嵌入式Linux系統的引導,當前,它還支援NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式作業系統。
其目前要支援的目標作業系統是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。這是U-Boot中Universal的一層含義,另外一層含義則是U-Boot除了支援PowerPC系列的處理器外,還能支援MIPS、x86、ARM、NIOS、XScale等諸多常用系列的處理器。這兩個特點正是U-Boot項目的開發目標,即支援儘可能多的嵌入式處理器和嵌入式作業系統。就目前來看,U-Boot對PowerPC系列處理器支援最為豐富,對Linux的支援最完善。其它系列的處理器和作業系統基本是在2002年11月PPCBOOT改名為U-Boot後逐步擴充的。從PPCBOOT向U-Boot的順利過渡,很大程度上歸功於U-Boot的維護人德國DENX軟體工程中心Wolfgang Denk[以下簡稱W.D]本人精湛專業水準和持著不懈的努力。當前,U-Boot項目正在他的領軍之下,眾多有志於開放源碼BOOT LOADER移植工作的嵌入式開發人員正如火如荼地將各個不同系列嵌入式處理器的移植工作不斷展開和深入,以支援更多的嵌入式作業系統的裝載與引導。
選擇U-Boot的理由︰
開放源碼;
支援多種嵌入式作業系統內核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
支援多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
較高的可靠性和穩定性;
較高的可靠性和穩定性;
高度靈活的功能設定,適合U-Boot調試、作業系統不同引導要求、產品發布等;
豐富的設備驅動源碼,如串口、以太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
較為豐富的開發調試文檔與強大的網路技術支援;
1.2 U-BOOT的特點
U-BOOT支援SCC/FEC以太網、OOTP/TFTP引導、IP和MAC的預置功能,這一點和其它BootLoader(如BLOB和RedBoot等)類似。
但U-BOOT還具有一些特有的功能。
線上讀寫Flash、DOC、IDE、IIC、EEROM、RTC,其它的BootLoader根本不支援IDE和DOC的線上讀寫。
支援串行口kermit和S-record下載代碼,U-BOOT本身的工具可以把ELF32格式的可執行檔案轉換成為 S-record格式,直接從串口下載並執行。
識別二進製、ELF32、uImage格式的Image,對Linux引導有特別的支援。U-BOOT對Linux 內核進一步封裝為uImage。封裝如下︰
#{CROSS_COMPILE}-objcopy -O binary -R.note -R.comment -S vmlinux \ linux.bin
#gzip -9 linux.bin
#tools/mkimage -A arm -O linux -T kernel -C gzip -a 0xc0008000 -e\
0xc0008000 -n “Linux-2.4.20” -d linux.bin.gz /tftpboot/uImage
即在Linux內核鏡像vmLinux前添加了一個特殊的頭,這個頭在include/image.h中定義,包括目標作業系統的種類(比如Linux,VxWorks等)、目標CPU的體系機構(比如ARM、PowerPC等)、映像檔案壓縮類型(比如gzip、bzip2等)、加載位址、入口位址、映像名稱和映像的生成時間。當系統引導時,U-BOOT會對這個檔案頭進行CRC校驗,如果正確,才會跳到內核執行。如下所示︰
WT-ARM9# bootm 0xc1000000
## Checking Image at 0xc100000 ...
Image Name: Linux-2.4.20
Created: 2004-07-02 22:10:11 UTC
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size: 550196 Bytes = 537 kB = 0 MB
Load Address: 0xc0008000
Entry Point: 0xc0008000
Verifying Checksum ... OK
Uncompressing Kernel Image ……… OK
單任務軟體營運環境。U-BOOT可以動態加載和營運獨立的應用程式,這些獨立的應用程式可以利用U-BOOT控制台的I/O函數、內存申請和中斷服務等。這些應用程式還可以在沒有作業系統的情況下營運,是測試硬體系統很好的工具。
監控(minitor)命令集︰讀寫I/O,內存,暫存器、內存、外設測試功能等
腳本語言支援(類似BASH腳本)。利用U-BOOT中的autoscr命令,可以在U-BOOT中營運“腳本”。首先在文本檔案中輸入需要執行的命令,然後用tools/mkimage封裝,然後下載到開發板上,用autoscr執行就可以了。
編輯如下的腳本example.script。
echo
echo Network Configuration:
echo ----------------------
echo Target:
printenv ipaddr hostname
echo
echo Server:
printenv serverip rootpath
echo
用tools/mkimage對腳本進行封裝。
# mkimage -A ARM -O linux -T script -C none -a 0 -e 0 -n "autoscr example script" -d example.script /tftpboot/example.img
Image Name: autoscr example script
Created: Wes Sep 8 01:15:02 2004
Image Type: ARM Linux Script (uncompressed)
Data Size: 157 Bytes = 0.15 kB = 0.00 MB
Load Address: 0x00000000
Entry Point: 0x00000000
Contents:
Image 0: 149 Bytes = 0 kB = 0 MB
在U-BOOT中加載並執行這個腳本。
WT-ARM9# tftp 100000 /tftpboot/example.img
ARP broadcast 1
TFTP from server 10.0.0.2; our IP address is 10.0.0.99
Filename ’/tftpboot/TQM860L/example.img’.
Load address: 0x100000
Loading: #
done
Bytes transferred = 221 (dd hex)
WT-ARM9# autoscr 100000
## Executing script at 00100000
Network Configuration:
----------------------
Target:
ipaddr=10.0.0.99
hostname=arm
Server:
serverip=10.0.0.2
rootpath=/nfsroot
WT-ARM9#
支援WatchDog、LCD logo和狀態指示功能等。如果系統支援splash screen,U-BOOT啟動時,會把這個圖像顯示到LCD上,給用戶更友好的感覺。
支援MTD和檔案系統。U-BOOT作為一種強大的BootLoader,它不僅支援MTD,而且可以在MTD基礎上實現多種檔案系統,比如cramfs、fat和jffs2等。
支援中斷。由於道統的BootLoader都分為stage1和stage2,所以在stage2中添加中斷處理服務十分困難,比如BLOB;而U-BOOT是把兩個部分放到了一起,所以添加中斷服務程式就很方便。
詳細的開發文檔。由於大多數BootLoader都是開源項目,所以文檔都不是很充分。U-BOOT的維護人員意識到了這個問題,充分記錄了開發文檔,所以它的移植要比BLOB等缺少文檔的BootLoader方便。
2 U-Boot主要目錄架構
- board 目標板相關檔案,主要包含SDRAM、FLASH驅動;
- common 獨立於處理器體系架構的通用代碼,如內存大小探測與故障檢測;
- cpu 與處理器相關的檔案。如mpc8xx次目錄下含串口、網口、LCD驅動及中斷初始化等檔案;
- driver 通用設備驅動,如CFI FLASH驅動(目前對INTEL FLASH支援較好)
- doc U-Boot的說明文檔;
- examples可在U-Boot下營運的示例程式;如hello_world.c,timer.c;
- include U-Boot頭檔案;尤其configs次目錄下與目標板相關的配置頭檔案是移植過程中經常要修改的檔案;
- lib_xxx 處理器體系相關的檔案,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系架構相關的檔案;
- net 與網路功能相關的檔案目錄,如bootp,nfs,tftp;
- post 上電自檢檔案目錄。尚有待於進一步完善;
- rtc RTC驅動程式;
- tools 用於創建U-Boot S-RECORD和BIN鏡像檔案的工具;
U-Boot可支援的主要功能清單
系統引導 支援NFS掛載、RAMDISK(壓縮或非壓縮)形式的根檔案系統
支援NFS掛載、從FLASH中引導壓縮或非壓縮系統內核;
基本輔助功能 強大的作業系統界面功能;可靈活設定、傳遞多個關鍵參數給作業系統,適合系統在不同開發階段的調試要求與產品發布,尤對Linux支援最為強勁;
支援目標板環境參數多種存儲模式,如FLASH、NVRAM、EEPROM;
CRC32校驗,可校驗FLASH中內核、RAMDISK鏡像檔案是否完好;
設備驅動 串口、SDRAM、FLASH、以太網、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅動支援;
上電自檢功能 SDRAM、FLASH大小自動檢測;SDRAM故障檢測;CPU型號;
1.U-Boot Versioning
2.U-boot:
Das U-Boot(The Universal Boot Loader), 最早是由 Magnus Damm 在 2000 年時加入sourceforge 的一個 open source project: PPCBoot 所開始的, 在 2002 年的時候這個project 支援了 4 個 ARM 的 processor, 因此改名為 Das U-Boot, 目前的 project leader 為Wolfgang Denk
U-BOOT源代碼目錄架構
-
board 和一些已有開發板有關的檔案,比如Makefile和u-boot.lds等都和具體開發板的硬體和位址分發有關。
-
common 與體系架構無關的檔案,實現各種命令的C檔案
-
cpu CPU相關檔案,其中的次目錄都是以U-BOOT所支援的CPU為名,比如有次目錄arm926ejs、mips、mpc8260和nios等,每個特定的次目錄中都包括cpu.c和interrupt.c,start.S。其中cpu.c初始化CPU、設定指令Cache和數據Cache等
- 74xx_7xx Files specific to Freescale MPC74xx and 7xx CPUs
- arm720t Files specific to ARM 720 CPUs
- arm920t Files specific to ARM 920 CPUs
- at91rm9200 Files specific to Atmel AT91RM9200 CPU
- imx Files specific to Freescale MC9328 i.MX CPUs
- s3c24x0 Files specific to Samsung S3C24X0 CPUs
- arm925t Files specific to ARM 925 CPUs
- arm926ejs Files specific to ARM 926 CPUs
- arm1136 Files specific to ARM 1136 CPUs
- i386 Files specific to i386 CPUs
- ixp Files specific to Intel XScale IXP CPUs
- mcf52x2 Files specific to Freescale ColdFire MCF52x2 CPUs
- mips Files specific to MIPS CPUs
- mpc5xx Files specific to Freescale MPC5xx CPUs
- mpc5xxx Files specific to Freescale MPC5xxx CPUs
- mpc8xx Files specific to Freescale MPC8xx CPUs
- mpc8220 Files specific to Freescale MPC8220 CPUs
- mpc824x Files specific to Freescale MPC824x CPUs
- mpc8260 Files specific to Freescale MPC8260 CPUs
- mpc85xx Files specific to Freescale MPC85xx CPUs
- nios Files specific to Altera NIOS CPUs
- nios2 Files specific to Altera Nios-II CPUs
- ppc4xx Files specific to AMCC PowerPC 4xx CPUs
- pxa Files specific to Intel XScale PXA CPUs
- s3c44b0 Files specific to Samsung S3C44B0 CPUs
- sa1100 Files specific to Intel StrongARM SA1100 CPUs
-
disk disk驅動的分區處理代碼
-
doc 文檔
-
drivers 通用設備驅動程式,比如各種網卡、支援CFI的Flash、串口和USB匯流排等。
-
dtt Digital Thermometer and Thermostat drivers
-
examples Example code for standalone applications, etc.
-
include 頭檔案,還有對各種硬體平台支援的彙編檔案,系統的配置檔案和對檔案系統支援的檔案。
-
lib_arm 與ARM體系架構相關的代碼。
-
lib_generic Files generic to all architectures
-
lib_i386 Files generic to i386 architecture
-
lib_m68k Files generic to m68k architecture
-
lib_mips Files generic to MIPS architecture
-
lib_nios Files generic to NIOS architecture
-
lib_ppc Files generic to PowerPC architecture
-
net 與網路有關的代碼,BOOTP協議、TFTP協議、RARP協議和NFS檔案系統的實現。
-
post Power On Self Test
-
rtc Real Time Clock drivers
-
tools 創建S-Record格式檔案 和U-BOOT images的工具。
3. u-boot 的體系架構
1) 總體架構
u-boot 是一個層次式架構。做移植工作的軟體人員應當提供串口驅動(UART Driver),以太網驅動(Ethernet Driver),Flash 驅動(Flash 驅動),USB 驅動(USB Driver)。目前,透過USB 口下載程式顯得不是十分必要,所以暫時沒有移植USB 驅動。驅動層之上是u-boot 的應用,command 透過串口提供人機界面。我們可以使用一些命令做一些常用的工作,比如內存檢視命令md。
Kermit 應用主要用來支援使用串口透過超級終端下載應用程式。TFTP 則是透過網路模式來下載應用程式,例如uclinux 作業系統。
2) 內存分佈
在flash rom 中內存分佈圖ev44b0ii 的flash 大小2M(8bits),現下將0-40000 共256k 作為u-boot 的存儲空間。由於u-boot 中有一些環境變量,例如ip 位址,引導檔案名等,可在命令行透過setenv 配置好,透過saveenv 儲存在40000-50000(共64k)這段空間裡。如果存在儲存好的環境變量,u-boot 引導將直接使用這些環境變量。正如從代碼分析中可以看到,我們會把flash 引導代碼搬移到DRAM 中營運。下圖給出u-boot 的代碼在DRAM中的位置。引導代碼u-boot 將從0x0000 0000 處搬移到0x0C700000 處。特別注意的由於ev44b0ii uclinux 中斷向量程式位址在0x0c00 0000 處,所以不能將程式下載到0x0c00 0000 出,通常下載到0x0c08 0000 處。
4.u-boot系統啟動流程
1.start.s 結構
1) 定義入口
一個可執行的Image 必須有一個入口點並且只能有一個唯一的全域入口,通常這個入口放在Rom(flash)的0x0 位址。例如start.S 中的
.globl _start
_start: b reset
值得注意的是你必須告訴編譯器知道這個入口,這個工作主要是修改連接器腳本檔案(lds)。2) 設定異常向量(Exception Vector)異常向量表,也可稱為中斷向量表,必須是從0 位址開始,連續的存放。如下面的就包括了複位(reset),未定義處理(undef),軟體中斷(SWI),預去指令錯誤(Pabort),數據錯誤(Dabort),保留,以及IRQ,FIQ 等。
_start:
b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
3) 初始化CPU 相關的pll,clock,中斷控制暫存器依次為關閉watch dog timer,關閉中斷,設定LockTime,PLL(phase lock loop),以及clock。
4) 初始化記憶體控制單元5) 將rom 中的程式複製到RAM 中首先利用PC 取得bootloader 在flash 的起始位址,再透過標號之差計算出這個程式代
碼的大小。這些標號,編譯器會在連接(link)的時候生成正確的分佈的值。取得正
確訊息後,透過暫存器(r3 到r10)做為複製的中間媒介,將代碼複製到RAM 中。
6) 初始化堆疊進入各種模式設定相應模式的堆疊。
7) 轉到RAM 中執行
使用指令ldr,pc,RAM 中C 函數位址就可以轉到RAM 中去執行。2.2 stage2 C語言代碼部分
lib_arm/board.c 中的start armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數主要完成如下操作︰
1)調用一系列的初始化函數。
2)初始化Flash設備。
3)初始化系統內存分發函數。
4)如果目標系統擁有NAND設備,則初始化NAND設備。
5)如果目標系統有顯示設備,則初始化該類設備。
6)初始化相關網路設備,填寫IP、MAC位址等。
7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然後進行相應的工作。5.Add A New BSP To U-Boot5.1.U-Boot Software ConfigurationThere are two classes of configuration variables:
Configuration _OPTIONS_:
These are selectable by the user and have names beginning with "CONFIG_".
Configuration _SETTINGS_:
These depend on the hardware etc. and should not be meddled with if you don't know what you're doing; they have names beginning with "CFG_".
5.2.
Method 1:
Create a new BSP
Method 2:
Clone an existing BSP
Method 3:
Modify an existing BSP找出U-Boot的Entry Point
觀察linker script file (*.lds)
使用arm-linux-objdump來看反組譯
5.3.與移植相關的主要檔案夾有︰
1)CPU 它的每個子檔案夾裡都有如下檔案︰
makefile
config.mk
cpu.c 處理器相關的代碼
interrupts.c 中斷處理代碼
serial.c 串口初始化代碼
start.s 全局開始啟動代碼
2)BOARD 它的每個子檔案夾裡都有如下檔案︰
makefile
config.mk
smdk2410.c 板子相關的代碼(以smdk2410為例)
flash.c Flash操作代碼
memsetup.s 初始化SDRAM代碼
u-boot.lad 對應的連接檔案
3) lib_arm 體系架構下的相關實現代碼,比如memcpy等的組合語言的優化實現。
5.4.以FIC8120為例
1.board
新增 /board/evb8120 目錄 -參考 smdk2410 內檔案修改
/board/evb8120/Makefile 修改OBJ 檔案
/board/evb8120/config.mk 修改TEXT_BASE
/board/evb8120/evb8120.c 修改board_init() dram_init()等函式
/board/evb8120/flash.c 修改flash_init() write_buff()等函式
/board/evb8120/lowlevel_init.s 記憶體參數配置
/board/evb8120/bootflah.c 將flash.c 的 flash_print_info() flash_erase() flash_get_size() write_hword()移過來修改 並新增一些函式
2.makefile
/Makefile 新增 evb8120_config 選項設定
3./include/configs
/include/configs/evb8120.h 參考 smdk2410.h內檔案修改
4.新增soc
/cpu/arm920t/makefile 沒改
/cpu/arm920t/config.mk
/cpu/arm920t/cpu.c 沒改
/cpu/arm920t/interrupts.c 沒改
/cpu/arm920t/start.s 程式入口
參考 s3c24x0內檔案 改成fic8120
/cpu/arm920t/fic8120/serial.c 串列配置
/cpu/arm920t/fic8120/i2c.c
/cpu/arm920t/fic8120/interrupts.c
/cpu/arm920t/fic8120/speed.c
/include/fic8120.h fic8120 暫存器設定檔
/driver/ftmac100.c 新增 FIC8120 Ethernet
/driver/ftmac100.h
/driver/Makefile 將OBJS加上 ftmac100.o
Build
Require file:
u-boot-1.1.4.tar.bz2
patch-u-boot-1.1.4-sq620db.bz2
Toolchain:
arm-linux-toolchain
Build-flow:
1. Unpack the source code
[root@localhost root]# tar –jxvf u-boot-1.1.4.tar.bz2
2. Patch source code
[root@localhost root]# cd u-boot-1.1.4
[root@localhost u-boot-1.1.4]# bzcat ../patch-u-boot-1.1.4-sq620db.bz2 | patch –p1
3. Configuration u-boot for your target board
[root@localhost u-boot-1.1.4]#
make evb8120_config 4.Build u-boot to binary file
[root@localhost u-boot-1.1.4]# make
5. Finish
[root@localhost u-boot-1.1.4]# ls u-boot.bin