u-boot分析(九)----nand flash初始化|nand flash读写分析

u-boot分析(九)

  上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析。

今天我们会用到的文档:

1.        2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949

2.        6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965

3.        210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)

4.        Nand flash芯片手册:大家根据自己的nand flash芯片型号,找到对应的手册

 

我们今天会通过以下几点,对nand flash的初始化进行介绍:

1.      Nand flash简介

2.      Nand flash初始化

3.      Nand flash读写操作

 

l  Nand flash简介

1.       分类

Nand flash闪存芯片又分为

1)        SLC(单层单元,每个存储格上存一个)

2)        MLC(多层单元,每个存储格上存两个)

3)        TLC(三层单元,每个存储格上存三个)

2.       访问方式

类似与我们单片机里面的外设,其有自己的控制器,可以对数据解析,我们要按照固定的格式和协议进行访问。

3.       地址构成

Nand flash芯片手册中我们很容易找到其构成图,我们结合下图对其进行简单分析

1)        device一个Nand flash可以分为多个block

2)        block一个block可以分为多个pages

3)        page一个page可以分为两个区,分别为数据区信息区(包括校验码等内容)

其地址构成分为:

行地址:表示要访问的页在块中的页编号

列地址:表示要访问的地址在该页中的偏移

l  Nand flash初始化

通过上面的分析我们对nand的基本信息有了了解,下面我们来分析其初始化,同样我们可以参考u-boot给出的代码得出其初始化流程:

1)        设置管脚

2)        初始化NFCONF寄存器

3)        初始化NFCONT寄存器

1.       初始化NFCONF寄存器

在初始化NFCONF寄存器的时候我们要特别注意下面几个值(这三个值是将nand flash和我们芯片自有的nand flash控制器的时序相匹配的重要值):TACLSTWRPH0TWRPH1

 

我们可以在我们的芯片手册中找到nand flash控制器所提供的时序图,其中TACLSTWRPH0TWRPH1是我们自己可以配置的。

同时可以在nand flash芯片手册中找到其所需要的时序图,如下

简单通过时序比较我们就可以清楚的知道,TACLSTWRPH0TWRPH1分别对应tCLStwptCLH

那么其所需要的这些值的大小到底是多少呢?我们通过nand的芯片手册就可以找到下表,其中的值是该时序所需的最小值

通过以上分析,我们再结合在http://www.cnblogs.com/wrjvszq/p/4227435.html一文中设置的系统时钟,就可以轻松的设置我们的NFCONF寄存器了,NFCONT寄存器设置比较简单,按照寄存器说明即可,在此也就不过多分析了。

 

 1 /*
 2  * Nand Interface Init for SMDKC110
 3  */
 4 nand_asm_init:
 5 
 6     /* Setting GPIO for NAND */
 7     /* This setting is NAND initialze code at booting time in iROM. */
 8 
 9     ldr    r0, =ELFIN_GPIO_BASE
10 
11     ldr    r1, [r0, #MP01CON_OFFSET]
12     bic    r1, r1, #(0xf<<8)
13     orr    r1, r1, #(0x3<<8)
14     str    r1, [r0, #MP01CON_OFFSET]
15 
16     ldr    r1, [r0, #MP01PUD_OFFSET]
17     bic    r1, r1, #(0x3<<4)
18     str    r1, [r0, #MP01PUD_OFFSET]
19 
20     ldr    r1, [r0, #MP03CON_OFFSET]
21     bic    r1, r1, #0xFFFFFF
22     ldr    r2, =0x22222222
23     orr    r1, r1, r2
24     str    r1, [r0, #MP03CON_OFFSET]
25 
26     ldr    r1, [r0, #MP03PUD_OFFSET]
27     ldr    r2, =0x3fff
28     bic    r1, r1, r2
29     str    r1, [r0, #MP03PUD_OFFSET]
30 
31     ldr    r0, =ELFIN_NAND_BASE
32 
33     ldr    r1, [r0, #NFCONF_OFFSET]
34     ldr    r2, =0x777F
35     bic    r1, r1, r2
36     ldr    r2, =NFCONF_VAL
37     orr    r1, r1, r2
38     str    r1, [r0, #NFCONF_OFFSET]
39 
40     ldr    r1, [r0, #NFCONT_OFFSET]
41     ldr    r2, =0x707C7
42     bic    r1, r1, r2
43     ldr    r2, =NFCONT_VAL
44     orr    r1, r1, r2
45     str    r1, [r0, #NFCONT_OFFSET]
46 
47     ldr    r1, [r0, #NFCONF_OFFSET]
48     orr    r1, r1, #0x70
49     orr    r1, r1, #0x7700
50     str     r1, [r0, #NFCONF_OFFSET]
51 
52     ldr    r1, [r0, #NFCONT_OFFSET]
53     orr    r1, r1, #0x03
54     str     r1, [r0, #NFCONT_OFFSET]
55 
56     mov    pc, lr

 

 

经过上述内容我们对nand的初始化有了一定的了解,u-boot在此阶段做的内容也就完成了,但是为了不在以后返回来分析nand,我们今天趁热打铁,将其的读写操作一同分析。

l  Nand flash读写操作

1.       读操作

我们的nand flash支持两种读操作,一种是页读(整页读取,只需用行地址),一种是随机读(随机读取,需要行列地址),今天我们重点分析页读,随机读取跟其类似。

按照以前自己在做单片机时候的经验,我们既然要和外设通信,那么就必须按照外设自身所规定的时序发送内容,所以自己在nand芯片手册中找到了读操作的时序图(如下),根据此时序图我们可以很容易总结出读操作的流程,有了流程我们的代码实现起来就比较简单了。

1.        选中nand芯片

2.        清除rb

3.        发送0x00

4.        发送列地址

5.        发送行地址

6.        发送0x30

7.        等待R/B

8.        读数据

9.        取消选中

2.       写操作

我们的nand flash同样支持两种写操作,一种是页写(整页写入,只需用行地址),一种是随机写(随机写入,需要行列地址),今天我们重点分析页写,随机写入跟其类似。

同样我们可以在nand芯片手册中找到写操作的时序图(如下),根据此时序图我们可以很容易总结出写操作的流程,有了流程我们的代码实现起来就比较简单了。

1.        选中nand芯片

2.        清除rb

3.        发送0x80命令

4.        发送列地址

5.        发送行地址

6.        写入数据

7.        发送0x10命令

8.        等待R/B

9.        发送0x70命令

10.    读取写入结果

11.    取消选中

经过上述内容我们对nand的读写操作进行了简单的流程分析,对于nand还有其他操作,比如复位,擦除等操作,其实其实现都可以仿照我们实现读写的思路,进行实现。

 

 

posted @ 2015-01-21 22:36  wrjvszq  阅读(3655)  评论(0编辑  收藏  举报