// if (!chip && ((result & 0x80) == (data & 0x80))) // chip = READY;
// if (!chip && ((result & 0xFFFF) & BIT_PROGRAM_ERROR)) { // result = *addr;
// if ((result & 0x80) == (data & 0x80)) // chip = READY; // else
// chip = ERR; // }
//} while (!chip);
//*addr = CMD_READ_ARRAY;
//if (chip == ERR || *addr != data) // rc = ERR_PROG_ERROR; while (1) {
if ((*addr & 0x40) != (*addr & 0x40)) continue;
if ((*addr & 0x80) == (data & 0x80)) {
rc = ERR_OK; break; } }
修改完后重新编译u-boot,下载到RAM中运行结果如下图:
从运行结果图看,Nor Flash的大小可以正确检测到了,命令行前面的名字也由原来的SMDK2410改成我自己定义的[MY2440]了,但是还会出现bad CRC的警告信息,其实这并不是什么问题,只是还没有将环境变量设置到Nor Flash中,我们执行一下u-boot的:saveenv命令就可以了。如下图:
再重新下载u-boot.bin文件到RAM中运行,可以观察到不会出现警告信息了,这时候u-boot已经对我们开发板上的Nor Flash完全支持了。如下:
5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand Flash的支持)。 目前u-boot中还没有对2440上Nand Flash的支持,也就是说要想u-boot从Nand Flash上启动得自己去实现了。
首先,在include/configs/my2440.h头文件中定义Nand要用到的宏和寄存器,如下:
#gedit include/configs/my2440.h //在文件末尾加入以下Nand Flash相关定义 /* * Nand flash register and envionment variables */ #define CONFIG_S3C2440_NAND_BOOT 1 #define NAND_CTL_BASE 0x4E000000 //Nand Flash配置寄存器基地址,查2440手册可得知 #define STACK_BASE 0x33F00000 //定义堆栈的地址 #define STACK_SIZE 0x8000 //堆栈的长度大小 #define oNFCONF 0x00 //相对Nand配置寄存器基地址的偏移量,还是配置寄存器的基地址 #define oNFCONT 0x04 //相对Nand配置寄存器基地址的偏移量,可得到控制寄存器的基地址(0x4E000004) #define oNFADDR 0x0c //相对Nand配置寄存器基地址的偏移量,可得到地址寄存器的基地址(0x4E00000c) #define oNFDATA 0x10 //相对Nand配置寄存器基地址的偏移量,可得到数据寄存器的基地址(0x4E000010) #define oNFCMD 0x08 //相对Nand配置寄存器基地址的偏移量,可得到指令寄存器的基地址(0x4E000008) #define oNFSTAT 0x20 //相对Nand配置寄存器基地址的偏移量,可得到状态寄存器的基地址(0x4E000020) #define oNFECC 0x2c //相对Nand配置寄存器基地址的偏移量,可得到ECC寄存器的基地址(0x4E00002c) 其次,修改cpu/arm920t/start.S这个文件,使u-boot从Nand Flash启动,在上一节中提过,u-boot默认是从Nor Flash启动的。修改部分如下:
#gedit cpu/arm920t/start.S //注意:在上一篇Nor Flash启动中,我们为了把u-boot用supervivi下载到内存中运行而屏蔽掉这段有关CPU初始化的代码。而现在我们要把u-boot下载到Nand Flash中,从Nand Flash启动,所以现在要恢复这段代码。 #ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit #endif #if 0 //屏蔽掉u-boot中的从Nor Flash启动部分 #ifndef CONFIG_SKIP_RELOCATE_UBOOT relocate: /* relocate U-Boot to RAM */ adr r0, _start /* r0 <- current position of code */ ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc during debug */ beq stack_setup ldr r2, _armboot_start ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */ add r2, r0, r2 /* r2 <- source end address */ copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */ stmia r1!, {r3-r10} /* copy to target address [r1] */ cmp r0, r2 /* until source end addreee [r2] */ ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */ #endif
//下面添加2440中u-boot从Nand Flash启动 #ifdef CONFIG_S3C2440_NAND_BOOT
mov r1, #NAND_CTL_BASE //复位Nand Flash ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF] //设置配置寄存器的初始值,参考s3c2440手册 ldr r2, [r1, #oNFCONF]
ldr r2, =( (1<<4)|(0<<1)|(1<<0) )
str r2, [r1, #oNFCONT] //设置控制寄存器 ldr r2, [r1, #oNFCONT]
ldr r2, =(0x6) //RnB Clear str r2, [r1, #oNFSTAT] ldr r2, [r1, #oNFSTAT]
mov r2, #0xff //复位command strb r2, [r1, #oNFCMD] mov r3, #0 //等待 nand1:
add r3, r3, #0x1