1、重定位u-boot代码
目前u-boot还没对2440中的Nand Flash支持,也就是说要想u-boot从Nand Flash上启动,必须要将u-boot代码从flash上拷贝到sdram中去。
1)、在include/configs/gec2440.h头文件中定义Nand要用到的宏和寄存器,如下:
//在文件末尾加入以下Nand Flash相关定义(在最后一句#endif /* __CONFIG_H */之前):
/*
* 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启动的。修改部分如下:
2. 、修改cpu/arm920t/start.S
//注意:在上面Nor Flash启动中,我们为了把u-boot用bootloader下载到内存中运行而屏蔽掉这段有关CPU初始化的代码。而现在我们要把u-boot下载到Nand Flash中,从Nand Flash启动,所以现在要恢复这段代码,把其注释去掉。推荐教程:C语言
#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 cmp r3, #0xa blt nand1
nand2:
ldr r2, [r1, #oNFSTAT] // 等待就绪 tst r2, #0x4 beq nand2
ldr r2, [r1, #oNFCONT]
orr r2, r2, #0x2 // 取消片选 str r2, [r1, #oNFCONT]
//get read to call C functions (for nand_read())
ldr sp, DW_STACK_START //为C代码准备堆栈,DW_STACK_START定义在下面 mov fp, #0 // no previous frame, so fp=0 R11 帧指针寄存器
//copy U-Boot to RAM
ldr r0, =TEXT_BASE// 传递给C 代码的第一个参数:u-boot 在RAM 中的起始地址 mov r1, #0x0 // 传递给C 代码的第二个参数:Nand Flash 的起始地址 mov r2, #0x30000 // 传递给C 代码的第三个参数:u-boot 的长度大小(128k) bl nand_read_ll // 此处调用C 代码中读Nand 的函数,现在还没有要自己编写实现 tst r0, #0x0 beq ok_nand_read
bad_nand_read:
loop2: b loop2 //infinite loop
ok_nand_read:
// 检查搬移后的数据,如果前4k 完全相同,表示搬移成功 mov r0, #0 ldr r1, =TEXT_BASE mov r2, #0x400 //4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4 ldr r4, [r1], #4 teq r3, r4 bne notmatch subs r2, r2, #4 beq stack_setup bne go_next
notmatch:
loop3: b loop3 //infinite loop
#endif //CONFIG_S3C2440_NAND_BOOT
_start_armboot: .word start_armboot //在这一句的下面加上DW_STACK_START的定义
.align 2
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4 |
u-boot移植五部之第三步
最新推荐文章于 2024-08-28 14:59:04 发布