上篇博文咱們按照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讀寫操做
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控制器的時序相匹配的重要值):TACLS、TWRPH0、TWRPH1。
咱們能夠在咱們的芯片手冊中找到nand flash控制器所提供的時序圖,其中TACLS、TWRPH0、TWRPH1是咱們本身能夠配置的。
同時能夠在nand flash芯片手冊中找到其所須要的時序圖,以下
簡單經過時序比較咱們就能夠清楚的知道,TACLS、TWRPH0、TWRPH1分別對應tCLS、twp、tCLH
那麼其所須要的這些值的大小究竟是多少呢?咱們經過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讀寫操做
咱們的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還有其餘操做,好比復位,擦除等操做,其實其實現均可以仿照咱們實現讀寫的思路,進行實現。