朱有鹏老师linux核心大讲堂---ARM裸机第十一部分 NandFlash和iNand学习笔记
目錄
1、NandFlash的接口? 數據手冊:K9F2G08/K9F4G08
2、NandFlash結構框圖
3、Nandflash的結構
4、NandFlash常見操作以及流程分析
5、S5PV210的NandFlash控制器
6、Nand操作代碼解析
7、iNand介紹
8、SD卡、inand操作
9、SD/iNand代碼實戰分析1
10、SD/iNand代碼實戰分析2
11、SD/iNand代碼分析
1、NandFlash的接口? 數據手冊:K9F2G08/K9F4G08
S5PV210核心板NAND FLASH接口電路:
(1)型號的含義:就如K9F2G08,K9F:三星公司的型號,2g存儲,08:8位數據線。
(2)數據線不一定只傳送數據,還可能傳送命令
2、NandFlash結構框圖
組成部分:存儲矩陣+控制電路,控制電路接口與我們的soc里的nand控制器連接。nand控制器負責產生nandflash芯片所需的讀寫時序,我們操作nandflash時只需要操作soc上nand控制器提供的寄存器即可,根據讀寫流程圖進行編程來讀、寫、擦除操作。
?
(1)Nand中可以被單次訪問的最小單元叫做頁。(最小單元是至少一次要讀取指定的位數(字節),或者這些固定位數的整數倍),這就是塊設備
(2)頁往上就是Block(塊),一個塊就等于若干個頁,再往上就是整個Nand芯片了,叫device,一個device是若干個block。
(3)為什么要分頁和塊呢,因為塊設備不能完全按字節訪問,只能按塊訪問這是物理硬件限制的。頁是Nand的最小讀寫單元,block是擦除Nand的最小單位。(這些都是硬件所決定的)
(4)nand中的多個存儲單元,每個單元都有自己的地址(地址是精確到字節的)。所以是地址編排精確到字節,但是實際讀寫卻只能精確到也(所以操作時需要頁對齊,譬如2k、4k等這些地址對齊)。nand讀寫時地址傳輸通過IO線發送的,因為地址是30位,而IO地址只有8位,所以需要分次進行地址發送,如需要5個cycle才能發送完畢。
(5)總結:nand芯片內部有存儲空間,這些空間是由電路來管理的,NAND向外部提供了一套統一的接口標準,然后我們的soc通過接口時序來訪問Nand的存儲空間,理論上我們可以通過外部soc直接時序訪問,但實際上NAND提供的是一套標準公用的接口,SOC有專門的控制模塊來讀取nand,不需要我們再寫讀寫時序。直接通過soc提供的模塊來操作nand芯片即可。(這些控制器一般作為soc的內部外設來存在的)
?
3、Nandflash的結構
(1)大頁Nand與小頁Nand? ?等同于硬盤的扇區,扇區最早的磁盤中是512字節,后來也有些高級的硬盤扇區不是512字節而是1024字節、2048字節等。nand的頁也有512字節,1024字節,2048,4096字節,一般說大字節是大頁,小字節是小頁Nand。
(2)一個塊等于多少個page也是不定的,不同的nand也不同。一個Nand芯片有多少block也是不定的,不同的nand芯片不同。
總結:nand的組織架構就比較亂,接口時序也不同,不同廠家的nand接口不一樣。一旦升級容量或者換芯片則硬件要從新做,軟件也要從新移植。
(3)帶內數據2k和帶外數據64(ECC數據,存儲壞塊數據) ECC:eeror correction code,錯誤校驗碼)nandflash出錯概率比較高所以需要ECC校驗數據。
(4)壞塊標志:nand芯片用一段時間后,可能某些會壞掉(這些塊無法擦除,也無法讀寫了),類似硬盤的壞道。壞塊是不可避免的,而且隨著Nand的使用壞塊會越來越多。當塊塊還不算多的時候這個Nand是可以用的,除非壞塊太多不劃算使用才更換新的。所以我們有了nand管理壞塊的標志機制。nand的每一頁的64字節的外帶數據中,我們(一般是文件系統)定義一個固定位置(譬如定位24字節)來標志這個壞塊是好的還是壞的。文件系統在發現這個壞塊已經壞了沒法用了時會將這個壞塊標志位壞塊,以后訪問nand時直接跳過這個塊即可。
(5)計算存儲容量的時候沒有加上64字節的。
(6)nand的地址有多位,分4/5周期通過IO引腳發送給nand芯片來對nand進行尋址。尋址的最小單位是字節,但讀寫的最小單元是頁。
(7)nand的地址在寫代碼時要按照nand要求的時序和順序依次寫入。
(8)nand命令碼:
?
(9)nand芯片內部的管理電路本身可以接收外部發送的命令,然后根據這些命令來讀寫nand內容與外部soc交互。在我們對nand進行讀寫操作的時候都是要命令、地址、數據的參與才能完成,而且必須要根據nand的芯片規定的流程來做。
4、NandFlash常見操作以及流程分析
(1)壞塊檢查
flash使用之前要先統一擦除(擦除單位是塊)。flash類設備擦除后里面全是1,所以擦干凈之后讀出來的值是0xff。
(2)頁寫(program)操作 通過寫命令,寫地址,寫數據,再寫命令(分兩個周期寫命令)過程對頁進行操作:
過程:soc通過nand控制器和nand芯片完成順序對接,然后按照時序要求將一頁數據發給nand芯片內部的電路。接口電路先接收到自己的緩沖區,然后再集中寫入nand芯片的存儲區域中。nand接口電路將一頁數據從緩沖區中寫入nand存儲系統中需要一定的時間,這段時間nand芯片不能再響應soc發過來的其他命令。所以soc要等待nand接口電路忙完。等待方法是soc不斷讀取狀態寄存器(這個狀態寄存器有2種情況):一種是soc的nand控制器自帶的,另一種是soc通過發命令得到命令響應得到的,然后通過檢查這個狀態寄存器的狀態位就能知道nand接口電路剛才寫的那一頁數據寫完了沒,寫好了沒。
硬件式ECC,soc的nand控制器可以提供硬件式ECC(這個也比較普遍情況)。硬件ECC是在Nand的控制器中有個硬件模塊專門做ECC操作。當我們操作Nand芯片的,只要按照soc的要求按時打開ECC生成開關,則當我們寫入nand芯片的soc的Nand控制器的ecc模塊自動生成ecc數據放在相應的寄存器中,然后我們只要將這生成的ecc數據寫入nand芯片的外帶數據區即可:在將來讀取這塊Nand芯片時同樣要打開硬件ECC開關,然后開始讀,在讀的過程當中硬件ecc會自動計算讀進來的一頁數據的ecc值并將之放到相應的寄存器中。然后我們再讀取外帶數據區中原來我們寫入時存入的ECC值,和我們剛才讀的時候得到的ECC值進行校驗。校驗通過則說明讀寫正確,校驗不通過則說明不正確(放棄數據或者嘗試修復)。
(3)擦除(erase)操作
擦除時必須給塊對齊的地址。如果給不了對齊的地址,結果是不可知的(有些nand芯片沒關系,它內部會自動將其對齊而有些nand會返回地址錯誤)
(4)頁讀(read)操作
讀跟寫操作類似。
5、S5PV210的NandFlash控制器
作用:nandflash接口電路與s5pv210的nandflash控制器連接,soc模塊集成了硬件統一的接口電路,使其屏蔽底層時序電路的實現,降低軟件編程的復雜程度和工作量。我們也可以用軟件的方式來實現時序邏輯來進行對Nandflash的讀寫,但是NandFlash的時序比較復雜,即使花精力去寫好,也不一定會穩定。所以soc提供的統一的接口電路解決了一個問題,我們只要對其提供的寄存器進行讀寫操作就可以了。這個方法也是目前最廣泛的一種技術,越來越來的期間都趨向使用這種方法,具體的實現過程交由電路去完成,我們只要關注自己的業務邏輯就可以了,編程越發的簡單。
(2)結構框圖?
如圖中:SFR特殊功能寄存器,編程主要操控這些寄存器去操作nandflash,ECC塊生成等。
(3)s5ppv210的nand控制器的主要寄存器
NFCONF、NFCONT、NFCOMMD 發命令的、NFDATA、NFMECCD0 產生ECC的、NFMECCD1 、NFSECCD 帶外數據區、NFSBLK
NFEBLK、NFSTAT :控制器自帶的狀態寄存器
?
6、Nand操作代碼解析
(1)擦除函數
圖中的A11即使第12位,代碼是從1開始的,所以A12等于數據手冊的A11
(2)頁讀取函數
(3)頁寫入函數
都是編程模塊化操作,參照數據手冊流程圖,結合代碼分析,一般大多數的存儲類芯片操作流程都大同小異,重在理解數據手冊流程圖,soc提供的控制器所要操作的寄存器,對寄存器進行操作即可。
7、iNand介紹
iNand/eMMC/SDCard/MMCCard的關聯
(1)最早出現的是MMC卡,卡片式結構,按照MMC協議設計。(相交于NandFlash芯片來說,MMC卡有2個優勢:第一是卡片化,便于拆裝;第二是統一了協議接口,兼容性好。)
(2)后來出現SD卡,兼容MMC協議。SD卡比較MMC有一些改進,譬如寫保護,速率,容量等。
(3)SD卡遵循SD協議,有多個版本。多個版本之間向前兼容。
(4)iNand/eMMC在SD卡的基礎上發展起來的,比較SD卡的區別就是將SD卡芯片化了(解決卡的接觸不良問題,便于設備迷你化)。
(5)iNand和eMMC的關聯:eMMC是協議,iNand是Sandisk公司符合eMMC協議的一種芯片系列名稱。
?
iNand/eMMC的結構圖及其與NandFlash的區別
(1)iNand內部也是由接口電路和存儲系統構成,不同之處在與接口電路功能不同。
(2)iNand的接口電路挺復雜,功能很健全。譬如:
一:提供eMMC接口協議,和SOC的eMMC接口控制器通信對接。
二:提供塊ECC校驗相關的邏輯,也就是說iNand本身自己完成存儲系統的ECC功能,soc使用iNand時自己不用寫代碼來進行ECC相關操作,大大簡化了SOC的編程難度。
三:iNand芯片內部使用MLC Nand顆粒,所以性價比很高。
四:iNand接口電路還提供了cache機制,所以inand的操作速度很快。
iNand/eMMC的物理接口和SD卡物理接口的對比:
(1)對比inand和SD卡的接線,發現:這兩個接線幾乎是一樣的,唯一的區別就是SD卡io線有4根,而iNand的IO線有8根。
(2)這告訴我們,我們在實際操作inand芯片時和操作SD卡時幾乎是一樣的(物理接線幾乎一樣,軟件操作協議幾乎一樣)。
8、SD卡、inand操作
8.1 硬件接口:data,clk,cmd
(1)inand的IO線有8根,支持1,4,8線并行傳輸模式;cd卡io線有4根,支持1,4線并行傳輸模式。
(2)CMD線用來傳輸命令,CLK線用來傳輸時鐘信號。
8.2 命令響應的操作模式
簡單講就是:發命令----等待回復(或者無回復,無回復也是一種回復)。命令和回復類型是sd卡協議規定好的。按照發送命令可以進行讀寫操作。不同的命令響應不同(返回的數據位數不同)。
8.3 SD/inand的體系結構圖
8.4、sd/iNand的寄存器(重點是RCA寄存器)
?
9、SD/iNand代碼實戰分析1
9.1、命令碼CMD和ACMD
命令碼CMD主要用作與SD卡交互如讀、寫、改,均需要通過命令碼進入到SD卡的某種狀態下才能進行操作,也就是說任何操作均先發命令給SD卡告訴SD卡我將要做什么操作。ACMD是CMD碼的擴展命令,CMD碼不夠用,而又不想新增關鍵字。解決方案是CMDX 加CMDY =ACMD,也就是說發送兩個CDMx碼組成一個ACMD碼,一般CMDX碼是CMD55.
9.2、卡類型識別SD or MMC
soc控制器本身不能識別我們是插的是什么樣的卡,如:SD\MMC\eMMC卡,每種卡的協議是兼容的,但是卡本身的協議又有差別,發送相同的命令得到的回復是不一樣的或者沒有回復,我們是利用這個差別通過發送命令得到的回復來進一步判斷是哪一種卡,進而針對這個卡類型(卡本身的協議)進行操作。
9.3、卡狀態
發不同的命令會進入相應的狀態,sd卡內部控制器就是一個狀態機,通過命令進行狀態的遷移。在不同的狀態發送相同的命令回復是不同的,在本狀態下也只能接受本狀態下的命令,其他命令是沒有回復的。
9.4、卡回復類型
我們發送的命令碼,一般情況下都是有回復的,只有小個別沒有回復,而每個命令碼回復的信息位數可能是不相同的,是SD卡協議所規定好的,我們soc需要根據不同的回復類型進行讀取解析。
?
10、SD/iNand代碼實戰分析2
10.1、linux內核風格的寄存器定義
(1)定義寄存器時一般通過定義一個基地址+和要訪問這個寄存器相對于基地址的偏移量。
10.2、SD/iNand相關的GPIO初始化
10.3、SD/iNand相關的時鐘系統設置
進行分頻設置:
10.4、SD/iNand相關的時鐘設置
(1)sd卡本身工作需要時鐘,但是自己又沒有時鐘發生單元,依靠主機soc的控制器通過sd接口中的CLK線傳一個時鐘過來的sd卡內部使用。所以主機sd卡控制器先初始化好自己的時鐘,然后將自己的時鐘傳給sd卡。
(2)因為此時剛開始和sd卡通信,主機不清楚sd卡屬于哪個版本(不同版本使用的時鐘不同,低版本的時鐘不能工作在高時鐘版本中),所以我們先設置一個較低的sd卡工作時鐘400k,當sd卡工作起來后,再判斷當前sd卡處于哪個版本,再根據版本再設置一個與其對應的時鐘。
11、SD/iNand代碼分析
11.1SD卡初始化過程圖
11.2初始化代碼映射
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的朱有鹏老师linux核心大讲堂---ARM裸机第十一部分 NandFlash和iNand学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python人工智能教程百度云_【pyt
- 下一篇: Linux 查看文件和文件夹大小,隐藏文