uboot移植.docx
《uboot移植.docx》由会员分享,可在线阅读,更多相关《uboot移植.docx(9页珍藏版)》请在冰豆网上搜索。
uboot移植
一、移植前说明:
1.工作环境:
Fedora8,内核2.6.25
交叉编译器:
Arm-linux-gcc3.3.2
目标板:
优龙FS2410,NANDFlash:
64MK9F1208,NORFlash:
2MSST39VF1601(本次移植不包含NORFlash 支持),RAM64M,CS8900Q3
2.下载源码,建立工作目录
u-boot的源码可以从以下网址下载:
建立工作目录:
mkdir/uboot
cd/uboot
把下载的源码拷贝到该目录,解压;
tarjxvfu-boot-1.1.6.tar.bz2
二、移植步骤如下:
(1)、建立自己fs2410开发板的配置
1)#cp–rboard/smdk2410board/fs2410
2)#cpinclude/configs/smdk2410.hinclude/configs/fs2410.h
fs2410.h是开发板的配置文件,他包括开发板的CPU、系统时钟、RAM、FLASH系统及其他相关的配置信息,由于u-boot已经支持三星的SMDK2410开发板,所以移植的时候直接拷贝SMDK2410的配置文件,做相应的修改即可。
由于Uboot对SMDK2410板的NANDFlash初始化部分没有写,即lib_arm/board.c中的start_armboot函数中有这么一句:
#if(CONFIG_COMMANDS&CFG_CMD_NAND)
puts("NAND:
");
nand_init();/*goinittheNAND*/
#endif
但是在board/smdk2410目录下源文件中都没有定义nand_init这个函数。
所以需要我们补充这个函数以及这个函数涉及的底层操作,NANDFlash的读写操作相对复杂,将在u-boot-1.1.6移植的第二部分介绍。
(2).修改顶层Makefile
cd/uboot/u-boot-1.1.6
viMakefile
找到:
smdk2410_config :
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2410NULLs3c24x0
在其后面添加:
fs2410_config :
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tfs2410NULLs3c24x0
各项的意思如下:
arm:
CPU的架构(ARCH)
arm920t:
CPU的类型(CPU),其对应于cpu/arm920t子目录。
fs2410:
开发板的型号(BOARD),对应于board/fs2410目录。
NULL:
开发者/或经销商(vender)。
s3c24x0:
片上系统(SOC)。
(3). include/configs/fs2410.h:
修改:
#define CFG_PROMPT “SMDK2410#”
为:
#define CFG_PROMPT “fs2410#”
这是u-boot的命令行提示符。
(4)修改board/fs2410/Makefile
将:
OBJS :
=smdk2410.oflash.o
改为:
OBJS :
=fs2410.oflash.o
当然,fs2410下的smdk2410.c要改成fs2410.c;
(5)依照你自己开发板的内存地址分配情况修改board/fs2410/lowlevel_init.S文件
这里我参考了FS2410开发板自带S3C2410_BIOS,代码如下:
#include
#include
/*someparametersfortheboard*/
/*
*
*Takenfromlinux/arch/arm/boot/compressed/head-s3c2410.S
*
*Copyright(C)2002SamsungElectronicsSW.LEE
*
*/
#defineBWSCON 0x48000000
/*BWSCON*/
#defineDW8 (0x0)
#defineDW16 (0x1)
#defineDW32 (0x2)
#defineWAIT (0x1<<2)
#defineUBLB (0x1<<3)
#defineB1_BWSCON (DW16)
#defineB2_BWSCON (DW16)
#defineB3_BWSCON (DW16+WAIT+UBLB)
#defineB4_BWSCON (DW16)
#defineB5_BWSCON (DW16)
#defineB6_BWSCON (DW32)
#defineB7_BWSCON (DW32)
/*BANK0CON*/
#defineB0_Tacs 0x3 /* 0clk*/
#defineB0_Tcos 0x3 /* 0clk*/
#defineB0_Tacc 0x7 /*14clk*/
#defineB0_Tcoh 0x3 /* 0clk*/
#defineB0_Tah 0x3 /* 0clk*/
#defineB0_Tacp 0x1
#defineB0_PMC 0x0 /*normal*/
/*BANK1CON*/
#defineB1_Tacs 0x3 /* 0clk*/
#defineB1_Tcos 0x3 /* 0clk*/
#defineB1_Tacc 0x7 /*14clk*/
#defineB1_Tcoh 0x3 /* 0clk*/
#defineB1_Tah 0x3 /* 0clk*/
#defineB1_Tacp 0x3
#defineB1_PMC 0x0
#defineB2_Tacs 0x0
#defineB2_Tcos 0x0
#defineB2_Tacc 0x7
#defineB2_Tcoh 0x0
#defineB2_Tah 0x0
#defineB2_Tacp 0x0
#defineB2_PMC 0x0
#defineB3_Tacs 0x0 /* 0clk*/
#defineB3_Tcos 0x3 /* 4clk*/
#defineB3_Tacc 0x7 /*14clk*/
#defineB3_Tcoh 0x1 /* 1clk*/
#defineB3_Tah 0x0 /* 0clk*/
#defineB3_Tacp 0x3 /* 6clk*/
#defineB3_PMC 0x0 /*normal*/
#defineB4_Tacs 0x1 /* 0clk*/
#defineB4_Tcos 0x1 /* 0clk*/
#defineB4_Tacc 0x6 /*14clk*/
#defineB4_Tcoh 0x1 /* 0clk*/
#defineB4_Tah 0x1 /* 0clk*/
#defineB4_Tacp 0x0
#defineB4_PMC 0x0 /*normal*/
#defineB5_Tacs 0x1 /* 0clk*/
#defineB5_Tcos 0x1 /* 0clk*/
#defineB5_Tacc 0x6 /*14clk*/
#defineB5_Tcoh 0x1 /* 0clk*/
#defineB5_Tah 0x1 /* 0clk*/
#defineB5_Tacp 0x0
#defineB5_PMC 0x0 /*normal*/
#defineB6_MT 0x3 /*SDRAM*/
#defineB6_Trcd 0x1
#defineB6_SCAN 0x1 /*9bit*/
#defineB7_MT 0x3 /*SDRAM*/
#defineB7_Trcd 0x1 /*3clk*/
#defineB7_SCAN 0x1 /*9bit*/
/*REFRESHparameter*/
#defineREFEN 0x1 /*Refreshenable*/
#defineTREFMD 0x0 /*CBR(CASbeforeRAS)/Autorefresh*/
#defineTrp 0x0 /*2clk*/
#defineTrc 0x3 /*7clk*/
#defineTchr 0x2 /*3clk*/
#defineREFCNT 1113 /*period=15.6us,HCLK=60Mhz,(2048+1-15.6*60)*/
/**************************************/
_TEXT_BASE:
.word TEXT_BASE
.globllowlevel_init
lowlevel_init:
/*memorycontrolconfiguration*/
/*maker0relativethecurrentlocationsothatit*/
/*readsSMRDATAoutofFLASHratherthanmemory!
*/
ldr r0,=SMRDATA
ldr r1,_TEXT_BASE
sub r0,r0,r1
ldr r1,=BWSCON /*BusWidthStatusController*/
add r2,r0,#13*4
0:
ldr r3,[r0],#4
str r3,[r1],#4
cmp r2,r0
bne 0b
/*everythingisfinenow*/
mov pc,lr
.ltorg
/*theliteralpoolsorigin*/
SMRDATA:
.word(0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
.word((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
.word((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
.word((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
.word((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))
.word((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
.word((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
.word((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
.word((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
.word((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
.word0x32
.word0x30
.word0x30
(6)测试编译能否成功:
makefs2410_config
make
如果没有问题,在u-boot-1.1.6目录下就生成u-boot.bin,因为到这一步只是做了点小改动,并未涉及敏感问题,测试一下可增加点信心,烧到扳子看到如图1所示。
当然也有make不成功的时候,如按照上述步骤编译u-boot-1.1.5的时候,出现“没有规则创建'all'需要的目标'hello_world.srec'”,如图1所示,解决方法:
把example文件夹下的Makefile中的
第147行
%.srec:
%改成:
%.srec:
%.o
第150行
%.bin:
%改成:
%.bin:
%.o
网上还有一种改法,我没试过,不作说明。
(7)在board/fs2410加入NANDFlash读函数,建立nand_read.c,加入如下内容(copyfromvivi):
#include
#include"linux/mtd/mtd.h"
#include"linux/mtd/nand.h"
#define__REGb(x)(*(volatileunsignedchar*)(x))
#define__REGi(x)(*(volatileunsignedint*)(x))
#defineNF_BASE0x4e000000
#defineNFCONF__REGi(NF_BASE+0x0)
#defineNFCMD__REGb(NF_BASE+0x4)
#defineNFADDR__REGb(NF_BASE+0x8)
#defineNFDATA__REGb(NF_BASE+0xc)
#defineNFSTAT__REGb(NF_BASE+0x10)
#defineBUSY1
inlinevoidwait_idle(void){
inti;
while(!
(NFSTAT&BUSY))
for(i=0;i<10;i++);
}
#defineNAND_SECTOR_SIZE512
#defineNAND_BLOCK_MASK(NAND_SECTOR_SIZE-1)
/*lowlevelnandreadfunction*/
int
nand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize)
{
inti,j;
if((start_addr&NAND_BLOCK_MASK)||(size&NAND_BLOCK_MASK)){
return-1;/*invalidalignment*/
}
/*chipEnable*/
NFCONF&=~0x800;
for(i=0;i<10;i++);
for(i=start_addr;i<(start_addr+size);){
/*READ0*/
NFCMD=0;
/*WriteAddress*/
NFADDR=i&0xff;
NFADDR=(i>>9)&0xff;
NFADDR=(i>>17)&0xff;
NFADDR=(i>>25)&0xff;
wait_idle();
for(j=0;j*buf=(NFDATA&0xff);
buf++;
}
}
/*chipDisable*/
NFCONF|=0x800;/*chipdisable*/
return0;
}
(10)修改cpu/arm920t/start.S文件
2410的启动代码可以在外部的NANDFLASH上执行,启动时,NANDFLASH的前4KB(地址为0x00000000,OM[1:
0]=0)将被装载到SDRAM中被称为Setppingstone的地址中,然后开始执行这段代码。
启动以后,这4KB的空间可以做其他用途,在start.S加入搬运代码如下:
...........
...........
copy_loop:
ldmia r0!
{r3-r10} /*copyfromsourceaddress[r0] */
stmia r1!
{r3-r10} /*copyto targetaddress[r1] */
cmp r0,r2 /*untilsourceendaddreee[r2] */
ble copy_loop
/*08-6-24********************************************************/
#ifdefCONFIG_S3C2410_NAND_BOOT/*这个一定要放在堆栈设置之前*/
bl copy_myself
#endif /*CONFIG_S3C2410_NAND_BOOT*/
/*08-6-24********************************************************/
#endif /*CONFIG_SKIP_RELOCATE_UBOOT*/
/*Setupthestack */
stack_setup:
..................
/**************************************************************************
*
*copyu-boot toram放在start.S靠后的位置
*
*************************************************************************
*/
#ifdefCONFIG_S3C2410_NAND_BOOT
/*
@copy_myself:
copyu-boottoram
*/
copy_myself:
mov r10,lr
@resetNAND
mov r1,#NAND_CTL_BASE
ldr r2,=0xf830 @initialvalue
str r2,[r1,#oNFCONF]
ldr r2,[r1,#oNFCONF]
bic