NAND Flash驅(qū)動(dòng)程序結(jié)構(gòu)_第1頁
NAND Flash驅(qū)動(dòng)程序結(jié)構(gòu)_第2頁
NAND Flash驅(qū)動(dòng)程序結(jié)構(gòu)_第3頁
NAND Flash驅(qū)動(dòng)程序結(jié)構(gòu)_第4頁
NAND Flash驅(qū)動(dòng)程序結(jié)構(gòu)_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

NANDFlash驅(qū)動(dòng)程序1、NANDFlash驅(qū)動(dòng)程序框架FAT文件系統(tǒng)下的NANDFlash驅(qū)動(dòng)程序采用了分層結(jié)構(gòu)。驅(qū)動(dòng)程序的上層是Flash抽象層,是物理操作無關(guān)層,該層對(duì)NANDFlash的操作進(jìn)行抽象,并采用一定的策略平衡了NANDFlash的擦寫。NANDFlash驅(qū)動(dòng)程序的結(jié)構(gòu)如圖5.5所示。FileSystem(FAT)FAL

(FlashAbstractionLayer)FMD

(FlashMediaDriver)FlashHardware圖5.5FAT下NANDFlash驅(qū)動(dòng)結(jié)構(gòu)在圖中:FileSystem即文件系統(tǒng)。在這里,采用的是FAT文件系統(tǒng)。FAT文件系統(tǒng)是一種采用鏈?zhǔn)椒峙浞绞降奈募到y(tǒng)。并沒有對(duì)NANDFlash的特點(diǎn)優(yōu)化,因此需要在下層的驅(qū)動(dòng)程序做優(yōu)化。FlashDriver即NANDFlash驅(qū)動(dòng)程序。對(duì)上層的文件系統(tǒng)提供以DSK為前綴的流驅(qū)動(dòng)接口。該層驅(qū)動(dòng)程序本身分為兩層:FAL層、FMD層。(1)、FAL層即FlashAbstractionLayer,F(xiàn)lash抽象層。該層主要提供三個(gè)功能:A、將物理的Flash抽象成統(tǒng)一的接口提供給上層的文件系統(tǒng)。B、將邏輯扇區(qū)地址轉(zhuǎn)換成物理扇區(qū)地址。上層的FAT文件系統(tǒng)使用的是邏輯扇區(qū)地址,并不是真正的物理扇區(qū),其轉(zhuǎn)換由FAL實(shí)現(xiàn)。C、對(duì)Flash實(shí)現(xiàn)損耗平衡("Wear-level")。為了避免反復(fù)的擦寫Flash的同一個(gè)塊,需要一種策略來減少反復(fù)的擦寫塊。(2)、FMD層即FlashMediaDriver,F(xiàn)lash介質(zhì)驅(qū)動(dòng)層。該層實(shí)現(xiàn)FAL層的請(qǐng)求,對(duì)Flash物理扇區(qū)進(jìn)行操作。FlashHardware即NANDFlash物理芯片。2、FAL層(FlashAbstractionLayer)1)函數(shù)接口定義FAL層對(duì)上的函數(shù)接口也就是整個(gè)NANDFlash驅(qū)動(dòng)程序的對(duì)外接口,由于NANDFlash是塊設(shè)備,WindowsCE中塊設(shè)備采用的是流驅(qū)動(dòng)接口,流驅(qū)動(dòng)接口是一個(gè)標(biāo)準(zhǔn)的統(tǒng)一接口,只是各個(gè)驅(qū)動(dòng)的前綴不同,在這里NANDFlash函數(shù)接口的前綴為“DSK”,這個(gè)前綴也使得WindowsCE將“DSKxx:”的文件名看作為設(shè)備,使得我們能夠通過WindowsCE標(biāo)準(zhǔn)的Win32API,如CreateFile、DeviceIOControl等來對(duì)設(shè)備進(jìn)行打開、讀寫等操作。具體的函數(shù)接口定義如下:DWORDDSK_Init(DWORDdwContext);BOOLDSK_Deinit(DWORDdwContext);DWORDDSK_Open(DWORDdwData,DWORDdwAccess,DWORDdwShareMode);BOOLDSK_Close(DWORDHandle);DWORDDSK_Read(DWORDHandle,LPVOIDpBuffer,DWORDdwNumBytes);DWORDDSK_Write(DWORDHandle,LPCVOIDpBuffer,DWORDdwInBytes);DWORDDSK_Seek(DWORDHandle,longlDistance,DWORDdwMoveMethod);BOOLDSK_IOControl(DWORDHandle,DWORDdwIoControlCode,PBYTEpInBuf,DWORDnInBufSize,PBYTEpOutBuf,DWORDnOutBufSize,PDWORDpBytesReturned);VOIDDSK_PowerUp(VOID);VOIDDSK_PowerDown(VOID);這里,實(shí)際使用的函數(shù)只有DSK_Init、DSK_Deinit、DSK_IOControl、DSK_PowerUp、DSK_PowerDown。其他函數(shù)均為空函數(shù)。DSK_InitNANDFlash驅(qū)動(dòng)程序初始化函數(shù),系統(tǒng)啟動(dòng)時(shí)加載驅(qū)動(dòng)程序時(shí)會(huì)通過設(shè)備管理器調(diào)用此函數(shù)對(duì)NANDFlash進(jìn)行初始化。DSK_DeinitNANDFlash驅(qū)動(dòng)程序卸載函數(shù),在卸載驅(qū)動(dòng)程序的時(shí)候調(diào)用此函數(shù)。DSK_IOControlNANDFlash驅(qū)動(dòng)程序的I/O函數(shù),所有對(duì)設(shè)備進(jìn)行的讀寫擦等操作都是由該函數(shù)實(shí)現(xiàn)的,也是上層主要使用的函數(shù),而DSK_Read、DSK_Write、DSK_Seek均為空函數(shù),不起任何作用。DSK_PowerUpNANDFlash驅(qū)動(dòng)程序電源管理函數(shù)。在系統(tǒng)喚醒時(shí)調(diào)用此函數(shù)對(duì)Flash進(jìn)行電源管理。此函數(shù)是通過調(diào)用FMD層的電源管理函數(shù)實(shí)現(xiàn)的。DSK_PowerDownNANDFlash驅(qū)動(dòng)程序電源管理函數(shù)。在系統(tǒng)睡眠時(shí)調(diào)用此函數(shù)對(duì)Flash進(jìn)行電源管理。此函數(shù)是通過調(diào)用FMD層的電源管理函數(shù)實(shí)現(xiàn)的。2)數(shù)據(jù)結(jié)構(gòu)定義>DISK_INFODISK_INFO結(jié)構(gòu)包含了有關(guān)磁盤設(shè)備的扇區(qū)數(shù)等物理信息,系統(tǒng)通過該結(jié)構(gòu)來了解設(shè)備具體物理細(xì)節(jié),該結(jié)構(gòu)是通過DISKIOCTLGETINFO獲取的。typedefstruct_DISK_INFO{DWORDdi_total_sectors;DWORDdi_bytes_per_sect;DWORDdi_cylinders;DWORDdi_heads;DWORDdi_sectors;DWORDdi_flags;}DISKINFO,*PDISKINFO;結(jié)構(gòu)成員描述如下:di_total_sectors:設(shè)備扇區(qū)總數(shù),一般情況下,塊設(shè)備總是以扇區(qū)為單位進(jìn)行操作。di_bytes_per_sect:每個(gè)扇區(qū)的字節(jié)數(shù)。di_cylinders:如果設(shè)備支持CHS尋址模式,則表示柱面數(shù)。di_heads:如果設(shè)備支持CHS尋址模式,則表示每個(gè)柱面磁頭數(shù)。di_sectors:如果設(shè)備支持CHS尋址模式,則表示每個(gè)磁道扇區(qū)數(shù)。由于NANDFlash沒有磁頭、柱面等概念,因此不使用CHS尋址模式,該模式是磁盤所特有的。diflags:標(biāo)志位,其可能的值如下:FlagDescriptionDISKINFOFLAGMBR設(shè)備使用MBRDISKINFOFLAGCHSUNCERTAIN設(shè)備不支持CHS尋址模式DISKINFOFLAGUNFORMATTED設(shè)備需要格式化DISKINFOFLAGPAGEABLE設(shè)備支持請(qǐng)求頁SG_BUFSG_BUF用于讀寫IOCTLs使用的緩沖,在使用DSK_IOControl函數(shù)對(duì)NANDFlash進(jìn)行讀寫時(shí),需傳入該結(jié)構(gòu)來表示要寫入或讀出的數(shù)據(jù)緩沖。typedefstruct_SG_BUF{PUCHARsb_buf;DWORDsb_len;}SG_BUF,*PSG_BUF;結(jié)構(gòu)成員描述如下:sb_buf:緩沖指針。sb_len:緩沖長(zhǎng)度。SG_REQ該結(jié)構(gòu)包含了上層讀寫的請(qǐng)求的具體要求,如從什么地址開始讀寫多大的數(shù)據(jù)。此結(jié)構(gòu)的參數(shù)sr_sglist即指向上面所示的SG_BUF結(jié)構(gòu)。FAT文件系統(tǒng)使用SG_REQ請(qǐng)求驅(qū)動(dòng)程序進(jìn)行讀寫。typedefstruct_SG_REQ{DWORDsr_start;DWORDsr_num_sec;DWORDsr_num_sg;DWORDsr_status;PFN_REQDONEsr_callback;SG_BUFsr_sglist[1];}SG_REQ,*PSG_REQ;結(jié)構(gòu)成員描述如下:sr_start:讀寫請(qǐng)求的起始扇區(qū)號(hào)。sr_num_sec:讀寫的扇區(qū)數(shù)。sr_num_sg:指向的SG_BUF的個(gè)數(shù)。sr_status:返回的請(qǐng)求狀態(tài)。sr_callback:請(qǐng)求結(jié)束的回調(diào)函數(shù)

sr_sglist:起始SG_BUF的指針。3)FAL層具體功能FAL層由類FAL、類MappingTable、類SectorMgr、類Compactor組成。整個(gè)FAL層的功能是由三個(gè)功能部分組成的。如圖5.6所示。FALBuildupMappingInfo()MappingTable*mpMap#MappingTableReadFromMedia()SectorMgr*

BuildupMappingInfo()MappingTable*mpMap#MappingTableReadFromMedia()SectorMgr*

mpSectorMgrSectorMgrWriteToMedia()DeleteSectors()Compactor*

DeleteSectors()Compactor*

mpCompactorCompactor圖5.6FAL類結(jié)構(gòu)(1)、類FAL類FAL有三個(gè)成員變量,分別為其三個(gè)功能部分的對(duì)象。這三個(gè)部分分別為:邏輯扇區(qū)到物理扇區(qū)映射表扇區(qū)管理器垃圾塊回收器類FAL的功能就是通過這三個(gè)功能部分的協(xié)作實(shí)現(xiàn)邏輯扇區(qū)到物理扇區(qū)的映射,并平衡NANDFlash擦寫的次數(shù)。類FAL提供的功能包括了讀、寫、刪除和建立映射表函數(shù)。下面是示意代碼:classFal{public://flash讀函數(shù)BOOLReadFromMedia(PSG_REQpSG_req,BOOLfDoMap);//flash寫函數(shù)BOOLWriteToMedia(PSG_REQpSG_req,BOOLfDoMap);//flash刪除函數(shù)BOOLDeleteSectors(DWORDdwStartLogSector,DWORDdwNumSectors);protected://flash掃描并建立映射表函數(shù)virtualBOOLBuildupMappingInfo();public:MappingTable*m_pMap;〃邏輯扇區(qū)到物理扇區(qū)映射表SectorMgr*m_pSectorMgr;〃扇區(qū)管理器Compactor*m_pCompactor;〃垃圾塊回收器};2)、類MappingTable類MappingTable提供給FAL相關(guān)的映射功能。所有的映射數(shù)據(jù)都放在一張表中,這張表保存在類MappingTable的成員變量m_pDynamicLUT[MASTER_TABLE_SIZE沖。其映射表結(jié)構(gòu)如圖5.7。圖5.7FAL層映射表結(jié)構(gòu)該表是一張二級(jí)映射表,主映射表(MasterTable)共有256項(xiàng),因此m_pDynamicLUT是一個(gè)大小為256的數(shù)組,數(shù)組的成員是一個(gè)指向二級(jí)映射表(SecondaryTables)的指針。二級(jí)映射表每一項(xiàng)存放了該邏輯扇區(qū)地址相對(duì)應(yīng)的物理扇區(qū)地址。類MappingTable的示意代碼如下:classMappingTable{public:〃查找映射表獲取邏輯扇區(qū)地址的物理扇區(qū)地址PBYTEGetPhysicalSectorAddr(SECTOR_ADDRlogicalSectorAddr,PSECTOR_ADDRpPhysicalSectorAddr);〃將物理扇區(qū)地址填入映射到指定的邏輯扇區(qū)地址PBYTEMapLogicalSector(SECTOR_ADDRlogicalSectorAddr,SECTOR_ADDRphysicalSectorAddr,PSECTOR_ADDRpExistingPhysicalSectorAddr);private:〃扇區(qū)映射表PUCHARm_pDynamicLUT[MASTER_TABLE_SIZE];};(3)、類SectorMgr類SectorMgr主要用于管理空閑(free)扇區(qū)、臟(dirty)扇區(qū)信息。其內(nèi)部具體結(jié)構(gòu)如圖5.8所示。SectorMgrSMListAddSectorsToListSMListmlistsAddSectorsUnmarkSectorsAsFreem_lists[Free]Compactor*StartCompactorGetNextFreeSector-…Compactor*mpCompactorMarkSectorsAsDirtyDirtyList

SectorMgrSMListAddSectorsToListSMListmlistsAddSectorsUnmarkSectorsAsFreem_lists[Free]Compactor*StartCompactorGetNextFreeSector-…Compactor*mpCompactorMarkSectorsAsDirtyDirtyList

mdirtyListDirtyListAddDirtySectorsUnmarkSectorsAsDirtyRemoveDirtySectors圖5.8扇區(qū)管理器結(jié)構(gòu)為了維護(hù)這些信息,SectorMgr使用了一種簡(jiǎn)單而有效的壓縮算法,即ConsecutiveItemCompression(CIC)。這種算法其實(shí)是一種僅僅記錄連續(xù)數(shù)據(jù)的結(jié)點(diǎn)鏈數(shù)據(jù)結(jié)構(gòu)。即每個(gè)結(jié)點(diǎn)記錄連續(xù)數(shù)據(jù)的起始地址和結(jié)尾地址,并包含下一結(jié)點(diǎn)的指針。例如,有一串?dāng)?shù)據(jù),0,1,2,3,4,5,6,7,8,12,13,14,15,16,17,18,20,21,400,401,402...1082,23576則記錄這串?dāng)?shù)據(jù)的結(jié)構(gòu)如圖5.9所示。圖5.9CIC壓縮結(jié)構(gòu)從圖中可看出,只需要三個(gè)結(jié)點(diǎn)即可描述所需要維護(hù)的龐大數(shù)據(jù),所以這是一種相當(dāng)有效的數(shù)據(jù)結(jié)構(gòu)。而這種數(shù)據(jù)結(jié)構(gòu)之所以能夠很好的工作,是由于FAL層的垃圾塊回收器(Compactor)的協(xié)作。垃圾塊回收器(Compactor)總是將Flash中的塊以整塊的方式進(jìn)行回收,即使得塊中的扇區(qū)以連續(xù)的方式得到釋放。其示意代碼如下:classSectorMgr{public:〃加入空閑扇區(qū)鏈表BOOLAddSectorsToList(ListTypelistType,SECTOR_ADDRstartingSectorAddr,DWORDdwNumSectors);〃去除空閑扇區(qū)BOOLUnmarkSectorsAsFree(SECTOR_ADDRstartingPhysicalSectorAddr,DWORDdwNumSectors);〃獲取下一個(gè)起始空閑扇區(qū)BOOLGetNextFreeSector(PSECTOR_ADDRpPhysicalSectorAddr,BOOLbCritical);〃將扇區(qū)標(biāo)記為臟BOOLMarkSectorsAsDirty(SECTOR_ADDRstartingPhysicalSectorAddr,DWORDdwNumSectors);〃去除臟扇區(qū)BOOLUnmarkSectorsAsDirty(SECTOR_ADDRstartingPhysicalSectorAddr,DWORDdwNumSectors);private:

〃空閑扇區(qū)鏈表SMListm_lists[NUM_LIST_TYPES];〃臟扇區(qū)表DirtyListm_dirtyList;〃垃圾回收器Compactor*m_pCompactor;};(4)、類Compactor類Compactor,即垃圾回收器,用于將NANDFlash上的塊回收加入空閑鏈表。其內(nèi)部結(jié)構(gòu)如圖5.10所示。圖5.10垃圾回收器結(jié)構(gòu)如何選擇塊則由一定的策略而定,如最少臟頁塊。如果回收塊中有有效數(shù)據(jù),則將有效數(shù)據(jù)復(fù)制到新的空閑扇區(qū)中,并重新對(duì)其進(jìn)行映射。垃圾回收器的啟動(dòng)時(shí)機(jī)則由SectorMgr的GetNextFreeSector()函數(shù)中決定垃圾回收的時(shí)機(jī),這個(gè)時(shí)機(jī)是在Flash中可用的扇區(qū)低于一定的閾值或者低于Flash中的臟扇區(qū)數(shù)的時(shí)候。也就是說,當(dāng)系統(tǒng)企圖獲得空閑扇區(qū)的時(shí)候,發(fā)現(xiàn)Flash中的空閑扇區(qū)低于預(yù)期了,則開始垃圾回收來獲取更多的空閑扇區(qū)。其示意代碼如下。classCompactor{public:〃開始進(jìn)行垃圾塊回收BOOLStartCompactor(DWORDdwPriority,DWORDdwFreeSectorsNeeded,BOOLbCritical);〃實(shí)際回收動(dòng)作在此函數(shù)完成DWORDCompactBlock(BLOCK_IDblockID,SECTOR_ADDRtreatAsDirtySectorAddr);〃根據(jù)某種策略獲取下一個(gè)回收的塊BLOCKIDGetNextCompactionBlock(BLOCKIDblockID);〃回收塊線程,等待開始命令,然后進(jìn)行動(dòng)作DWORDCompactorThread();private:〃通知開始回收的事件HANDLEm_hStartCompacting;〃通知回收完成的事件HANDLEm_hCompactionComplete;SectorMgr*m_pSectorMgr;MappingTable*m_pMap;};3、FMD層(FlashMediaDriver)FMD層是對(duì)NANDFlash進(jìn)行實(shí)際的I/O動(dòng)作的驅(qū)動(dòng)層。該程序與FAL層鏈接即生成完整的NANDFlash的驅(qū)動(dòng)程序。除此之外,該層程序也可與Bootloader相鏈接,使得Bootloader能夠支持對(duì)NANDFlash進(jìn)行燒寫。1)數(shù)據(jù)結(jié)構(gòu)定義FMDInterface該結(jié)構(gòu)用于將FMD層的函數(shù)接口傳給FAL層,FAL層使用這些函數(shù)指針對(duì)NANDFlash進(jìn)行實(shí)際的操作。typedefstruct_FMDInterface{DWORDcbSize;PFN_INITpInit;PFN_DEINITpDeInit;PFN_GETINFOpGetInfo;PFN_GETBLOCKSTATUSpGetBlockStatus;PFN_SETBLOCKSTATUSpSetBlockStatus;PFN_READSECTORpReadSector;PFN_WRITESECTORpWriteSector;PFN_ERASEBLOCKpEraseBlock;PFN_POWERUPpPowerUp;PFN_POWERDONpPowerDown;PFN_OEMIOCONTROLpOEMIoControl;}FMDInterface,*PFMDInterface;結(jié)構(gòu)成員描述如下:cbSize:該數(shù)據(jù)結(jié)構(gòu)的大小。pInit:指向FMD_Init函數(shù)的指針。pDeInit:指向FMD_Deinit函數(shù)的指針。pGetInfo:指向FMD_GetInfo函數(shù)的指針。pGetBlockStatus:指向FMD_GetBlockStatus函數(shù)的指針。pSetBlockStatus:指向FMD_SetBlockStatus函數(shù)的指針。pReadSector:指向FMD_ReadSector函數(shù)的指針。pWriteSector:指向FMD_WriteSector函數(shù)的指針。pEraseBlock:指向FMD_EarseBlock函數(shù)的指針。pPowerUp:指向FMD_PowerUp函數(shù)的指針。pPowerDown:指向FMD_PowerDown函數(shù)的指針。pOEMIoControl:指向FMD_OEMIoControl函數(shù)的指針。在FAL層的DSK_Init()函數(shù)(驅(qū)動(dòng)加載時(shí)的初始化函數(shù))中,F(xiàn)AL層會(huì)調(diào)用GetFMDInterface()函數(shù)獲取FMD層的這些接口函數(shù)指針,之后FAL層中對(duì)NANDFlash的操作都是通過調(diào)用這些函數(shù)指針來實(shí)現(xiàn)。代碼如下所示:DWORDDSK_Init(){PDEVICEpDevice=g_pDevice;???〃獲取FMD函數(shù)指針GetFMDInterface();???}VOIDGetFMDInterface(){FMD.cbSize=sizeof(FMDInterface);FMD.pInit=FMD_Init;FMD.pDeInit=FMD_Deinit;FMD.pGetInfo=FMD_GetInfo;FMD.pGetBlockStatus=FMD_GetBlockStatus;FMD.pSetBlockStatus=FMD_SetBlockStatus;FMD.pReadSector=FMD_ReadSector;FMD.pWriteSector=FMD_WriteSector;FMD.pEraseBlock=FMD_EraseBlock;FMD.pPowerUp=FMD_PowerUp;FMD.pPowerDown=FMD_PowerDown;}Flashinfo該數(shù)據(jù)結(jié)構(gòu)保存了有關(guān)Flash存儲(chǔ)器的相關(guān)信息。typedefstruct_FlashInfo{FLASH_TYPEflashType;DWORDdwNumBlocks;DWORDdwBytesPerBlock;WORDwSectorsPerBlock;WORDwDataBytesPerSector;}FlashInfo,*PFlashInfo;結(jié)構(gòu)成員描述如下:flashType:Flash的類型,NAND或者NORFlash。dwNumBlocks:Flash存儲(chǔ)器物理塊個(gè)數(shù)。dwBytesPerBlock:每個(gè)塊的字節(jié)數(shù)。wSectorsPerBlock:每個(gè)塊的扇區(qū)數(shù)。wDataBytesPerSector:每個(gè)扇區(qū)的字節(jié)數(shù)。該數(shù)據(jù)結(jié)構(gòu)用于FMD層向FAL層返回有關(guān)Flash的物理信息。FAL層通過調(diào)用FMD層的FMD_GetInfo()函數(shù)來獲取信息。SectorInfo該數(shù)據(jù)結(jié)構(gòu)保存了有關(guān)Flash存儲(chǔ)器上每個(gè)扇區(qū)相關(guān)信息。typedefstruct_SectorInfo{DWORDdwReserved1;BYTEbOEMReserved;BYTEbBadBlock;WORDwReserved2;}SectorInfo,*PSectorInfo;結(jié)構(gòu)成員描述如下:dwReservedl:該部分保留給FAL層使用,F(xiàn)AL層將填寫邏輯扇區(qū)號(hào)。bOEMReserved:該部分保留給OEM使用,可用于定于讀寫屬性。bBadBlock:該字節(jié)是由Flash芯片壞塊標(biāo)志定義。wReserved2:該部分保留給FAL層使用,F(xiàn)AL層將填寫標(biāo)志位來防止掉電錯(cuò)誤。FAL層通過FMD_ReadSector、FMD_WriteSector函數(shù)來獲取或?qū)懭肷葏^(qū)信息。stPXANandFlash(FMD層內(nèi)部數(shù)據(jù)結(jié)構(gòu))該數(shù)據(jù)結(jié)構(gòu)用于保存有關(guān)操作NANDFlash的上下文信息,該結(jié)構(gòu)是FMD層內(nèi)部使用的數(shù)據(jù)結(jié)構(gòu)。typedefstruct_stPXANandFlash{VolatileGPIO_REGS*v_pGPIORegs;PBYTEpbBassAdd;DWORDdwPagePerBlock;DWORDdwSectorsPerChip;DWORDdwPagesPerChip;DWORDdwBlocksPerChip;DWORDdwDeviceId;FlashInfoInfo;}stPXANandFlash,*PstPXANandFlash;結(jié)構(gòu)成員描述如下:v_pGPIORegs:GPIO口控制寄存器。pbBassAdd:PXA255的StaticBank1地址空間的起始地址,即nCS[l]地址空間。dwPagePerBlock:Flash每個(gè)塊的頁數(shù)。dwSectorsPerChip:每個(gè)Flash存儲(chǔ)芯片的扇區(qū)數(shù)。dwPagesPerChip:每個(gè)Flash存儲(chǔ)芯片的頁數(shù)。dwBlocksPerChip:每個(gè)Flash存儲(chǔ)芯片的塊數(shù)。dwDeviceId:NANDFlash的廠商ID。Info:FlashInfo結(jié)構(gòu)的信息,用于返回給FAL層。2)函數(shù)接口定義由上面的數(shù)據(jù)結(jié)構(gòu)可知,F(xiàn)MD層所需要提供的函數(shù)接口如下所示。函數(shù)名稱功能描述FMDInit初始化Flash,由DSKInit函數(shù)調(diào)用。FMDDeinit卸載Flash,由DSK

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論