基于s3c2410的uboot120的分析以及移植下篇.docx
- 文档编号:8522786
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:12
- 大小:21.40KB
基于s3c2410的uboot120的分析以及移植下篇.docx
《基于s3c2410的uboot120的分析以及移植下篇.docx》由会员分享,可在线阅读,更多相关《基于s3c2410的uboot120的分析以及移植下篇.docx(12页珍藏版)》请在冰豆网上搜索。
基于s3c2410的uboot120的分析以及移植下篇
8分析到此告一段落,下面进入uboot的具体移植
(1)创建自己的工作目录。
在board目录下创建自己的工作目录,将smdk2410目录下的内容全部拷贝到tc2410目录下。
cdboard
mkdirtc2410
cp-frboard/smdk2410board/tc2410
cpinclude/configs/smdk2410.hinclude/configs/tc2410.h
修改tc2410目录下相关的文件名以及makefile,。
在这个目录下需要添加nand_read.c文件,可以从vivi里面拷贝过来,nand_read.c文件主要实现了start.S文件中的nand_read_ll读写函数,用来将uboot拷贝到内存里去。
需要修改的地方:
mvsmdk2410.ctc2410.cCOBJS:
=tc2410.oflash.onand_read.o
修改顶层makefile,添加自己的信息:
tc2410_config :
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920ttc2410nulls3c24x0
(2)修改start.S
禁止中断部分也要修改
#ifdefined(CONFIG_S3C2410)
ldr r1,=0x7ff //根据2410芯片手册,INTSUBMSK有11位可用,
//vivi也是0x7ff,不知为什么U-Boot一直没改过来。
ldr r0,=INTSUBMSK
str r1,[r0]
#endif
将以下U-Boot的重定向语句替换:
这段relocate代码只对从norflash中启动的设备有效,因此可以去掉
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
relocate:
/*relocateU-BoottoRAM */
adr r0,_start /*r0<-currentpositionofcode */
ldr r1,_TEXT_BASE /*testifwerunfromflashorRAM*/
cmp r0,r1 /*don'trelocduringdebug */
beq stack_setup
ldr r2,_armboot_start
ldr r3,_bss_start
sub r2,r3,r2 /*r2<-sizeofarmboot */
add r2,r0,r2 /*r2<-sourceendaddress */
copy_loop:
ldmia r0!
{r3-r10} /*copyfromsourceaddress[r0] */
stmia r1!
{r3-r10} /*copyto targetaddress[r1] */
cmp r0,r2 /*untilsourceendaddreee[r2] */
ble copy_loop
#endif /*CONFIG_SKIP_RELOCATE_UBOOT*/
替换成:
#ifdefCONFIG_S3C2410_NAND_BOOT
@resetNAND
movr1,#NAND_CTL_BASE
ldr r2,=0xf830 @initialvalue
str r2,[r1,#oNFCONF]
ldr r2,[r1,#oNFCONF]
bic r2,r2,#0x800 @enablechip
str r2,[r1,#oNFCONF]
movr2,#0xff @RESETcommand
strbr2,[r1,#oNFCMD]
movr3,#0 @wait
nand1:
add r3,r3,#0x1
cmpr3,#0xa
blt nand1
nand2:
ldr r2,[r1,#oNFSTAT] @waitready
tst r2,#0x1
beq nand2
ldr r2,[r1,#oNFCONF]
orr r2,r2,#0x800 @disablechip
str r2,[r1,#oNFCONF]
@getreadtocallCfunctions(fornand_read())
ldr sp,DW_STACK_START @setupstackpointer
movfp,#0 @nopreviousframe,sofp=0
@copyU-BoottoRAM
ldr r0,=TEXT_BASE
mov r1,#0x0
movr2,#0x20000
bl nand_read_ll这个函数在nand_read.c中实现
tst r0,#0x0
beq ok_nand_read
bad_nand_read:
loop2:
b loop2 @infiniteloop
ok_nand_read:
@verify
movr0,#0
ldr r1,=TEXT_BASE
movr2,#0x400 @4bytes*1024=4K-bytes,这句话的意思在start.S中已注释。
go_next:
ldr r3,[r0],#4
ldr r4,[r1],#4
teq r3,r4
bne notmatch
subsr2,r2,#4
beq stack_setup
bne go_next
notmatch:
loop3:
b loop3 @infiniteloop
#endif@CONFIG_S3C2410_NAND_BOOT
在“ _start_armboot:
.wordstart_armboot ”后加入:
.align 2
DW_STACK_START:
.word STACK_BASE+STACK_SIZE-4
start.S文件修改到此结束。
(3)在include/configs/tc2410.h头文件中添加nandflash的初始化信息,这个文件与板子密切相关,需要修改的地方也很多。
具体添加信息/*//添加的内容
//#defineCFG_ENV_IS_IN_FLASH1
#defineCFG_ENV_IS_IN_NAND1
#defineCFG_ENV_OFFSET0x020000
#defineCFG_NAND_BASE0x4E000000
#defineCMD_SAVEENV
#defineCFG_NAND_LEGACY
#defineCFG_ENV_SIZE0x10000/*TotalSizeofEnvironmentSector*/
#defineCFG_MONITOR_BASEPHYS_SDRAM_1
#if(CONFIG_COMMANDS&CFG_CMD_NAND)
#defineCFG_NAND_BASE0x4E000000
/*NandFlash控制器在SFR区起始寄存器地址*/
#defineCFG_MAX_NAND_DEVICE1
/*支持的最在NandFlash数据*/
#defineSECTORSIZE512
/*1页的大小*/
#defineNAND_SECTOR_SIZESECTORSIZE
#defineNAND_BLOCK_MASK511
/*页掩码*/
#defineADDR_COLUMN1
/*一个字节的Column地址*/
#defineADDR_PAGE3
/*3字节的页块地址!
!
!
!
!
*/
#defineADDR_COLUMN_PAGE4
/*总共4字节的页块地址!
!
!
!
!
*/
#defineNAND_ChipID_UNKNOWN0x00
/*未知芯片的ID号*/
#defineNAND_MAX_FLOORS1
#defineNAND_MAX_CHIPS1
/*NandFlash命令层底层接口函数*/
#defineWRITE_NAND_COMMAND(d,adr){rNFCMD=d;}
#defineWRITE_NAND_ADDRESS(d,adr){rNFADDR=d;}
#defineWRITE_NAND(d,adr){rNFDATA=d;}
#defineREAD_NAND(adr)(rNFDATA)
#defineNAND_WAIT_READY(nand){while(!
(rNFSTAT&(1<<0)));}
#defineNAND_DISABLE_CE(nand){rNFCONF|=(1<<11);}
#defineNAND_ENABLE_CE(nand){rNFCONF&=~(1<<11);}
/*thefollowingfunctionsareNOP'sbecauseS3C24X0handlesthisinhardware一定要加上*/
#defineNAND_CTL_CLRALE(nandptr)
#defineNAND_CTL_SETALE(nandptr)
#defineNAND_CTL_CLRCLE(nandptr)
#defineNAND_CTL_SETCLE(nandptr)
/*允许NandFlash写校验*/
#defineCONFIG_MTD_NAND_VERIFY_WRITE1
//添加的内容
/*
*NandflashBoot
*/
#defineCONFIG_S3C2410_NAND_BOOT1
#defineSTACK_BASE0x33f00000
#defineSTACK_SIZE0x8000
#defineUBOOT_RAM_BASE0x33f80000
/*NANDFlashController*/
#defineNAND_CTL_BASE0x4E000000
#definebINT_CTL(Nb)__REG(INT_CTL_BASE+(Nb))
/*Offset*/
#defineoNFCONF0x00
#defineoNFCMD0x04
#defineoNFADDR0x08
#defineoNFDATA0x0c
#defineoNFSTAT0x10
#defineoNFECC0x14
#definerNFCONF(*(volatileunsignedint*)0x4e000000)
#definerNFCMD(*(volatileunsignedchar*)0x4e000004)
#definerNFADDR(*(volatileunsignedchar*)0x4e000008)
#definerNFDATA(*(volatileunsignedchar*)0x4e00000c)
#definerNFSTAT(*(volatileunsignedint*)0x4e000010)
#definerNFECC(*(volatileunsignedint*)0x4e000014)
#definerNFECC0(*(volatileunsignedchar*)0x4e000014)
#definerNFECC1(*(volatileunsignedchar*)0x4e000015)
#definerNFECC2(*(volatileunsignedchar*)0x4e000016)
#endif/*CONFIG_COMMANDS&CFG_CMD_NAND*/
#endif/*__CONFIG_H*/
(4)我使用的是勤研开发板,在vivi里面并没有找到关于内存区配置的信息。
lowlevel.init文件不知道如何修改。
看见网上很多人说根据开发板的内存区情况配置,我找了半天没找到,郁闷至极。
。
。
不过没有影响我成功移植,:
-)
(5)在include/linux/mtd/nand_ids.h的结构体nand_flash_ids加入nandflash的具体信息。
staticstructnand_flash_devnand_flash_ids[]={
......
{"SamsungKM29N16000",NAND_MFR_SAMSUNG,0x64,21,1,2,0x1000,0},
{"SamsungK9F1208U0B", NAND_MFR_SAMSUNG,0x76,26,0,3,0x4000,0},
{"Samsungunknown4Mb",NAND_MFR_SAMSUNG,0x6b,22,0,2,0x2000,0},
......
{NULL,}
};
(6)修改/lib_arm中的board.c。
staticintdisplay_banner(void)
{
printf("\n\n%s\n\n",version_string);
debug("U-Bootcode:
%08lX->%08lX BSS:
->%08lX\n",
_armboot_start,_bss_start,_bss_end);
printf("U-Bootcode:
%08lX->%08lX BSS:
->%08lX\n",输出_armboot_start地址信息
_armboot_start,_bss_start,_bss_end);
#ifdefCONFIG_MODEM_SUPPORT
debug("ModemSupportenabled\n");
#endif
#ifdefCONFIG_USE_IRQ
debug("IRQStack:
%08lx\n",IRQ_STACK_START);
debug("FIQStack:
%08lx\n",FIQ_STACK_START);
#endif
return(0);
}
(7)修改common/env_nand.c,具体nandflash的擦写需要使用nand_legacy_erase等函数实现,而不是nand-erase()函数
......
#ifdefCONFIG_INFERNO
#errorCONFIG_INFERNOnotsupportedyet
#endif
intnand_legacy_rw(structnand_chip*nand,intcmd,
size_tstart,size_tlen,
size_t*retlen,u_char*buf);
externstructnand_chipnand_dev_desc[CFG_MAX_NAND_DEVICE];
externintnand_legacy_erase(structnand_chip*nand,size_tofs,size_tlen,intclean);
/*infoforNANDchips,definedindrivers/nand/nand.c*/
externnand_info_tnand_info[CFG_MAX_NAND_DEVICE];
......
#else/*!
CFG_ENV_OFFSET_REDUND*/
intsaveenv(void)
{
ulongtotal;
intret=0;
puts("ErasingNand...");
//if(nand_erase(&nand_info[0],CFG_ENV_OFFSET,CFG_ENV_SIZE))
if(nand_legacy_erase(nand_dev_desc+0,CFG_ENV_OFFSET,CFG_ENV_SIZE,0))
return1;
puts("WritingtoNand...");
total=CFG_ENV_SIZE;
//ret=nand_write(&nand_info[0],CFG_ENV_OFFSET,&total,(u_char*)env_ptr);
ret=nand_legacy_rw(nand_dev_desc+0,
0x00|0x02,CFG_ENV_OFFSET,CFG_ENV_SIZE,
&total,(u_char*)env_ptr);
if(ret||total!
=CFG_ENV_SIZE)
return1;
puts("done\n");
returnret;
......
#else/*!
CFG_ENV_OFFSET_REDUND*/
/*
*ThelegacyNANDcodesavedtheenvironmentinthefirstNANDdevicei.e.,
*nand_dev_desc+0.ThisisalsothebehaviourusingthenewNANDcode.
*/
voidenv_relocate_spec(void)
{
#if!
defined(ENV_IS_EMBEDDED)
ulongtotal;
intret;
total=CFG_ENV_SIZE;
//ret=nand_read(&nand_info[0],CFG_ENV_OFFSET,&total,(u_char*)env_ptr);
ret=nand_legacy_rw(nand_dev_desc+0,0x01|0x02,CFG_ENV_OFFSET,CFG_ENV_SIZE,&total,(u_char*)env_ptr);
(8)在/board/tc2410/tc2410.c文件的末尾添加对NandFlash的初始化函数(在后面NandFlash的操作都要用到)
u-boot运行至第二阶段进入start_armboot()函数。
其中nand_init()函数是对nandflash的最初初始化函数。
Nand_init()函数在两个文件中实现。
其调用与CFG_NAND_LEGACY宏有关,如果没有定义这个宏,系统调用drivers/nnd/nand.c中的nand_init();否则调用board/smdk2410/smdk2410.c中的nand_init()函数。
这里我选择第二种方式。
#if(CONFIG_COMMANDS&CFG_CMD_NAND)
typedefenum{
NFCE_LOW,
NFCE_HIGH
}NFCE_STATE;
staticinlinevoidNF_Conf(u16conf)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFCONF=conf;
}
staticinlinevoidNF_Cmd(u8cmd)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFCMD=cmd;
}
staticinlinevoidNF_CmdW(u8cmd)
{
NF_Cmd(cmd);
udelay
(1);
}
staticinlinevoidNF_Addr(u8addr)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFADDR=addr;
}
staticinlinevoidNF_SetCE(NFCE_STATEs)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
switch(s){
caseNFCE_LOW:
nand->NFCONF&=~(1<<11);
break;
caseNFCE_HIGH:
nand->NFCONF|=(1<<11);
break;
}
}
staticinlinevoidNF_WaitRB(void)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
while(!
(nand->NFSTAT&(1<<0)));
}
staticinlinevoidNF_Write(u8data)
{
S3C2410_NAND*constnand=S3C2410_GetBase_NAND();
nand->NFDATA=data;
}
staticinlineu8NF_Read(void)
{
S3C2410_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 s3c2410 uboot120 分析 以及 移植 下篇