<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > NandFLASH和NorFLASH接口設(shè)計(jì)和驅(qū)動(dòng)開(kāi)發(fā)

          NandFLASH和NorFLASH接口設(shè)計(jì)和驅(qū)動(dòng)開(kāi)發(fā)

          作者: 時(shí)間:2009-08-25 來(lái)源:網(wǎng)絡(luò) 收藏

          3 FLASH程序
          3.1 Linux系統(tǒng)下的程序
          Linux系統(tǒng)將所有的設(shè)備都看作具體的文件,通過(guò)文件系統(tǒng)對(duì)設(shè)備進(jìn)行管理。所以在Linux架構(gòu)中,和設(shè)備相關(guān)的處理分成兩層:文件系統(tǒng)層和設(shè)備層。設(shè)備驅(qū)動(dòng)層用來(lái)屏蔽具體設(shè)備的細(xì)節(jié),文件系統(tǒng)層向用戶提供一組統(tǒng)一的。這種設(shè)備管理方法可以很好的實(shí)現(xiàn)設(shè)備無(wú)關(guān)性,使Linux系統(tǒng)可以隨著外部設(shè)備的發(fā)展進(jìn)行擴(kuò)展,比如要添加一個(gè)設(shè)備,只要根據(jù)該硬件設(shè)備特性向文件系統(tǒng)提供一組,應(yīng)用程序通過(guò)系統(tǒng)調(diào)用來(lái)訪問(wèn)設(shè)備。
          Linux系統(tǒng)里將FLASH設(shè)備歸屬到MTD設(shè)備下管理,相對(duì)于常規(guī)塊設(shè)備驅(qū)動(dòng)程序,MTD設(shè)備驅(qū)動(dòng)程序能更好的支持和管理閃存。具體講,基于MTD的 FLAsH驅(qū)動(dòng)程序,對(duì)上層可以很好的支持JFFS(針對(duì))和YAFFS(針對(duì))等文件系統(tǒng),對(duì)下層FLASH的讀寫(xiě),擦除,壞塊處理都能進(jìn)行很好的管理,它在硬件設(shè)備和上層文件系統(tǒng)間提供一個(gè)抽象接口。
          3.2 FLASH驅(qū)動(dòng)程序流程
          FLASH驅(qū)動(dòng)程序有兩種編程方式。一種是直接編程進(jìn)內(nèi)核(Kernel),另一種是編程成模塊(Modules),如果編程進(jìn)內(nèi)核,會(huì)增加內(nèi)核的大小,還要改動(dòng)內(nèi)核源文件,不能動(dòng)態(tài)卸載,不利于調(diào)試,所以FLASH驅(qū)動(dòng)編程采用模塊化方式較好。
          FLASH驅(qū)動(dòng)流程要經(jīng)過(guò)四步:模塊化,編譯,加載,調(diào)用驗(yàn)證。如圖4所示。

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


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


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

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


          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();