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還有其餘操做,好比復位,擦除等操做,其實其實現均可以仿照咱們實現讀寫的思路,進行實現。

相關文章
相關標籤/搜索