好文档 - 专业文书写作范文服务资料分享网站

嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔

天下 分享 时间: 加入收藏 我要投稿 点赞

// 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

嵌入式Linux之我行 史上最牛最详细的uboot移植,不看别后悔

//if(!chip&&((result&0x80)==(data&0x80)))//chip=READY;//if(!chip&&((result&0xFFFF)&BIT_PROGRAM_ERROR)){//result=*addr;
推荐度:
点击下载文档文档为doc格式
1llk84bive8wrp7237rx
领取福利

微信扫码领取福利

微信扫码分享