开发板是FL2440,nand flash型号为:HY27UF082G2B,2048大页面的nandflash。bootloader是自己移植的u-boot,已实现nandflash烧写、擦除功能。移植从nand flash启动功能时,自己写了一段汇编程序,如下。 这段代码调试了很久也没通过,串口终端没有任何反映。调试方法很简陋,只是用板上的四个LED灯。实在是没办法了,才向坛子里的高手请教,看看到底哪里出了问题。绝对没有不劳而获的想法。小弟是新手,还在玩bootloader!望各位高手不吝赐教!
#define CFG_NAND_REG_BASE 0x4E000000 //s3c2440 nandflash控制器寄存器组起始地址
#define CFG_MONITOR_SIZE 0x00020000 //从nandflash复制到内存中的u-boot的大小
#define CFG_MONITOR_RAM_BASE 0x33F80000 //复制到内存中的地址
#define CFG_MONITOR_NAND_BASE 0x00000000 //u-boot在nandflash中的起始地址
#define CONFIG_NAND_BOOT 1 //从nandflash启动
/*s3c2440 nandflash控制器各寄存器地址偏移量*/
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFADDR 0x0C
#define oNFDATA 0x10
#define oNFSTAT 0x20
#ifdef CONFIG_NAND_BOOT
ldr r0, =CFG_NAND_REG_BASE
ldr r1, =((1<<12)|(4<<8)|(1<<4)|(0<<0)) //TACLS=1,TWRPH0=4, TWRPH1=1
str r1, [r0, #oNFCONF]
ldr r1, =((1<<6)|(1<<5)|(1<<4)|(0<<1)|(1<<0)) //使能NAND控制器,片选芯片,初始化ECC
str r1, [r0, #oNFCONT]
mov r1, #0x6 //RnB 清除
strb r1, [r0, #oNFSTAT]
mov r1, #0xff //复位command
strb r1, [r0, #oNFCMD]
rst_wait: //复位等待就绪
ldr r1, [r0, #oNFSTAT]
tst r1, #0x1
beq rst_wait
ldr r2, =CFG_MONITOR_RAM_BASE //内存复制地址
ldr r3, =CFG_MONITOR_NAND_BASE //nandflash复制起始地址
copy_monitor:
mov r1, #0x00 //写读页第一命令序列命令字
strb r1, [r0, #oNFCMD]
and r4, r3, #0xff //写第一地址序列
strb r4, [r0, #oNFADDR]
mov r4, r3, lsr #8
and r4, r4, #0x0f //写第二地址序列
strb r4, [r0, #oNFADDR]
mov r4, r3, lsr #12
and r4, r4, #0xff //写第三地址序列
strb r4, [r0, #oNFADDR]
mov r4, r3, lsr #20
and r4, r4, #0xff //写第四地址序列
strb r4, [r0, #oNFADDR]
mov r4, r3, lsr #28
and r4, r4, #0x01 //写第五地址序列
strb r4, [r0, #oNFADDR]
mov r1, #0x30 //写读页第二命令序列命令字
strb r1, [r0, #oNFCMD]
mov r1, #0x70 //写读状态寄存器命令
strb r1, [r0, #oNFCMD]
wait_ready:
ldrb r1, [r0, #oNFDATA] //等待就绪
and r1, r1, #0x40
teq r1, #0x40
bne wait_ready
mov r5, #0
copy_page: //复制一页数据到内存中
ldr r1, [r0, #oNFDATA]
str r1, [r2], #4
add r5, r5, #4
cmp r5, #2048
blt copy_page
/*复制64页,128K*/
add r3, r3, #0x1000 //新一页的起始地址
ldr r5, =CFG_MONITOR_SIZE
cmp r3, r5, lsl #1
blt copy_monitor
ldr r1, [r0, #oNFCONT] //禁止芯片
orr r1, r1, #0x02
str r1, [r0, #oNFCONT]
/*检查搬移后的数据,如果steppingston到内存中的前1k与从nandflash复制到CFG_MONITOR_RAM_BASE处的数据完全相同,表示搬移成功*/
mov r0, #0
ldr r1, =CFG_MONITOR_RAM_BASE
mov r2, #0x400
copy_complete:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne err
subs r2, r2, #4
beq stack_setup
bne copy_complete
err:
loop: b loop
#endif |