标题:
U-Boot启动过程完全分析(6)
[打印本页]
作者:
yuyang911220
时间:
2015-9-22 16:27
标题:
U-Boot启动过程完全分析(6)
下面再来分析
NAND Flash
启动部分代码:
nand_boot:
mov r1, #NAND_CTL_BASE
ldr r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
str r2, [r1, #oNFCONF]
/*
设置
NFCONF
寄存器
*/
/*
设置
NFCONT
,初始化
ECC
编
/
解码器,禁止
NAND Flash
片选
*/
ldr r2, =( (1<<4)|(0<<1)|(1<<0) )
str r2, [r1, #oNFCONT]
ldr r2, =(0x6)
/*
设置
NFSTAT */
str r2, [r1, #oNFSTAT]
/*
复位命令,第一次使用
NANDFlash
前复位
*/
mov r2, #0xff
strb r2, [r1, #oNFCMD]
mov r3, #0
/*
为调用
C
函数
nand_read_ll
准备堆栈
*/
ldr sp, DW_STACK_START
mov fp, #0
/*
下面先设置
r0
至
r2
,然后调用
nand_read_ll
函数将
U-Boot
读入
RAM */
ldr r0, =TEXT_BASE
/*
目的地址:
U-Boot
在
RAM
的开始地址
*/
mov r1, #0x0
/*
源地址:
U-Boot
在
NAND Flash
中的开始地址
*/
mov r2, #0x30000
/*
复制的大小,必须比
u-boot.bin
文件大,并且必须是
NAND Flash
块大小的整数倍,这里设置为
0x30000
(
192KB
)
*/
bl
nand_read_ll
/*
跳转到
nand_read_ll
函数,开始复制
U-Boot
到
RAM */
tst
r0, #0x0
/*
检查返回值是否正确
*/
beq stack_setup
bad_nand_read:
loop2: b loop2
//infinite loop
.align 2
DW_STACK_START: .wordSTACK_BASE+STACK_SIZE-4
其中
NAND_CTL_BASE
,
oNFCONF
等在
include/configs/mini2440.h
中定义如下:
#define NAND_CTL_BASE
0x4E000000
// NAND Flash
控制寄存器基址
#define STACK_BASE
0x33F00000
//base address of stack
#define STACK_SIZE
0x8000
//size of stack
#define oNFCONF
0x00
/*NFCONF
相对于
NAND_CTL_BASE
偏移地址
*/
#define oNFCONT
0x04
/*NFCONT
相对于
NAND_CTL_BASE
偏移地址
*/
#define oNFADDR
0x0c
/*NFADDR
相对于
NAND_CTL_BASE
偏移地址
*/
#define oNFDATA
0x10
/*NFDATA
相对于
NAND_CTL_BASE
偏移地址
*/
#define oNFCMD
0x08
/*NFCMD
相对于
NAND_CTL_BASE
偏移地址
*/
#define oNFSTAT
0x20
/*NFSTAT
相对于
NAND_CTL_BASE
偏移地址
*/
#define oNFECC
0x2c
/*NFECC
相对于
NAND_CTL_BASE
偏移地址
*/
NAND Flash
各个控制寄存器的设置在
S3C2440
的数据手册有详细说明,这里就不介绍了。
代码中
nand_read_ll
函数的作用是在
NAND Flash
中搬运
U-Boot
到
RAM
,该函数在
board/samsung/mini2440/nand_read.c
中定义。
NAND Flash
根据
page
大小可分为
2
种:
512B/page
和
2048B/page
的。这两种
NAND Flash
的读操作是不同的。因此就需要
U-Boot
识别到
NAND Flash
的类型,然后采用相应的读操作,也就是说
nand_read_ll
函数要能自动适应两种
NAND Flash
。
参考
S3C2440
的数据手册可以知道:根据
NFCONF
寄存器的
Bit3
(
AdvFlash(Read only)
)和
Bit2
(
PageSize(Read only)
)可以判断
NAND Flash
的类型。
Bit2
、
Bit3
与
NAND Flash
的
block
类型的关系如下表所示:
表
2.4
NFCONF
的
Bit3
、
Bit2
与
NAND Flash
的关系
Bit2
Bit3
0
1
0
256 B/page
512 B/page
1
1024 B/page
2048 B/page
由于的
NAND Flash
只有
512B/page
和
2048B/page
这两种,因此根据
NFCONF
寄存器的
Bit3
即可区分这两种
NAND Flash
了。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0