搞了3天终于是可以把Nand Flash的Uboot代码拷到内存了,真郁闷......
/*板子为FL2440,接了一片256M的K9F2G08UXA,一页2048+64,交叉编绎工*具cross-3.3.2.tar.bz2*/ NFCONF EQU 0x4E000000 NFCONT EQU 0x4E000004 NFCMD EQU 0x4E000008 NFADDR EQU 0x4E00000C NFDATA EQU 0x4E000010 NFSTAT EQU 0x4E000020 NF_SECTOR_SIZE EQU 2048 AREA |DATA|,CODE,READONLY ENTRY ldr r13,=0x1000 ldr r0, =0 //要拷贝的FLASH数据首地址 ldr r7, =0 //当前拷贝实际字节数 mov r1, #0x33000000 //拷贝到内存的首地址 ldr r2, =0x0 ldr r3, =102400 sub r2, r3, r2 //R2=要拷贝的总字节数 add r2, r0, r2 //R2=要拷贝的FLASH数据尾地址 ldr r3, =NFCONF mov r4, #0x300 str r4, [r3] //NFCONF=0x300,初始化FLASH ldr r3, =NFCONT mov r4, #0x11 str r4, [r3] //NFCONT=0x11,初始化FLASH ldr r3, =NFCMD mov r4, #0xff str r4, [r3] //NFCMD==0xff,reset FLASH wait1 ldr r5, =NFSTAT ldr r4, [r5] tst r4, #1 beq wait1 //等待直到FLASH不忙 copy_loop mov r4, #0x00 ldr r3, =NFCMD str r4, [r3] //NFCMD=0x00,读命令 /*写入要读取的FLASH地址R0*/ ldr r5, =NFADDR and r4, r0, #0xff str r4, [r5] mov r4, r0, lsr#8 and r4, r4, #0x0f str r4, [r5] mov r4, r0, lsr#12 and r4, r4, #0xff str r4, [r5] mov r4, r0, lsr#20 and r4, r4, #0xff str r4, [r5] mov r4, r0, lsr#28 and r4, r4, #0x01 str r4, [r5] mov r4, #0x30 str r4, [r3] //NFCMD=0x30,读命令 ldr r3, =NFSTAT wait0 ldr r4, [r3] tst r4, #1 beq wait0 //等待FLASH不忙 ldr r3, =NF_SECTOR_SIZE mov r4, #0 ldr r5, =NFDATA /*一次读取一页(2048字节)*/ copy1sector ldr r6, [r5] //读FLASH数据,4字节 str r6, [r1] //写入内存,4字节 add r0, r0, #4 add r1, r1, #4 add r4, r4, #4 add r7, r7, #4 cmp r4, r3 bcc copy1sector //未读完一页继续 add r0, r0, #2048 //读下一页之前读地址+2048 cmp r7, r2 ble copy_loop //未读完所有数据继续读下一页 ldr r0, =NFCONT ldr r1, [r0] orr r1, r1, #0x2 str r1, [r0] //禁止FLASH片选 IMPORT LedMain b LedMain END
因为两个地方没搞明白所以搞了这么久,哎。。。
第一:代码第73行,原本以为读NFDATA每次只能读一字节数据,没想到是4字节!
第二:代码第81行,现在还没搞明白为什么数据没有存在连续的页里面,只是读数据的时候偶然发现数据是每隔一页一写的,不晓得是不是哪里理解错了,我是用H-FLASHER把Uboot烧进NAND FLASH的。