三、编写 s3c24x0 的 bootloader——重定位(一)

2024-08-26  

重定位之前,要将 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 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。