重定位之前,要将 flash 初始化,flash 的初始化分为 norflash 和 nandflash,norflash 不用初始化,所以不用做任何操作
3.1 nandflash 初始化
在 nandflash 初始化之前,需要设置栈:
1 /** 6. 重定位:把 bootloader 本身的代码从flash 复制到它的链接地址中 */
2 /** copy_code_to_sdram 用 C语言写,需要先设置栈 */
3 ldr sp, =0x34000000 /** 栈指向 SDRAM 的顶端 */
进入初始化:
1 bl nand_init
nandflash 初始化需要注意两个内容,一个是 s3c2440 手册的第 6 章 nandflash 控制器,一个是 nandflash 的芯片手册。
3.1.1 寄存器 NFCONF
要注意两个寄存器,是初始化需要操作的:
注意图中标记的三个寄存器参数,这三个参数与 nandflash 控制器的时序有关:
发出 CLE/ALE 之后,一个写信号 nWE 需要多久变为低电平,nWE 变为低电平后,CLE/ALE 又需要保存多长时间才能变为低电平。
nWE 中的低电平为 /WE 中的 twp 处位置,为写信号的脉冲宽度,最小为 12 ns,最小值都是通过 nandflash 手册得到的,如下:
HCLK * (TWRPH0 + 1) >= 12ns
自己设置的时钟FCLK(CPU主频是 400MHZ),分频比是 FCLK: HCLK: PCLK = 1:4:8,那么 HCLK 是100MHZ,即为10ns;则 10 * (TWRPH0 + 1) >= 12,TWRPH0 >= 0.2,那么 TWRPH0 可以设置为 1。
发出 CLE 和 ALE 之后,过多少时间才能发出写信号?time = tcls - twp >= 0,这里说明 CLE 信号和 WE 信号可以同时发出,那么可以将 TACLS 时间设置为 0,即发出 CLE 后,立即发出写信号。
TWRPH1 表示写信号变为高电平之后,CLE 和 ALE 还需要维持多长时间,从 nandflash 时序图和手册,可以知道 tclh >= 5ns,则 10 * (TWRPH1 + 1) >= 5,则 TWRPH1 >= 0。
3.1.2 寄存器 NFCONT
这个寄存器需要设置 MODE(NAND Flash 控制器运行模式),要使能 nandflash;Reg_nCE(NAND Flash 存储器的 nFCE 信号控制),我们是引导期间,所以要使能片选;InitECC,虽然在引导期间不会使用 ECC,但是也要进行 ECC 初始化。
3.1.3 初始化代码
1 void nand_init(void)
2 {
3 #define TACLS 0
4 #define TWRPH0 1
5 #define TWRPH1 0
6
7 /** 设置时序 */
8 NFCONF = (TACLS << 12) | (TWRPH0 << 8) | (TWRPH1 << 4);
9 /** 使能 NND Flash 控制器, 初始化 ECC, 禁止片选 */
10 NFCONT = (1 << 4) | (1 << 1) | (1 << 0);
11 }