NandFLASH和NorFLASH接口設計和驅動開發(fā)
0 引 言
隨著嵌入式系統(tǒng)的迅速發(fā)展,其應用環(huán)境的廣泛性,復雜性對構建于系統(tǒng)上的Nor和Nand閃存設備提出更高要求,需要閃存設備傳輸速度更快,體積更小,容量更大,穩(wěn)定性更好。該文在基于Samsung公司的S3C2410處理器平臺上,針對FLASH閃存設備在嵌入式系統(tǒng)中的應用,詳細分析FLASH閃存設備的接口設計方法,并針對FLASH接口特點,提出Linux環(huán)境下NorFLASH和 NandFLASH的驅動開發(fā)流程,給出詳細的代碼分析。
1 NandFLASH和NandFLASH對比
隨著存儲技術的高速發(fā)展,閃存設備因其在性能和成本方面的優(yōu)勢,如非易失性,可擦除性以及更低廉的價格正逐步取代傳統(tǒng)記憶體。目前常用閃存是Nor-FLASH和NandFLASH。它們的技術性能差異顯著,表1是它們的技術對比。
NorFLASH使用方便,易于連接,可以在芯片上直接運行代碼,穩(wěn)定性出色,傳輸速率高,在小容量時有很高的性價比,這使其很適合應于嵌入式系統(tǒng)中作為 FLASH ROM。相對于NorFLASH,NandFLASH強調更高的性能,更低的成本,更小的體積,更長的使用壽命。這使NandFLASH很擅于存儲純資料或數(shù)據(jù)等,在嵌入式系統(tǒng)中用來支持文件系統(tǒng),在該S3C2410平臺上用以支持bon文件系統(tǒng)。
然而FLASH閃存卻是保證數(shù)據(jù)正確性不太理想的設備,應用中可能出現(xiàn)壞塊;這就給其在嵌入式系統(tǒng)中的應用,如何更好地進行數(shù)據(jù)存儲管理提出了更高要求。恰當?shù)慕涌谠O計和驅動開發(fā)是解決問題的關鍵,本文基于S3C2410,詳細分析FLASH接口設計和驅動開發(fā)流程。
2 FLASH接口設計
2.1 處理器內存分配情況
在分析FLASH的接口以及工作模式前,先分析處理器的內存分配情況。內核ARM920T是32位處理器,尋址空間4 GB,3 GB被處理器內部的寄存器和一些其他設備占用,只有1 GB用于外部尋址;這1 GB的空間S3C2410分為8個部分以支持不同的設備,每個空間為128 Mb,被命名為BANK。S3C2410給每個BANK一個片選即nGCS0~nGCS7來方便對BANK的操作,將CPU上相應的BANK連線接到外設芯片的片選引腳上就可以根據(jù)相應的地址對存儲器進行控制。
2.2 FLASH在系統(tǒng)中的架構
FLASH模塊通過系統(tǒng)總線與處理器相連,如圖1所示。
為了擁有高速的數(shù)據(jù)交換通道,F(xiàn)LASH經(jīng)由控制器模塊通過AHB總線與處理器通信。NandFLASH控制器、NorFLASH控制器和DMA控制器都是高速總線AHB上的Master模塊,都包含符合AMBA標準的總線接口模塊與AHB交互工作。FLASH工作時,F(xiàn)LASH控制器模塊和DMA控制器模塊相互協(xié)作,完成各種操作。[!--empirenews.page--]
2.3 NorFLASH的接口設計
系統(tǒng)用的NorFLASH芯片是Atmel公司開發(fā)的AT49BV1614A,存儲空間為16 MB,在系統(tǒng)中常用于存放代碼,系統(tǒng)上電或復位后獲得指令開始執(zhí)行,因此,應將其配置到Bank0,將AT49BV1614A的片選端nCE接至 S3C2410的nGCS0;AT49BVl614A的輸出使能端nOE接S3C2410的nOE;寫使能端nWE接S3C2410的nWBE0;將模式選擇nBYTE上拉,使AT49BV1614A工作在 16 位數(shù)據(jù)模式。AT49BV1614A地址總線A[19~0]和S3C2410的地址總線ADDR[20 ~1相連,16位數(shù)據(jù)總線DQ[15~0]和S3C2410的低16位數(shù)據(jù)總線DATA[15~0]相連。
2. 4 NorFLASH在系統(tǒng)中的具體操作
以AT49BV1614A芯片時序圖為例,具體說明NorFLASH的寫操作,如圖2所示。
CLE信號有效時系統(tǒng)通過I/O口向命令寄存器發(fā)送命令00H,此時WE為低電平,寫操作有效,NandFLASH處于寫狀態(tài)。發(fā)送命令后,接著發(fā)送要讀的地址,該操作將占用WE的1,2,3,4四個周期,發(fā)送地址信息時,CLE為低電平,ALE為高電平。地址信息發(fā)送完畢后,不能立刻讀取數(shù)據(jù),因為此時芯片正處于BUSY(忙)狀態(tài),需要等待2~20 ms,之后,才能開始數(shù)據(jù)讀取。此時WE為高電平,處于無效狀態(tài),CE片選信號也始終為低以表明選中該芯片。[!--empirenews.page--]
3 FLASH驅動程序開發(fā)
3.1 Linux系統(tǒng)下的驅動程序
Linux系統(tǒng)將所有的設備都看作具體的文件,通過文件系統(tǒng)對設備進行管理。所以在Linux架構中,和設備相關的處理分成兩層:文件系統(tǒng)層和設備驅動層。設備驅動層用來屏蔽具體設備的細節(jié),文件系統(tǒng)層向用戶提供一組統(tǒng)一的接口。這種設備管理方法可以很好的實現(xiàn)設備無關性,使Linux系統(tǒng)可以隨著外部設備的發(fā)展進行擴展,比如要添加一個設備,只要根據(jù)該硬件設備特性向文件系統(tǒng)提供一組接口,應用程序通過系統(tǒng)調用接口來訪問設備。
Linux系統(tǒng)里將FLASH設備歸屬到MTD設備下管理,相對于常規(guī)塊設備驅動程序,MTD設備驅動程序能更好的支持和管理閃存。具體講,基于MTD的 FLAsH驅動程序,對上層可以很好的支持JFFS(針對NorFLASH)和YAFFS(針對NandFLASH)等文件系統(tǒng),對下層FLASH的讀寫,擦除,壞塊處理都能進行很好的管理,它在硬件設備和上層文件系統(tǒng)間提供一個抽象接口。
3.2 FLASH驅動程序開發(fā)流程
FLASH驅動程序有兩種編程方式。一種是直接編程進內核(Kernel),另一種是編程成模塊(Modules),如果編程進內核,會增加內核的大小,還要改動內核源文件,不能動態(tài)卸載,不利于調試,所以FLASH驅動編程采用模塊化方式較好。
FLASH驅動開發(fā)流程要經(jīng)過四步:模塊化設計,編譯,加載,調用驗證。如圖4所示。
3.2.1 驅動程序的模塊化設計
構成FLASH驅動程序的所有子程序,要進行模塊化設計,必須加入兩個函數(shù):入口函數(shù)module init()和出口函數(shù)module_exit()。在執(zhí)行程序時module_init()會調用int_init cfi probe_init(void),負責初始化MTD芯片,同時這個函數(shù)還調用register_mtd_chip_driver(),將cfi_chipdrv加入至 MTD驅動器列表chip_drvs_list中。初始化成功返回0,否則返回負值。實現(xiàn)代碼為:
另一個函數(shù)module_exit()執(zhí)行時,會調用staticvoid_exit cfi_probe_exit(void),負責清除MTD芯片驅動工作。同時這個函數(shù)還調用unregister_mtd_chip_driver(),將cfi_chipdrv從MTD芯片驅動器列表chip_drvs_list中刪除。實現(xiàn)代碼為:
4 結 語 |