午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

UBOOT和bootloader的關(guān)系

 cuibaofeng 2015-12-13
  uboot是一個(gè)通用的免費(fèi)開放源碼的boot程序,支持很多的處理器。
以下是現(xiàn)在網(wǎng)上下載一個(gè)u-boot-1.1.1版本,用于at91rm9200系統(tǒng)的修改的例子。最后在redhat8.0上,用gcc2.95編譯通過。
在網(wǎng)上下載了uboot-1.1.1版本。要用于自己的at91rm9200的系統(tǒng),這個(gè)系統(tǒng)的情況是:
SDRAM: 32Mbytes NCS1
FLASH: 8Mbytes NCS0
涉及到的文件有四個(gè):
common.h
flash.c
flash.h
”./board/at91rm9200dk/config.mk”
以下簡單的說說。
一、首先讀讀uboot自帶的readme文件,了解了一個(gè)大概。
二、看看common.h,這個(gè)文件定義了一些基本的東西,并包含了一些必要的頭文件。再看看flash.h,這個(gè)文件里面定義了flash_info_t為一個(gè)struct。包含了flash的一些屬性定義。并且定義了所有的flash的屬性,其中,AMD的有:AMD_ID_LV320B,定義為“#define AMD_ID_LV320B 0x22F922F9”。
三、對(duì)于“./borad/at91rm9200dk/flash.c”的修改,有以下的方面:
“void flash_identification(flash_info_t *info)”這個(gè)函數(shù)的目的是確認(rèn)flash的型號(hào)。注意的是,這個(gè)函數(shù)里面有一些宏定義,直接讀寫了flash。并獲得ID號(hào)。
四、修改:”./board/at91rm9200dk/config.mk”為
TEXT_BASE=0x21f80000 為TEXT_BASE=0x21f00000 (當(dāng)然,你應(yīng)該根據(jù)自己的板子來修改,和一級(jí)boot的定義的一致即可)。
五、再修改”./include/configs/at91rm9200dk.h”為
修改flash和SDRAM的大小。
六、另外一個(gè)要修改的文件是:
./borad/at91rm9200dk/flash.c。這個(gè)文件修改的部分比較的多。
1. 首先是OrgDef的定義,加上目前的flash。
2. 接下來,修改”#define FLASH_BANK_SIZE 0x200000”為自己flash的容量
3. 在修改函數(shù)flash_identification(flash_info_t * info)里面的打印信息,這部分將在u-boot啟動(dòng)的時(shí)候顯示。
4. 然后修改函數(shù)flash_init(void)里面對(duì)一些變量的賦值。
5. 最后修改的是函數(shù)flash_print_info(flash_info_t * info)里面實(shí)際打印的函數(shù)信息。
6. 還有一個(gè)函數(shù)需要修改,就是:“flash_erase”,這個(gè)函數(shù)要檢測先前知道的flash類型是否匹配,否則,直接就返回了。把這里給注釋掉。

七、接下來看看SDRAM的修改。
這個(gè)里面對(duì)于“SIZE”的定義都是基于字節(jié)計(jì)算的。
只要修改”./include/configs/at91rm9200dk.h”里面的
“#define PHYS_SDRAM_SIZE 0X200000”就可以了。注意,SIZE是以字節(jié)為單位的。
八、還有一個(gè)地方要注意
就是按照目前的設(shè)定,一級(jí)boot把u_boot加載到了SDRAM的空間為:21F00000 -> 21F16B10,這恰好是SDRAM的高端部分。另外,BSS為21F1AE34。

九、編譯后,可以寫入flash了。
1. 壓縮這個(gè)u-boot.bin
“gzip –c u-boot.bin > u-boot.gz”
壓縮后的文件大小為:
43Kbytes
2. 接著把boot.bin和u-boot.gz燒到flash里面去。
Boot.bin大約11kBytes,在flash的0x1000 0000 ~ 0x1000 3fff
免費(fèi)參加,名額有限!2005DVTF;MP3 U盤禮物...
zlei 發(fā)表于 2005-1-16 12:31 ARM 論壇 ←返回版面
U-Boot 在44B0X 開發(fā)板上的移植以及代碼分析(ZT)
armboot的原理
1、BIOS的源碼,其作用是初始化硬件,并COPY Boot到SDRAM中
2、在SDRAM中運(yùn)行BOOT達(dá)到在線升級(jí)的目的。
3、此源代碼與硬件無關(guān),在44b0x上測試通過
4、串口通訊協(xié)議自己制定,很好理解。在線升級(jí)很快
5、目前只支持SST39LVF160,可以自己修改成相信的NOR FLASH
U-Boot 在44B0X 開發(fā)板上的移植以及代碼分析
1. u-boot 介紹
u-boot 是一個(gè)open source 的bootloader,目前版本是0.4.0。u-boot 是在ppcboot 以及armboot 的基礎(chǔ)上發(fā)展而來,雖然宣稱是0.4.0 版本,卻相當(dāng)?shù)某墒旌头€(wěn)定,已經(jīng)在許多嵌入式系統(tǒng)開發(fā)過程中被采用。由于其開發(fā)源代碼,其支持的開發(fā)板眾多。唯一遺憾的是并不支持我們現(xiàn)在學(xué)習(xí)所用samsung 44B0X 的開發(fā)板。
為什么我們需要u-boot?顯然可以將ucLinux 直接燒入flash,從而不需要額外的
引導(dǎo)裝載程序(bootloader)。但是從軟件升級(jí)的角度以及程序修補(bǔ)的來說,軟件的自
動(dòng)更新非常重要。事實(shí)上,引導(dǎo)裝載程序(bootloader)的用途不僅如此,但僅從軟件的自動(dòng)更新的需要就說明我們的開發(fā)是必要的。同時(shí),u-boot 移植的過程也是一個(gè)對(duì)嵌入式系統(tǒng)包括軟硬件以及操作系統(tǒng)加深理解的一個(gè)過程。

2. u-boot 移植的框架
移植u-boot 到新的開發(fā)板上僅需要修改和硬件相關(guān)的部分。在代碼結(jié)構(gòu)上:
1) 在board 目錄下創(chuàng)建ev44b0ii 目錄,創(chuàng)建ev44b0ii.c 以及flash.c,memsetup.S,u-boot.lds等。不需要從零開始,可選擇一個(gè)相似的目錄,直接復(fù)制過來,修改文件名以及內(nèi)容。我在移植u-boot 過程中,選擇的是ep7312 目錄。由于u-boot 已經(jīng)包含基于s3c24b0 的開發(fā)板目錄,作為參考,也可以復(fù)制相應(yīng)的目錄。
2) 在cpu 目錄下創(chuàng)建arm7tdmi 目錄,主要包含start.S,interrupts.c 以及cpu.c,serial.c幾個(gè)文件。同樣不需要從零開始建立文件,直接從arm720t 復(fù)制,然后修改相應(yīng)內(nèi)容。
3) 在include/configs 目錄下添加ev44b0ii.h,在這里放上全局的宏定義等。
4) 找到u-boot 根目錄下Makefile 修改加入
ev44b0ii_config : unconfig
@./mkconfig $(@:_config=) arm arm7tdmi ev44b0ii
5) 運(yùn)行make ev44bii_config,如果沒有錯(cuò)誤就可以開始硬件相關(guān)代碼移植的工作

3. u-boot 的體系結(jié)構(gòu)
1) 總體結(jié)構(gòu)
u-boot 是一個(gè)層次式結(jié)構(gòu)。從上圖也可以看出,做移植工作的軟件人員應(yīng)當(dāng)提供串口驅(qū)動(dòng)(UART Driver),以太網(wǎng)驅(qū)動(dòng)(Ethernet Driver),Flash 驅(qū)動(dòng)(Flash 驅(qū)動(dòng)),USB 驅(qū)動(dòng)(USB Driver)。目前,通過USB 口下載程序顯得不是十分必要,所以暫時(shí)沒有移植USB 驅(qū)動(dòng)。驅(qū)動(dòng)層之上是u-boot 的應(yīng)用,command 通過串口提供人機(jī)界面。我們可以使用一些命令做一些常用的工作,比如內(nèi)存查看命令md。
Kermit 應(yīng)用主要用來支持使用串口通過超級(jí)終端下載應(yīng)用程序。TFTP 則是通過網(wǎng)絡(luò)方式來下載應(yīng)用程序,例如uclinux 操作系統(tǒng)。
2) 內(nèi)存分布
在flash rom 中內(nèi)存分布圖ev44b0ii 的flash 大小2M(8bits),現(xiàn)在將0-40000 共256k 作為u-boot 的存儲(chǔ)空間。由于u-boot 中有一些環(huán)境變量,例如ip 地址,引導(dǎo)文件名等,可在命令行通過setenv 配置好,通過saveenv 保存在40000-50000(共64k)這段空間里。如果存在保存好的環(huán)境變量,u-boot 引導(dǎo)將直接使用這些環(huán)境變量。正如從代碼分析中可以看到,我們會(huì)把flash 引導(dǎo)代碼搬移到DRAM 中運(yùn)行。下圖給出u-boot 的代碼在DRAM中的位置。引導(dǎo)代碼u-boot 將從0x0000 0000 處搬移到0x0C700000 處。特別注意的由于ev44b0ii uclinux 中斷向量程序地址在0x0c00 0000 處,所以不能將程序下載到0x0c00 0000 出,通常下載到0x0c08 0000 處。

4. start.S 代碼結(jié)構(gòu)
1) 定義入口
一個(gè)可執(zhí)行的Image 必須有一個(gè)入口點(diǎn)并且只能有一個(gè)唯一的全局入口,通常這個(gè)入口放在Rom(flash)的0x0 地址。例如start.S 中的
.globl _start
_start:
值得注意的是你必須告訴編譯器知道這個(gè)入口,這個(gè)工作主要是修改連接器腳本文件(lds)。
2) 設(shè)置異常向量(Exception Vector)
異常向量表,也可稱為中斷向量表,必須是從0 地址開始,連續(xù)的存放。如下面的就包括了復(fù)位(reset),未定義處理(undef),軟件中斷(SWI),預(yù)去指令錯(cuò)誤(Pabort),數(shù)據(jù)錯(cuò)誤(Dabort),保留,以及IRQ,FIQ 等。注意這里的值必須與uclinux 的vector_base 一致。這就是說如果uclinux 中vector_base(include/armnommu/proc-armv/system.h)定義為0x0c00 0000,則HandleUndef 應(yīng)該在
0x0c00 0004。
b reset //for debug
ldr pc,=HandleUndef
ldr pc,=HandleSWI
ldr pc,=HandlePabort
ldr pc,=HandleDabort
b .
ldr pc,=HandleIRQ
ldr pc,=HandleFIQ
ldr pc,=HandleEINT0 /*mGA H/W interrupt vector table*/
ldr pc,=HandleEINT1
ldr pc,=HandleEINT2
ldr pc,=HandleEINT3
ldr pc,=HandleEINT4567
ldr pc,=HandleTICK /*mGA*/
b .
b .
ldr pc,=HandleZDMA0 /*mGB*/
ldr pc,=HandleZDMA1
ldr pc,=HandleBDMA0
ldr pc,=HandleBDMA1
ldr pc,=HandleWDT
ldr pc,=HandleUERR01 /*mGB*/
b .
b .
ldr pc,=HandleTIMER0 /*mGC*/
ldr pc,=HandleTIMER1
ldr pc,=HandleTIMER2
ldr pc,=HandleTIMER3
ldr pc,=HandleTIMER4
ldr pc,=HandleTIMER5 /*mGC*/
b .
b .
ldr pc,=HandleURXD0 /*mGD*/
ldr pc,=HandleURXD1
ldr pc,=HandleIIC
ldr pc,=HandleSIO
ldr pc,=HandleUTXD0
ldr pc,=HandleUTXD1 /*mGD*/
b .
b .
ldr pc,=HandleRTC /*mGKA*/
b .
b .
b .
b .
b . /*mGKA*/
b .
b .
ldr pc,=HandleADC /*mGKB*/
b .
b .
b .
b .
b . /*mGKB*/
b .
b .
ldr pc,=EnterPWDN
作為對(duì)照:請看以上標(biāo)記的值:
.equ HandleReset, 0xc000000
.equ HandleUndef,0xc000004
.equ HandleSWI, 0xc000008
.equ HandlePabort, 0xc00000c
.equ HandleDabort, 0xc000010
.equ HandleReserved, 0xc000014
.equ HandleIRQ, 0xc000018
.equ HandleFIQ, 0xc00001c
/*the value is different with an address you think it may be.
*IntVectorTable */
.equ HandleADC, 0xc000020
.equ HandleRTC, 0xc000024
.equ HandleUTXD1, 0xc000028
.equ HandleUTXD0, 0xc00002c
.equ HandleSIO, 0xc000030
.equ HandleIIC, 0xc000034
.equ HandleURXD1, 0xc000038
.equ HandleURXD0, 0xc00003c
.equ HandleTIMER5, 0xc000040
.equ HandleTIMER4, 0xc000044
.equ HandleTIMER3, 0xc000048
.equ HandleTIMER2, 0xc00004c
.equ HandleTIMER1, 0xc000050
.equ HandleTIMER0, 0xc000054
.equ HandleUERR01, 0xc000058
.equ HandleWDT, 0xc00005c
.equ HandleBDMA1, 0xc000060
.equ HandleBDMA0, 0xc000064
.equ HandleZDMA1, 0xc000068
.equ HandleZDMA0, 0xc00006c
.equ HandleTICK, 0xc000070
.equ HandleEINT4567, 0xc000074
.equ HandleEINT3, 0xc000078
.equ HandleEINT2, 0xc00007c
.equ HandleEINT1, 0xc000080
.equ HandleEINT0, 0xc000084
3) 初始化CPU 相關(guān)的pll,clock,中斷控制寄存器
依次為關(guān)閉watch dog timer,關(guān)閉中斷,設(shè)置LockTime,PLL(phase lock loop),以及時(shí)鐘。
這些值(除了LOCKTIME)都可從Samsung 44b0 的手冊中查到。
ldr r0,WTCON //watch dog disable
ldr r1,=0x0
str r1,[r0]
ldr r0,INTMSK
ldr r1,MASKALL //all interrupt disable
str r1,[r0]
/*****************************************************
* Set clock control registers *
*****************************************************/
ldr r0,LOCKTIME
ldr r1,=800 // count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800
str r1,[r0]
ldr r0,PLLCON /*temporary setting of PLL*/
ldr r1,PLLCON_DAT /*Fin=10MHz,Fout=40MHz or 60MHz*/
str r1,[r0]
ldr r0,CLKCON
ldr r1,=0x7ff8 //All unit block CLK enable
str r1,[r0]
4) 初始化內(nèi)存控制器
內(nèi)存控制器,主要通過設(shè)置13 個(gè)從1c80000 開始的寄存器來設(shè)置,包括總線寬度,
8 個(gè)內(nèi)存bank,bank 大小,sclk,以及兩個(gè)bank mode。
/*****************************************************
* Set memory control registers *
*****************************************************/
memsetup:
adr r0,SMRDATA
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 //BWSCON Address
stmia r0,{r1-r13}
5) 將rom 中的程序復(fù)制到RAM 中
首先利用PC 取得bootloader 在flash 的起始地址,再通過標(biāo)號(hào)之差計(jì)算出這個(gè)程序代
碼的大小。這些標(biāo)號(hào),編譯器會(huì)在連接(link)的時(shí)候生成正確的分布的值。取得正
確信息后,通過寄存器(r3 到r10)做為復(fù)制的中間媒介,將代碼復(fù)制到RAM 中。
relocate:
/*
* relocate armboot to RAM
*/
adr r0, _start /* r0 <- current position of code */
ldr r2, _armboot_start
ldr r3, _armboot_end
sub r2, r3, r2 /* r2 <- size of armboot */
ldr r1, _TEXT_BASE /* r1 <- destination address */
add r2, r0, r2 /* r2 <- source end address */
/*
* r0 = source address
* r1 = target address
* r2 = source end address
*/
copy_loop:
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
cmp r0, r2
ble copy_loop
6) 初始化堆棧
進(jìn)入各種模式設(shè)置相應(yīng)模式的堆棧。
InitStacks:
/*Don''t use DRAM,such as stmfd,ldmfd......
SVCstack is initialized before*/
mrs r0,cpsr
bic r0,r0,#0X1F
orr r1,r0,#0xDB /*UNDEFMODE|NOINT*/
msr cpsr,r1 /*UndefMode*/
ldr sp,UndefStack
orr r1,r0,#0XD7 /*ABORTMODE|NOINT*/
msr cpsr,r1 /*AbortMode*/
ldr sp,AbortStack
orr r1,r0,#0XD2 /*IRQMODE|NOINT*/
msr cpsr,r1 /*IRQMode*/
ldr sp,IRQStack
orr r1,r0,#0XD1 /*FIQMODE|NOINT*/
msr cpsr,r1 /*FIQMode*/
ldr sp,FIQStack
bic r0,r0,#0XDF /*MODEMASK|NOINT*/
orr r1,r0,#0X13
msr cpsr,r1 /*SVCMode*/
ldr sp,SVCStack
7) 轉(zhuǎn)到RAM 中執(zhí)行
使用指令ldr,pc,RAM 中C 函數(shù)地址就可以轉(zhuǎn)到RAM 中去執(zhí)行。
5. 系統(tǒng)初始化部分
1. 串口部分
串口的設(shè)置主要包括初始化串口部分,值得注意的串口的Baudrate 與時(shí)鐘MCLK 有很大關(guān)系,是通過:rUBRDIV0=( (int)(MCLK/16./(gd ->baudrate) + 0.5) -1 )計(jì)算得出。這可以在手冊中查到。其他的函數(shù)包括發(fā)送,接收。這個(gè)時(shí)候沒有中斷,是通過循環(huán)等待來判斷是否動(dòng)作完成。
例如,接收函數(shù):
while(!(rUTRSTAT0 & 0x1)); //Receive data read
return RdURXH0();
2. 時(shí)鐘部分
實(shí)現(xiàn)了延時(shí)函數(shù)udelay。
這里的get_timer 由于沒有使用中斷,是使用全局變量來累加的。
3. flash 部分
flash 作為內(nèi)存的一部分,讀肯定沒有問題,關(guān)鍵是flash 的寫部分。
Flash 的寫必須先擦除,然后再寫。
unsigned long flash_init (void)
{
int i;
u16 manId,devId;
//first we init it as unknown,even if you forget assign it below,it''s not a problem
for (i=0; i < CFG_MAX_FLASH_BANKS; ++i){
flash_info[i].flash_id = FLASH_UNKNOWN;
flash_info[i].sector_count=CFG_MAX_FLASH_SECT;
}
/*check manId,devId*/
_RESET();
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(0x555,0x90);
manId=_RD(0x0);
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(0x555,0x90);
devId=_RD(0x1);
_RESET();
printf("flashn");
printf("Manufacture ID=%4x(0x0004), Device ID(0x22c4)=%4xn",manId,devId);
if(manId!=0x0004 && devId!=0x22c4){
printf("flash check faliluren");
return 0;
}else{
for (i=0; i < CFG_MAX_FLASH_BANKS; ++i){
flash_info[i].flash_id=FLASH_AM160T;/*In fact it is fujitu,I only don''t want to
modify common files*/
}
}
/* Setup offsets */
flash_get_offsets (CFG_FLASH_BASE, &flash_info[0]);
/* zhangyy comment
#if CFG_MONITOR_BASE >= CFG_FLASH_BASE
//onitor protection ON by default
flash_protect(FLAG_PROTECT_SET,
CFG_MONITOR_BASE,
CFG_MONITOR_BASE+monitor_flash_len-1,
&flash_info[0]);
#endif
*/
flash_info[0].size =PHYS_FLASH_SIZE;
return (PHYS_FLASH_SIZE);
}
flash_init 完成初始化部分,這里的主要目的是檢驗(yàn)flash 的型號(hào)是否正確。
int flash_erase (flash_info_t *info, int s_first, int s_last)
{
volatile unsigned char *addr = (volatile unsigned char *)(info->start[0]);
int flag, prot, sect, l_sect;
//ulong start, now, last;
u32 targetAddr;
u32 targetSize;
/*zyy note:It is required and can''t be omitted*/
rNCACHBE0=( (0x2000000>>12)<<16 )|(0>>12); //flash area(Bank0) must be non-cachable
area.
rSYSCFG=rSYSCFG & (~0x8); //write buffer has to be off for proper timing.
if ((s_first < 0) || (s_first > s_last)) {
if (info->flash_id == FLASH_UNKNOWN) {
printf ("- missingn");
} else {
printf ("- no sectors to erasen");
}
return 1;
}
if ((info->flash_id == FLASH_UNKNOWN) ||
(info->flash_id > FLASH_AMD_COMP)) {
printf ("Can''t erase unknown flash type - abortedn");
return 1;
}
prot = 0;
for (sect=s_first; sect<=s_last; ++sect) {
if (info->protect[sect]) {
prot++;
}
}
if (prot) {
printf ("- Warning: %d protected sectors will not be erased!n",
prot);
} else {
printf ("n");
}
l_sect = -1;
/* Disable interrupts which might cause a timeout here */
flag = disable_interrupts();
/* Start erase on unprotected sectors */
for (sect = s_first; sect<=s_last; sect++) {
if (info->protect[sect] == 0) {/* not protected */
targetAddr=0x10000*sect;
if(targetAddr<0x1F0000)
targetSize=0x10000;
else if(targetAddr<0x1F8000)
targetSize=0x8000;
else if(targetAddr<0x1FC000)
targetSize=0x2000;
else
targetSize=0x4000;
F29LV160_EraseSector(targetAddr);
l_sect = sect;
if(!BlankCheck(targetAddr, targetSize))
printf("BlankCheck Errorn");
}
}
/* re-enable interrupts if necessary */
if (flag)
enable_interrupts();
/* wait at least 80us - let''s wait 1 ms */
udelay (1000);
/*
*We wait for the last triggered sector
*/
if (l_sect < 0)
goto DONE;
DONE:
printf (" donen");
return 0;
}
int BlankCheck(int targetAddr,int targetSize)
{
int i,j;
for(i=0;i{
j=*((u16 *)(i+targetAddr));
if( j!=0xffff)
{
printf("E:%x=%xn",(i+targetAddr),j);
return 0;
}
}
return 1;
}
flash_erase 擦除flash,BlankCheck 則檢查該部分內(nèi)容是否擦除成功。
/*-----------------------------------------------------------------------
*Write a word to Flash, returns:
* 0 - OK
* 1 - write timeout
* 2 - Flash not erased
*/
static int write_word (flash_info_t *info, ulong dest, ulong data)
{
volatile u16 *tempPt;
/*zhangyy note:because of compatiblity of function,I use low & hi*/
u16 low = data & 0xffff;
u16 high = (data >> 16) & 0xffff;
low=swap_16(low);
high=swap_16(high);
tempPt=(volatile u16 *)dest;
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(0x555,0xa0);
*tempPt=high;
_WAIT();
_WR(0x555,0xaa);
_WR(0x2aa,0x55);
_WR(0x555,0xa0);
*(tempPt+1)=low;
_WAIT();
return 0;
}
wirte_word 則想flash 里面寫入unsigned long 類型的data,因?yàn)閒lash 一次只能寫入16bits,所以這里分兩次寫入。
免費(fèi)參加,名額有限!2005DVTF;MP3 U盤禮物...
zlei 發(fā)表于 2005-1-16 12:33 ARM 論壇 ←返回版面
MPC8xx的U-Boot移植體會(huì)(ZT)
BOOT LOADER(引導(dǎo)裝載器),是用于初始化目標(biāo)板硬件,給嵌入式操作系統(tǒng)提供板上硬件資源信息,并進(jìn)一步裝載、引導(dǎo)嵌入式操作系統(tǒng)運(yùn)行的固件。在嵌入式系統(tǒng)開發(fā)過程中,很多情況都會(huì)涉及底層BOOT LOADER的移植問題,即使在有些已有BOOT LOADER的參考開發(fā)板上也存在這種可能。概括來說,如下情況會(huì)考慮進(jìn)行BOOT LOADER的移植工作:
A. 在自主設(shè)計(jì)的目標(biāo)板上,用于引導(dǎo)嵌入式操作系統(tǒng)及其應(yīng)用;
B. 在廠家未提供BOOT LOADER源碼的參考板上,遇有如下情形之一:
a. 在實(shí)際應(yīng)用中需要添加或修改一些功能;
b. 為了給自行設(shè)計(jì)主板移植BOOT LOADER提供參考,先在參考板上進(jìn)行移植以積累經(jīng)驗(yàn);
另外,從嵌入式系統(tǒng)實(shí)際開發(fā)角度講,嵌入式操作系統(tǒng)的引導(dǎo)、配置甚至應(yīng)用程序的運(yùn)行狀況都和BOOT LOADER有一定的關(guān)聯(lián),可以說,掌握BOOT LOADER移植是順利進(jìn)行嵌入式系統(tǒng)開發(fā)的重要利器。
與常見的嵌入式操作系統(tǒng)板級(jí)支持包BSP相比,BOOT LOADER與底層硬件更為相關(guān),即每個(gè)不同配置的目標(biāo)板基本都有不同的BOOT LOADER。因?yàn)锽OOT LOADER往往更依據(jù)量體裁衣、定身制作的原則,以滿足要求的最小化代碼存放在啟動(dòng)ROM或FLASH中。
誠然,自行編寫B(tài)OOT LOADER未嘗不可,但從可利用的資源和實(shí)際項(xiàng)目開發(fā)考慮,采用移植已有的BOOT LOADER源碼來解決這一問題更符合大多數(shù)項(xiàng)目開發(fā)的要求。
1 U-Boot簡介
U-Boot,全稱Universal Boot Loader,是遵循GPL條款的開放源碼項(xiàng)目。從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡化,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點(diǎn)。但是U-Boot不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo),當(dāng)前,它還支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)是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等諸多常用系列的處理器。這兩個(gè)特點(diǎn)正是U-Boot項(xiàng)目的開發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌入式操作系統(tǒng)。就目前來看,U-Boot對(duì)PowerPC系列處理器支持最為豐富,對(duì)Linux的支持最完善。其它系列的處理器和操作系統(tǒng)基本是在2002年11月PPCBOOT改名為U-Boot后逐步擴(kuò)充的。從PPCBOOT向U-Boot的順利過渡,很大程度上歸功于U-Boot的維護(hù)人德國DENX軟件工程中心Wolfgang Denk[以下簡稱W.D]本人精湛專業(yè)水平和持著不懈的努力。當(dāng)前,U-Boot項(xiàng)目正在他的領(lǐng)軍之下,眾多有志于開放源碼BOOT LOADER移植工作的嵌入式開發(fā)人員正如火如荼地將各個(gè)不同系列嵌入式處理器的移植工作不斷展開和深入,以支持更多的嵌入式操作系統(tǒng)的裝載與引導(dǎo)。
選擇U-Boot的理由:
① 開放源碼;
② 支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 較高的可靠性和穩(wěn)定性;
④ 較高的可靠性和穩(wěn)定性;
⑤ 高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;
⑥ 豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
⑦ 較為豐富的開發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持;
2 U-Boot主要目錄結(jié)構(gòu)
- board 目標(biāo)板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動(dòng);
- common 獨(dú)立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測與故障檢測;
- cpu 與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、LCD驅(qū)動(dòng)及中斷初始化等文件;
- driver 通用設(shè)備驅(qū)動(dòng),如CFI FLASH驅(qū)動(dòng)(目前對(duì)INTEL FLASH支持較好)
- doc U-Boot的說明文檔;
- examples可在U-Boot下運(yùn)行的示例程序;如hello_world.c,timer.c;
- include U-Boot頭文件;尤其configs子目錄下與目標(biāo)板相關(guān)的配置頭文件是移植過程中經(jīng)常要修改的文件;
- lib_xxx 處理器體系相關(guān)的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結(jié)構(gòu)相關(guān)的文件;
- net 與網(wǎng)絡(luò)功能相關(guān)的文件目錄,如bootp,nfs,tftp;
- post 上電自檢文件目錄。尚有待于進(jìn)一步完善;
- rtc RTC驅(qū)動(dòng)程序;
- tools 用于創(chuàng)建U-Boot S-RECORD和BIN鏡像文件的工具;
3 U-Boot支持的主要功能
U-Boot可支持的主要功能列表
系統(tǒng)引導(dǎo) 支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng)
支持NFS掛載、從FLASH中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核;
基本輔助功能 強(qiáng)大的操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤對(duì)Linux支持最為強(qiáng)勁;
支持目標(biāo)板環(huán)境參數(shù)多種存儲(chǔ)方式,如FLASH、NVRAM、EEPROM;
CRC32校驗(yàn),可校驗(yàn)FLASH中內(nèi)核、RAMDISK鏡像文件是否完好;
設(shè)備驅(qū)動(dòng) 串口、SDRAM、FLASH、以太網(wǎng)、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅(qū)動(dòng)支持;
上電自檢功能 SDRAM、FLASH大小自動(dòng)檢測;SDRAM故障檢測;CPU型號(hào);
特殊功能 XIP內(nèi)核引導(dǎo);
4 U-Boot移植過程
① 獲得發(fā)布的最新版本U-Boot源碼,與Linux內(nèi)核源碼類似,也是 bzip2的壓縮格式??蓮腢-Boot的官方網(wǎng)站http:///projects/U-Boot上獲得;
② 閱讀相關(guān)文檔,主要是U-Boot源碼根目錄下的README文檔和U-Boot官方網(wǎng)站的DULG(The DENX U-Boot and Linux Guide)文檔http://www./twiki/bin/view/DULG/Manual。尤其是DULG文檔,從如何安裝建立交叉開發(fā)環(huán)境和解決U-Boot移植中常見問題都一一給出詳盡的說明;
③ 訂閱U-Boot用戶郵件列表http://lists./lists/listinfo/u-boot-users。在移植U-Boot過程中遇有問題,在參考相關(guān)文?/ca>

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多