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

u-boot分析(九)html

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

今天咱们会用到的文档:.net

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

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

3.        210芯片手册:S5PV210_UM_REV1.1(个人不知道为何传不上去你们去百度搜吧)htm

4.        Nand flash芯片手册:你们根据本身的nand flash芯片型号,找到对应的手册blog

 

咱们今天会经过如下几点,对nand flash的初始化进行介绍:ci

1.      Nand flash简介文档

2.      Nand flash初始化get

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还有其余操做,好比复位,擦除等操做,其实其实现均可以仿照咱们实现读写的思路,进行实现。

相关文章
相关标签/搜索