uboot是一个通用的免费开放源码的boot程序,支撑许多的处理器。
以下是现在网上下载一个u-boot-1.1.1版别,用于at91rm9200体系的修正的比方。最终在redhat8.0上,用gcc2.95编译经过。
在网上下载了uboot-1.1.1版别。要用于自己的at91rm9200的体系,这个体系的状况是:
SDRAM: 32Mbytes NCS1
FLASH: 8Mbytes NCS0
触及到的文件有四个:
common.h
flash.c
flash.h
”./board/at91rm9200dk/config.mk”
以下简略的说说。
一、首要读读uboot自带的readme文件,了解了一个大约。
二、看看common.h,这个文件界说了一些根本的东西,并包括了一些必要的头文件。再看看flash.h,这个文件里边界说了flash_info_t为一个struct。包括了flash的一些特色界说。而且界说了一切的flash的特色,其间,AMD的有:AMD_ID_LV320B,界说为“#define AMD_ID_LV320B 0x22F922F9”。
三、关于“./borad/at91rm9200dk/flash.c”的修正,有以下的方面:
“void flash_identification(flash_info_t *info)”这个函数的意图是承认flash的类型。留意的是,这个函数里边有一些宏界说,直接读写了flash。并取得ID号。
四、修正:”./board/at91rm9200dk/config.mk”为
TEXT_BASE=0x21f80000 为TEXT_BASE=0x21f00000 (当然,你应该根据自己的板子来修正,和一级boot的界说的共同即可)。
五、再修正”./include/configs/at91rm9200dk.h”为
修正flash和SDRAM的巨细。
六、别的一个要修正的文件是:
./borad/at91rm9200dk/flash.c。这个文件修正的部分比较的多。
1. 首要是OrgDef的界说,加上现在的flash。
2. 接下来,修正”#define FLASH_BANK_SIZE 0x200000”为自己flash的容量
3. 在修正函数flash_identification(flash_info_t * info)里边的打印信息,这部分将在u-boot发动的时分显现。
4. 然后修正函数flash_init(void)里边对一些变量的赋值。
5. 最终修正的是函数flash_print_info(flash_info_t * info)里边实践打印的函数信息。
6.还有一个函数需求修正,便是:“flash_erase”,这个函数要检测从前知道的flash类型是否匹配,不然,直接就回来了。把这儿给注释掉。
七、接下来看看SDRAM的修正。
这个里边关于“SIZE”的界说都是根据字节核算的。
只需修正”./include/configs/at91rm9200dk.h”里边的
“#define PHYS_SDRAM_SIZE 0X200000”就能够了。留意,SIZE是以字节为单位的。
八、还有一个当地要留意
便是依照现在的设定,一级boot把u_boot加载到了SDRAM的空间为:21F00000 -> 21F16B10,这恰好是SDRAM的高端部分。别的,BSS为21F1AE34。
九、编译后,能够写入flash了。
1. 紧缩这个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
免费参与,名额有限!2005DVTF;MP3 U盘礼物…
zlei 发表于 2005-1-16 12:31 ARM 论坛 ←回来版面
U-Boot 在44B0X 开发板上的移植以及代码剖析(ZT)
armboot的原理
1、BIOS的源码,其作用是初始化硬件,并COPY Boot到SDRAM中
2、在SDRAM中运转BOOT到达在线晋级的意图。
3、此源代码与硬件无关,在44b0x上测试经过
4、串口通讯协议自己拟定,很好了解。在线晋级很快
5、现在只支撑SST39LVF160,能够自己修正成信任的NOR FLASH
U-Boot 在44B0X 开发板上的移植以及代码剖析
1. u-boot 介绍
u-boot 是一个open source 的bootloader,现在版别是0.4.0。u-boot 是在ppcboot 以及armboot 的基础上开展而来,尽管宣称是0.4.0 版别,却适当的老练和安稳,现已在许多嵌入式体系开发进程中被选用。由于其开发源代码,其支撑的开发板许多。仅有惋惜的是并不支撑咱们现在学习所用samsung 44B0X 的开发板。
为什么咱们需求u-boot?明显能够将ucLinux 直接烧入flash,然后不需求额定的
引导装载程序(bootloader)。可是从软件晋级的视点以及程序修补的来说,软件的自
动更新非常重要。事实上,引导装载程序(bootloader)的用处不仅如此,但仅从软件的自动更新的需求就阐明咱们的开发是必要的。一起,u-boot 移植的进程也是一个对嵌入式体系包括软硬件以及操作体系加深了解的一个进程。
2. u-boot 移植的结构
移植u-boot 到新的开发板上仅需求修正和硬件相关的部分。在代码结构上:
1) 在board 目录下创立ev44b0ii 目录,创立ev44b0ii.c 以及flash.c,memsetup.S,u-boot.lds等。不需求从零开端,可挑选一个相似的目录,直接仿制过来,修正文件名以及内容。我在移植u-boot 进程中,挑选的是ep7312 目录。由于u-boot 现已包括根据s3c24b0 的开发板目录,作为参阅,也能够仿制相应的目录。
2) 在cpu 目录下创立arm7tdmi 目录,首要包括start.S,interrupts.c 以及cpu.c,serial.c几个文件。相同不需求从零开端树立文件,直接从arm720t 仿制,然后修正相应内容。
3) 在include/configs 目录下增加ev44b0ii.h,在这儿放上大局的宏界说等。
4) 找到u-boot 根目录下Makefile 修正参与
ev44b0ii_config : unconfig
@./mkconfig $(@:_config=) arm arm7tdmi ev44b0ii
5) 运转make ev44bii_config,假如没有过错就能够开端硬件相关代码移植的作业
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. start.S 代码结构
1) 界说进口
一个可履行的Image 有必要有一个进口点而且只能有一个仅有的大局进口,一般这个进口放在Rom(flash)的0x0 地址。例如start.S 中的
.globl _start
_start:
值得留意的是你有必要告知编译器知道这个进口,这个作业首要是修正衔接器脚本文件(lds)。
2) 设置反常向量(Exception Vector)
反常向量表,也可称为中止向量表,有必要是从0 地址开端,接连的寄存。如下面的就包括了复位(reset),未界说处理(undef),软件中止(SWI),预去指令过错(Pabort),数据过错(Dabort),保存,以及IRQ,FIQ 等。留意这儿的值有必要与uclinux 的vector_base 共同。这便是说假如uclinux 中vector_base(include/armnommu/proc-armv/system.h)界说为0x0c00 0000,则HandleUndef 应该在
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
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
作为对照:请看以上符号的值:
.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 相关的pll,clock,中止操控寄存器
依次为封闭watch dog timer,封闭中止,设置LockTime,PLL(phase lock loop),以及时钟。
这些值(除了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]
//
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) 初始化内存操控器
内存操控器,首要经过设置13 个从1c80000 开端的寄存器来设置,包括总线宽度,
8 个内存bank,bank 巨细,sclk,以及两个bank mode。
//
memsetup:
adr r0,SMRDATA
ldmia r0,{r1-r13}
ldr r0,=0x01c80000 //BWSCON Address
stmia r0,{r1-r13}
5) 将rom 中的程序仿制到RAM 中
首要运用PC 取得bootloader 在flash 的开始地址,再经过标号之差核算出这个程序代
码的巨细。这些标号,编译器会在衔接(link)的时分生成正确的散布的值。取得正
确信息后,经过寄存器(r3 到r10)做为仿制的中心前言,将代码仿制到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) 初始化仓库
进入各种方法设置相应方法的仓库。
InitStacks:
//Dont 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) 转到RAM 中履行
运用指令ldr,pc,RAM 中C 函数地址就能够转到RAM 中去履行。
5. 体系初始化部分
1. 串口部分
串口的设置首要包括初始化串口部分,值得留意的串口的Baudrate 与时钟MCLK 有很大联系,是经过:rUBRDIV0=( (int)(MCLK/16./(gd ->baudrate) + 0.5) -1 )核算得出。这能够在手册中查到。其他的函数包括发送,接纳。这个时分没有中止,是经过循环等候来判别是否动作完结。
例如,接纳函数:
while(!(rUTRSTAT0 & 0x1)); //Receive data read
return RdURXH0();
2. 时钟部分
完结了延时函数udelay。
这儿的get_timer 由于没有运用中止,是运用大局变量来累加的。
3. flash 部分
flash 作为内存的一部分,读必定没有问题,要害是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,its 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 dont want to
}
}
// 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 完结初始化部分,这儿的首要意图是查验flash 的类型是否正确。
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 cant 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 (“Cant 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 – lets 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 则查看该部分内容是否擦除成功。
//———————————————————————–
*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,由于flash 一次只能写入16bits,所以这儿分两次写入。
免费参与,名额有限!2005DVTF;MP3 U盘礼物…
zlei 发表于 2005-1-16 12:33 ARM 论坛 ←回来版面
MPC8xx的U-Boot移植领会(ZT)
BOOT LOADER(引导装载器),是用于初始化方针板硬件,给嵌入式操作体系供给板上硬件资源信息,并进一步装载、引导嵌入式操作体系运转的固件。在嵌入式体系开发进程中,许多状况都会触及底层BOOT LOADER的移植问题,即便在有些已有BOOT LOADER的参阅开发板上也存在这种或许。归纳来说,如下状况会考虑进行BOOT LOADER的移植作业:
A. 在自主规划的方针板上,用于引导嵌入式操作体系及其运用;
B. 在厂家未供给BOOT LOADER源码的参阅板上,遇有如下景象之一:
a. 在实践运用中需求增加或修正一些功用;
b. 为了给自行规划主板移植BOOT LOADER供给参阅,先在参阅板上进行移植以堆集经历;
别的,从嵌入式体系实践开发视点讲,嵌入式操作体系的引导、装备乃至运用程序的运转状况都和BOOT LOADER有必定的相关,能够说,把握BOOT LOADER移植是顺畅进行嵌入式体系开发的重要利器。
与常见的嵌入式操作体系板级支撑包BSP比较,BOOT LOADER与底层硬件更为相关,即每个不同装备的方针板根本都有不同的BOOT LOADER。由于BOOT LOADER往往更根据因地制宜、定身制造的准则,以满足要求的最小化代码寄存在发动ROM或FLASH中。
固然,自行编写BOOT LOADER未尝不可,但从可运用的资源和实践项目开发考虑,选用移植已有的BOOT LOADER源码来处理这一问题更契合大多数项目开发的要求。
1 U-Boot简介
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、键盘等;
⑦ 较为丰厚的开发调试文档与强壮的网络技术支撑;
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镜像文件的东西;
3 U-Boot支撑的首要功用
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类型;
特别功用 XIP内核引导;
4 U-Boot移植进程
① 取得发布的最新版别U-Boot源码,与Linux内核源码相似,也是 bzip2的紧缩格局。可从U-Boot的官方网站http://sourceforge.net/projects/U-Boot上取得;
② 阅览相关文档,首要是U-Boot源码根目录下的README文档和U-Boot官方网站的DULG(The DENX U-Boot and Linux Guide)文档http://www.denx.de/twiki/bin/view/DULG/Manual。特别是DULG文档,从怎么装置树立穿插开发环境和处理U-Boot移植中常见问题都逐个给出翔实的阐明;
③ 订阅U-Boot用户邮件列表http://lists.sourceforge.net/lists/listinfo/u-boot-users。