uboot116移植到S3C2410的详细步骤nand flash新代码.docx
《uboot116移植到S3C2410的详细步骤nand flash新代码.docx》由会员分享,可在线阅读,更多相关《uboot116移植到S3C2410的详细步骤nand flash新代码.docx(25页珍藏版)》请在冰点文库上搜索。
![uboot116移植到S3C2410的详细步骤nand flash新代码.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/5c5cb248-5ac6-4012-8486-5230ce2f2d65/5c5cb248-5ac6-4012-8486-5230ce2f2d651.gif)
uboot116移植到S3C2410的详细步骤nandflash新代码
一、移植前说明:
1.工作环境:
RedHat9,内核2.4.20
交叉编译器:
Arm-linux-gcc3.4.4
目标板:
s3c2410,NANDFlash:
64MK9F1208U0B
2.下载源码,建立工作目录
u-boot的源码可以从以下网址下载:
把下载的源码拷贝到/tmp目录,解压;
tarjxvfu-boot-1.1.6.tar.bz2
二、移植步骤如下:
1.在board子目录中建立自己的目录tbwoody2410
[root@localhostu-boot-1.1.6]#cp-rfboard/smdk2410board/tbwoody2410
[root@localhostu-boot-1.1.6]#cpinclude/configs/smdk2410.hinclude/configs/tbwoody2410.h
[root@localhostu-boot-1.1.6]#cdboard/tbwoody2410
[root@localhosttbwoody2410]#mvsmdk2410.ctbwoody2410.c
tbwoody2410.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的读写操作相对复杂。
2.修改顶层Makefile,回到u-boot-1.1.6目录
[root@localhostu-boot-1.1.6]#geditMakefile
找到1879行,
smdk2410_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tsmdk2410NULLs3c24x0
在后面添加自己的配置:
tbwoody2410_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920ttbwoody2410NULLs3c24x0
各项的意思如下:
arm:
CPU的架构(ARCH)
arm920t:
CPU的类型(CPU),其对应于cpu/arm920t子目录。
tbwoody2410:
开发板的型号(BOARD),对应于board/tbwoody2410目录。
NULL:
开发者/或经销商(vender)。
s3c24x0:
片上系统(SOC)。
3.修改include/configs/tbwoody2410.h文件
修改:
111行
#defineCFG_PROMPT“SMDK2410#”
为:
#defineCFG_PROMPT“tbwoody2410#”
这是u-boot的命令行提示符。
4.修改board/tbwoody2410/Makefile
将:
OBJS:
=smdk2410.oflash.o
改为:
OBJS:
=tbwoody2410.oflash.o
当然,tbwoody2410下的smdk2410.c在前面我们已经改成了tbwoody2410.c;
5.依照你自己开发板的内存地址分配情况修改board/tbwoody2410/lowlevel_init.S文件
#include
#include
#defineBWSCON0x48000000
/*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_Tacs0x3/*0clk*/
#defineB0_Tcos0x3/*0clk*/
#defineB0_Tacc0x7/*14clk*/
#defineB0_Tcoh0x3/*0clk*/
#defineB0_Tah0x3/*0clk*/
#defineB0_Tacp0x3
#defineB0_PMC0x3/*normal*/
/*BANK1CON*/
#defineB1_Tacs0x3/*0clk*/
#defineB1_Tcos0x3/*0clk*/
#defineB1_Tacc0x7/*14clk*/
#defineB1_Tcoh0x3/*0clk*/
#defineB1_Tah0x3/*0clk*/
#defineB1_Tacp0x3
#defineB1_PMC0x0
#defineB2_Tacs0x0
#defineB2_Tcos0x0
#defineB2_Tacc0x7
#defineB2_Tcoh0x0
#defineB2_Tah0x0
#defineB2_Tacp0x0
#defineB2_PMC0x0
#defineB3_Tacs0x0/*0clk*/
#defineB3_Tcos0x3/*4clk*/
#defineB3_Tacc0x7/*14clk*/
#defineB3_Tcoh0x1/*1clk*/
#defineB3_Tah0x0/*0clk*/
#defineB3_Tacp0x3/*6clk*/
#defineB3_PMC0x0/*normal*/
#defineB4_Tacs0x0/*0clk*/
#defineB4_Tcos0x0/*0clk*/
#defineB4_Tacc0x7/*14clk*/
#defineB4_Tcoh0x0/*0clk*/
#defineB4_Tah0x0/*0clk*/
#defineB4_Tacp0x0
#defineB4_PMC0x0/*normal*/
#defineB5_Tacs0x0/*0clk*/
#defineB5_Tcos0x0/*0clk*/
#defineB5_Tacc0x7/*14clk*/
#defineB5_Tcoh0x0/*0clk*/
#defineB5_Tah0x0/*0clk*/
#defineB5_Tacp0x0
#defineB5_PMC0x0/*normal*/
#defineB6_MT0x3/*SDRAM*/
#defineB6_Trcd0x1
#defineB6_SCAN0x1/*9bit*/
#defineB7_MT0x3/*SDRAM*/
#defineB7_Trcd0x1/*3clk*/
#defineB7_SCAN0x1/*9bit*/
/*REFRESHparameter*/
#defineREFEN0x1/*Refreshenable*/
#defineTREFMD0x0/*CBR(CASbeforeRAS)/Autorefresh*/
#defineTrp0x0/*2clk*/
#defineTrc0x3/*7clk*/
#defineTchr0x2/*3clk*/
#defineREFCNT1113/*period=15.6us,HCLK=60Mhz,(2048+1-15.6*60)*/
/**************************************/
_TEXT_BASE:
.wordTEXT_BASE
.globllowlevel_init
lowlevel_init:
/*memorycontrolconfiguration*/
/*maker0relativethecurrentlocationsothatit*/
/*readsSMRDATAoutofFLASHratherthanmemory!
*/
ldrr0,=SMRDATA
ldrr1,_TEXT_BASE
subr0,r0,r1
ldrr1,=BWSCON/*BusWidthStatusController*/
addr2,r0,#13*4
0:
ldrr3,[r0],#4
strr3,[r1],#4
cmpr2,r0
bne0b
/*everythingisfinenow*/
movpc,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.测试编译能否成功
[root@localhostu-boot-1.1.6]#maketbwoody2410_config
[root@localhostu-boot-1.1.6]#makeCROSS_COMPILE=arm-linux-
如果没有问题,在u-boot-1.1.6目录下就生成u-boot.bin,因为到这一步只是做了点小改动,
并未涉及敏感问题,测试一下可增加点信心.O(∩_∩)O~
7.在board/tbwoody2410下加入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;
}
8.修改cpu/arm920t/start.S文件
2410的启动代码可以在外部的NANDFLASH上执行,启动时,NANDFLASH的前4KB(地址为0x00000000,OM[1:
0]=0)
将被装载到SDRAM中被称为Setppingstone的地址中,然后开始执行这段代码。
启动以后,这4KB的空间可以做其他用途,
在start.S加入搬运代码如下:
174行
...........
...........
copy_loop:
ldmiar0!
{r3-r10}/*copyfromsourceaddress[r0]*/
stmiar1!
{r3-r10}/*copytotargetaddress[r1]*/
cmpr0,r2/*untilsourceendaddreee[r2]*/
blecopy_loop
/*08-6-24********************************************************/
#ifdefCONFIG_S3C2410_NAND_BOOT/*这个一定要放在堆栈设置之前*/
blcopy_myself
#endif/*CONFIG_S3C2410_NAND_BOOT*/
/*08-6-24********************************************************/
#endif/*CONFIG_SKIP_RELOCATE_UBOOT*/
/*Setupthestack*/
stack_setup:
..................
/**************************************************************************
*
*copyu-boottoram放在start.S靠后的位置
*
*************************************************************************
*/
#ifdefCONFIG_S3C2410_NAND_BOOT
/*
@copy_myself:
copyu-boottoram
*/
copy_myself:
movr10,lr
@resetNAND
movr1,#NAND_CTL_BASE
ldrr2,=0xf830@initialvalue
strr2,[r1,#oNFCONF]
ldrr2,[r1,#oNFCONF]
bicr2,r2,#0x800@enablechip
strr2,[r1,#oNFCONF]
movr2,#0xff@RESETcommand
strbr2,[r1,#oNFCMD]
movr3,#0@wait
1:
addr3,r3,#0x1
cmpr3,#0xa
blt1b
2:
ldrr2,[r1,#oNFSTAT]@waitready
tstr2,#0x1
beq2b
ldrr2,[r1,#oNFCONF]
orrr2,r2,#0x800@disablechip
strr2,[r1,#oNFCONF]
@getreadtocallCfunctions
ldrsp,DW_STACK_START@setupstackpointer
movfp,#0@nopreviousframe,sofp=0
@copyUBOOTtoRAM
ldrr0,_TEXT_BASE
movr1,#0x0
movr2,#0x20000
blnand_read_ll
teqr0,#0x0
beqok_nand_read
bad_nand_read:
1:
b1b@infiniteloop
ok_nand_read:
@verify
movr0,#0
ldrr1,_TEXT_BASE
movr2,#0x400@4bytes*1024=4K-bytes
go_next:
ldrr3,[r0],#4
ldrr4,[r1],#4
teqr3,r4
bnenotmatch
subsr2,r2,#4
beqdone_nand_read
bnego_next
notmatch:
1:
b1b
done_nand_read:
movpc,r10
#endif
@CONFIG_S3C2440_NAND_BOOT
DW_STACK_START:
.wordSTACK_BASE+STACK_SIZE-4
9.修改include/configs/tbwoody2410.h文件,添加如下内容:
/*08-6-25***************************************************/
/*-----------------------------------------------------------------------
*NANDFLASHBOOT
*/
#defineCONFIG_S3C2410_NAND_BOOT1
#defineSTACK_BASE0x33f00000
#defineSTACK_SIZE0x8000
#defineUBOOT_RAM_BASE0x30100000
#defineNAND_CTL_BASE0x4e000000
#definebINT_CTL(Nb)_REG(INT_CTL_BASE+(Nb))
#defineoNFCONF0x00
#defineoNFCMD0x04
#defineoNFADDR0x08
#defineoNFDATA0x0c
#defineoNFSTAT0x10
#defineoNFECC0x14
/*--------------------------------------------------------------------*/
#defineNAND_MAX_CHIPS1
10.修改board/tbwoody2410/Makefile
OBJS:
=tbwoody2410.oflash.onand_read.o
就是在后面加入了一个nand_read.o
11.重新测试