當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀] NandFLASH和NorFLASH接口設(shè)計和驅(qū)動開發(fā)

0 引 言
    隨著嵌入式系統(tǒng)的迅速發(fā)展,其應(yīng)用環(huán)境的廣泛性,復(fù)雜性對構(gòu)建于系統(tǒng)上的Nor和Nand閃存設(shè)備提出更高要求,需要閃存設(shè)備傳輸速度更快,體積更小,容量更大,穩(wěn)定性更好。該文在基于Samsung公司的S3C2410處理器平臺上,針對FLASH閃存設(shè)備在嵌入式系統(tǒng)中的應(yīng)用,詳細(xì)分析FLASH閃存設(shè)備的接口設(shè)計方法,并針對FLASH接口特點,提出Linux環(huán)境下NorFLASH和 NandFLASH的驅(qū)動開發(fā)流程,給出詳細(xì)的代碼分析。

1 NandFLASH和NandFLASH對比
    隨著存儲技術(shù)的高速發(fā)展,閃存設(shè)備因其在性能和成本方面的優(yōu)勢,如非易失性,可擦除性以及更低廉的價格正逐步取代傳統(tǒng)記憶體。目前常用閃存是Nor-FLASH和NandFLASH。它們的技術(shù)性能差異顯著,表1是它們的技術(shù)對比。

NorFLASH使用方便,易于連接,可以在芯片上直接運行代碼,穩(wěn)定性出色,傳輸速率高,在小容量時有很高的性價比,這使其很適合應(yīng)于嵌入式系統(tǒng)中作為 FLASH ROM。相對于NorFLASH,NandFLASH強(qiáng)調(diào)更高的性能,更低的成本,更小的體積,更長的使用壽命。這使NandFLASH很擅于存儲純資料或數(shù)據(jù)等,在嵌入式系統(tǒng)中用來支持文件系統(tǒng),在該S3C2410平臺上用以支持bon文件系統(tǒng)。
    然而FLASH閃存卻是保證數(shù)據(jù)正確性不太理想的設(shè)備,應(yīng)用中可能出現(xiàn)壞塊;這就給其在嵌入式系統(tǒng)中的應(yīng)用,如何更好地進(jìn)行數(shù)據(jù)存儲管理提出了更高要求。恰當(dāng)?shù)慕涌谠O(shè)計和驅(qū)動開發(fā)是解決問題的關(guān)鍵,本文基于S3C2410,詳細(xì)分析FLASH接口設(shè)計和驅(qū)動開發(fā)流程。

2 FLASH接口設(shè)計
2.1 處理器內(nèi)存分配情況
    在分析FLASH的接口以及工作模式前,先分析處理器的內(nèi)存分配情況。內(nèi)核ARM920T是32位處理器,尋址空間4 GB,3 GB被處理器內(nèi)部的寄存器和一些其他設(shè)備占用,只有1 GB用于外部尋址;這1 GB的空間S3C2410分為8個部分以支持不同的設(shè)備,每個空間為128 Mb,被命名為BANK。S3C2410給每個BANK一個片選即nGCS0~nGCS7來方便對BANK的操作,將CPU上相應(yīng)的BANK連線接到外設(shè)芯片的片選引腳上就可以根據(jù)相應(yīng)的地址對存儲器進(jìn)行控制。
2.2 FLASH在系統(tǒng)中的架構(gòu)
    FLASH模塊通過系統(tǒng)總線與處理器相連,如圖1所示。

    為了擁有高速的數(shù)據(jù)交換通道,F(xiàn)LASH經(jīng)由控制器模塊通過AHB總線與處理器通信。NandFLASH控制器、NorFLASH控制器和DMA控制器都是高速總線AHB上的Master模塊,都包含符合AMBA標(biāo)準(zhǔn)的總線接口模塊與AHB交互工作。FLASH工作時,F(xiàn)LASH控制器模塊和DMA控制器模塊相互協(xié)作,完成各種操作。[!--empirenews.page--]
2.3 NorFLASH的接口設(shè)計
    系統(tǒng)用的NorFLASH芯片是Atmel公司開發(fā)的AT49BV1614A,存儲空間為16 MB,在系統(tǒng)中常用于存放代碼,系統(tǒng)上電或復(fù)位后獲得指令開始執(zhí)行,因此,應(yīng)將其配置到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驅(qū)動程序開發(fā)
3.1 Linux系統(tǒng)下的驅(qū)動程序
    Linux系統(tǒng)將所有的設(shè)備都看作具體的文件,通過文件系統(tǒng)對設(shè)備進(jìn)行管理。所以在Linux架構(gòu)中,和設(shè)備相關(guān)的處理分成兩層:文件系統(tǒng)層和設(shè)備驅(qū)動層。設(shè)備驅(qū)動層用來屏蔽具體設(shè)備的細(xì)節(jié),文件系統(tǒng)層向用戶提供一組統(tǒng)一的接口。這種設(shè)備管理方法可以很好的實現(xiàn)設(shè)備無關(guān)性,使Linux系統(tǒng)可以隨著外部設(shè)備的發(fā)展進(jìn)行擴(kuò)展,比如要添加一個設(shè)備,只要根據(jù)該硬件設(shè)備特性向文件系統(tǒng)提供一組接口,應(yīng)用程序通過系統(tǒng)調(diào)用接口來訪問設(shè)備。
    Linux系統(tǒng)里將FLASH設(shè)備歸屬到MTD設(shè)備下管理,相對于常規(guī)塊設(shè)備驅(qū)動程序,MTD設(shè)備驅(qū)動程序能更好的支持和管理閃存。具體講,基于MTD的 FLAsH驅(qū)動程序,對上層可以很好的支持JFFS(針對NorFLASH)和YAFFS(針對NandFLASH)等文件系統(tǒng),對下層FLASH的讀寫,擦除,壞塊處理都能進(jìn)行很好的管理,它在硬件設(shè)備和上層文件系統(tǒng)間提供一個抽象接口。
3.2 FLASH驅(qū)動程序開發(fā)流程
    FLASH驅(qū)動程序有兩種編程方式。一種是直接編程進(jìn)內(nèi)核(Kernel),另一種是編程成模塊(Modules),如果編程進(jìn)內(nèi)核,會增加內(nèi)核的大小,還要改動內(nèi)核源文件,不能動態(tài)卸載,不利于調(diào)試,所以FLASH驅(qū)動編程采用模塊化方式較好。
    FLASH驅(qū)動開發(fā)流程要經(jīng)過四步:模塊化設(shè)計,編譯,加載,調(diào)用驗證。如圖4所示。

3.2.1 驅(qū)動程序的模塊化設(shè)計
    構(gòu)成FLASH驅(qū)動程序的所有子程序,要進(jìn)行模塊化設(shè)計,必須加入兩個函數(shù):入口函數(shù)module init()和出口函數(shù)module_exit()。在執(zhí)行程序時module_init()會調(diào)用int_init cfi probe_init(void),負(fù)責(zé)初始化MTD芯片,同時這個函數(shù)還調(diào)用register_mtd_chip_driver(),將cfi_chipdrv加入至 MTD驅(qū)動器列表chip_drvs_list中。初始化成功返回0,否則返回負(fù)值。實現(xiàn)代碼為:

  
    另一個函數(shù)module_exit()執(zhí)行時,會調(diào)用staticvoid_exit cfi_probe_exit(void),負(fù)責(zé)清除MTD芯片驅(qū)動工作。同時這個函數(shù)還調(diào)用unregister_mtd_chip_driver(),將cfi_chipdrv從MTD芯片驅(qū)動器列表chip_drvs_list中刪除。實現(xiàn)代碼為:


    其中:-O指定代碼優(yōu)化的級別;-D內(nèi)核模塊必須按照特殊定義的參數(shù)進(jìn)行編譯,這些參數(shù)跟在選項-D后;MODULE通知頭文件要給出適當(dāng)?shù)膬?nèi)核模塊定義;-KERNEL-通知頭文件形成的目標(biāo)代碼在內(nèi)核態(tài)運行。得到的文件*.O就是一個FLASH驅(qū)動程序的目標(biāo)文件,這樣FLAsH驅(qū)動程序編譯好。編譯好的模塊*.O放在/lib/roodules/2.4.18/misc下,然后用dep-mod-a使此模塊成為可加載模塊。
3.2.3 驅(qū)動程序的加載
    加載模塊要用到兩個命令:insmod(加載),rmmod(卸載)。加載時,module_init()函數(shù)被調(diào)用,這個函數(shù)向系統(tǒng)設(shè)備表登記 FLAsH設(shè)備。卸載時,module_exit()函數(shù)被調(diào)用,它釋放FLASH設(shè)備在系統(tǒng)設(shè)備表中占有的表項。注冊成功后就可以用mknod命令將 FLASH設(shè)備映射為一個特別文件,其他程序使用FLASH設(shè)備時,只要對此文件進(jìn)行操作就行。Linux在/dev目錄中為每個設(shè)備建立了一個文件,用 ls-1命令列出函數(shù)返回值,若小于O,表示注冊失??;否則表示注冊成功。注冊以后,Linux將FLAsH設(shè)備名與主、次設(shè)備號聯(lián)系起來。當(dāng)對 FLASH訪問時,Linux通過請求訪問FLASH設(shè)備名得到主、次設(shè)備號;然后把此訪問發(fā)送到FLASH設(shè)備驅(qū)動,F(xiàn)LASH驅(qū)動再根據(jù)次設(shè)備號調(diào)用不同的函數(shù)。
3.2.4 驅(qū)動程序的調(diào)用驗證
    模塊加載到內(nèi)核后,然后就要調(diào)用驗證。在Linux根目錄下有dev子目錄,這里面是節(jié)點名,這些結(jié)點是通過mknod建立的,里面有MTD字符設(shè)備節(jié)點和MTD塊設(shè)備節(jié)點,通過訪問這些節(jié)點來訪問設(shè)備驅(qū)動程序。Open一般是設(shè)備節(jié)點上的第一個操作,訪問設(shè)備時其實就是系統(tǒng)調(diào)用open()函數(shù),然后 open()函數(shù)打開設(shè)備準(zhǔn)備進(jìn)行I/O操作,該函數(shù)注冊進(jìn)mtd_fops結(jié)構(gòu)中。
    上面就是NorFLASH和NandFLASH驅(qū)動程序架構(gòu),具體開發(fā)驅(qū)動程序時,就要填充架構(gòu)里的程序代碼,來完成驅(qū)動程序。這個框架中有一個函數(shù)表,具體到Linux系統(tǒng)里,需要提供一個結(jié)構(gòu)來向系統(tǒng)說明FLASH驅(qū)動程序所提供的一組入口點,這個結(jié)構(gòu)就是fop函數(shù)表。
    FLASH驅(qū)動程序運行時,向內(nèi)核注冊,告訴系統(tǒng)fop函數(shù)表是跟FLASH驅(qū)動程序相關(guān)聯(lián)的。當(dāng)用戶去訪問驅(qū)動程序時,系統(tǒng)就告訴文件系統(tǒng)的管理程序,調(diào)用fop函數(shù)表就可以,然后調(diào)用函數(shù)表里的函數(shù),完成用戶要求。當(dāng)從設(shè)備來收發(fā)數(shù)據(jù)時,系統(tǒng)不是調(diào)用read(),write()這兩個函數(shù),fop結(jié)構(gòu)里沒這兩個函數(shù),而是要用到一個函數(shù)blk_init_queue(),這個函數(shù)向上注冊了一個請求處理函數(shù)request,對FLASH設(shè)備的讀取和發(fā)送數(shù)據(jù),都是從請求隊列發(fā)出一個請求,請求調(diào)用請求處理函數(shù),由請求處理函數(shù)執(zhí)行具體的讀寫操作。設(shè)計驅(qū)動程序90%工作來完成fop函數(shù)表及re- quest函數(shù),10%完成驅(qū)動程序中的一些函數(shù)接口。完成了這些函數(shù)加上上面的FLASH驅(qū)動程序架構(gòu)就構(gòu)成了完整的FLASH驅(qū)動程序。

4 結(jié) 語
    基于Samsung公司的s3c2410處理器平臺,分析和設(shè)計NorFLASH和NandFLASH的接口和驅(qū)動,詳細(xì)介紹兩種FLASH的硬件結(jié)構(gòu)、性能差異、讀寫時序、以及驅(qū)動開發(fā)。NorFLASH和NandFLASH因其在存儲數(shù)據(jù)和程序以及性價比方面的優(yōu)勢,占據(jù)的存儲器市場份額越來越多,并在嵌入式系統(tǒng)中得到廣泛應(yīng)用。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉