版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
NANDFlash驱动程序1、NANDFlash驱动程序框架FAT文件系统下的NANDFlash驱动程序采用了分层结构。驱动程序的上层是Flash抽象层,是物理操作无关层,该层对NANDFlash的操作进行抽象,并采用一定的策略平衡了NANDFlash的擦写。NANDFlash驱动程序的结构如图5.5所示。FileSystem(FAT)FAL
(FlashAbstractionLayer)FMD
(FlashMediaDriver)FlashHardware图5.5FAT下NANDFlash驱动结构在图中:FileSystem即文件系统。在这里,采用的是FAT文件系统。FAT文件系统是一种采用链式分配方式的文件系统。并没有对NANDFlash的特点优化,因此需要在下层的驱动程序做优化。FlashDriver即NANDFlash驱动程序。对上层的文件系统提供以DSK为前缀的流驱动接口。该层驱动程序本身分为两层:FAL层、FMD层。(1)、FAL层即FlashAbstractionLayer,Flash抽象层。该层主要提供三个功能:A、将物理的Flash抽象成统一的接口提供给上层的文件系统。B、将逻辑扇区地址转换成物理扇区地址。上层的FAT文件系统使用的是逻辑扇区地址,并不是真正的物理扇区,其转换由FAL实现。C、对Flash实现损耗平衡("Wear-level")。为了避免反复的擦写Flash的同一个块,需要一种策略来减少反复的擦写块。(2)、FMD层即FlashMediaDriver,Flash介质驱动层。该层实现FAL层的请求,对Flash物理扇区进行操作。FlashHardware即NANDFlash物理芯片。2、FAL层(FlashAbstractionLayer)1)函数接口定义FAL层对上的函数接口也就是整个NANDFlash驱动程序的对外接口,由于NANDFlash是块设备,WindowsCE中块设备采用的是流驱动接口,流驱动接口是一个标准的统一接口,只是各个驱动的前缀不同,在这里NANDFlash函数接口的前缀为“DSK”,这个前缀也使得WindowsCE将“DSKxx:”的文件名看作为设备,使得我们能够通过WindowsCE标准的Win32API,如CreateFile、DeviceIOControl等来对设备进行打开、读写等操作。具体的函数接口定义如下: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);这里,实际使用的函数只有DSK_Init、DSK_Deinit、DSK_IOControl、DSK_PowerUp、DSK_PowerDown。其他函数均为空函数。DSK_InitNANDFlash驱动程序初始化函数,系统启动时加载驱动程序时会通过设备管理器调用此函数对NANDFlash进行初始化。DSK_DeinitNANDFlash驱动程序卸载函数,在卸载驱动程序的时候调用此函数。DSK_IOControlNANDFlash驱动程序的I/O函数,所有对设备进行的读写擦等操作都是由该函数实现的,也是上层主要使用的函数,而DSK_Read、DSK_Write、DSK_Seek均为空函数,不起任何作用。DSK_PowerUpNANDFlash驱动程序电源管理函数。在系统唤醒时调用此函数对Flash进行电源管理。此函数是通过调用FMD层的电源管理函数实现的。DSK_PowerDownNANDFlash驱动程序电源管理函数。在系统睡眠时调用此函数对Flash进行电源管理。此函数是通过调用FMD层的电源管理函数实现的。2)数据结构定义>DISK_INFODISK_INFO结构包含了有关磁盘设备的扇区数等物理信息,系统通过该结构来了解设备具体物理细节,该结构是通过DISKIOCTLGETINFO获取的。typedefstruct_DISK_INFO{DWORDdi_total_sectors;DWORDdi_bytes_per_sect;DWORDdi_cylinders;DWORDdi_heads;DWORDdi_sectors;DWORDdi_flags;}DISKINFO,*PDISKINFO;结构成员描述如下:di_total_sectors:设备扇区总数,一般情况下,块设备总是以扇区为单位进行操作。di_bytes_per_sect:每个扇区的字节数。di_cylinders:如果设备支持CHS寻址模式,则表示柱面数。di_heads:如果设备支持CHS寻址模式,则表示每个柱面磁头数。di_sectors:如果设备支持CHS寻址模式,则表示每个磁道扇区数。由于NANDFlash没有磁头、柱面等概念,因此不使用CHS寻址模式,该模式是磁盘所特有的。diflags:标志位,其可能的值如下:FlagDescriptionDISKINFOFLAGMBR设备使用MBRDISKINFOFLAGCHSUNCERTAIN设备不支持CHS寻址模式DISKINFOFLAGUNFORMATTED设备需要格式化DISKINFOFLAGPAGEABLE设备支持请求页SG_BUFSG_BUF用于读写IOCTLs使用的缓冲,在使用DSK_IOControl函数对NANDFlash进行读写时,需传入该结构来表示要写入或读出的数据缓冲。typedefstruct_SG_BUF{PUCHARsb_buf;DWORDsb_len;}SG_BUF,*PSG_BUF;结构成员描述如下:sb_buf:缓冲指针。sb_len:缓冲长度。SG_REQ该结构包含了上层读写的请求的具体要求,如从什么地址开始读写多大的数据。此结构的参数sr_sglist即指向上面所示的SG_BUF结构。FAT文件系统使用SG_REQ请求驱动程序进行读写。typedefstruct_SG_REQ{DWORDsr_start;DWORDsr_num_sec;DWORDsr_num_sg;DWORDsr_status;PFN_REQDONEsr_callback;SG_BUFsr_sglist[1];}SG_REQ,*PSG_REQ;结构成员描述如下:sr_start:读写请求的起始扇区号。sr_num_sec:读写的扇区数。sr_num_sg:指向的SG_BUF的个数。sr_status:返回的请求状态。sr_callback:请求结束的回调函数
sr_sglist:起始SG_BUF的指针。3)FAL层具体功能FAL层由类FAL、类MappingTable、类SectorMgr、类Compactor组成。整个FAL层的功能是由三个功能部分组成的。如图5.6所示。FALBuildupMappingInfo()MappingTable*mpMap#MappingTableReadFromMedia()SectorMgr*
BuildupMappingInfo()MappingTable*mpMap#MappingTableReadFromMedia()SectorMgr*
mpSectorMgrSectorMgrWriteToMedia()DeleteSectors()Compactor*
DeleteSectors()Compactor*
mpCompactorCompactor图5.6FAL类结构(1)、类FAL类FAL有三个成员变量,分别为其三个功能部分的对象。这三个部分分别为:逻辑扇区到物理扇区映射表扇区管理器垃圾块回收器类FAL的功能就是通过这三个功能部分的协作实现逻辑扇区到物理扇区的映射,并平衡NANDFlash擦写的次数。类FAL提供的功能包括了读、写、删除和建立映射表函数。下面是示意代码:classFal{public://flash读函数BOOLReadFromMedia(PSG_REQpSG_req,BOOLfDoMap);//flash写函数BOOLWriteToMedia(PSG_REQpSG_req,BOOLfDoMap);//flash删除函数BOOLDeleteSectors(DWORDdwStartLogSector,DWORDdwNumSectors);protected://flash扫描并建立映射表函数virtualBOOLBuildupMappingInfo();public:MappingTable*m_pMap;〃逻辑扇区到物理扇区映射表SectorMgr*m_pSectorMgr;〃扇区管理器Compactor*m_pCompactor;〃垃圾块回收器};2)、类MappingTable类MappingTable提供给FAL相关的映射功能。所有的映射数据都放在一张表中,这张表保存在类MappingTable的成员变量m_pDynamicLUT[MASTER_TABLE_SIZE冲。其映射表结构如图5.7。图5.7FAL层映射表结构该表是一张二级映射表,主映射表(MasterTable)共有256项,因此m_pDynamicLUT是一个大小为256的数组,数组的成员是一个指向二级映射表(SecondaryTables)的指针。二级映射表每一项存放了该逻辑扇区地址相对应的物理扇区地址。类MappingTable的示意代码如下:classMappingTable{public:〃查找映射表获取逻辑扇区地址的物理扇区地址PBYTEGetPhysicalSectorAddr(SECTOR_ADDRlogicalSectorAddr,PSECTOR_ADDRpPhysicalSectorAddr);〃将物理扇区地址填入映射到指定的逻辑扇区地址PBYTEMapLogicalSector(SECTOR_ADDRlogicalSectorAddr,SECTOR_ADDRphysicalSectorAddr,PSECTOR_ADDRpExistingPhysicalSectorAddr);private:〃扇区映射表PUCHARm_pDynamicLUT[MASTER_TABLE_SIZE];};(3)、类SectorMgr类SectorMgr主要用于管理空闲(free)扇区、脏(dirty)扇区信息。其内部具体结构如图5.8所示。SectorMgrSMListAddSectorsToListSMListmlistsAddSectorsUnmarkSectorsAsFreem_lists[Free]Compactor*StartCompactorGetNextFreeSector-…Compactor*mpCompactorMarkSectorsAsDirtyDirtyList
SectorMgrSMListAddSectorsToListSMListmlistsAddSectorsUnmarkSectorsAsFreem_lists[Free]Compactor*StartCompactorGetNextFreeSector-…Compactor*mpCompactorMarkSectorsAsDirtyDirtyList
mdirtyListDirtyListAddDirtySectorsUnmarkSectorsAsDirtyRemoveDirtySectors图5.8扇区管理器结构为了维护这些信息,SectorMgr使用了一种简单而有效的压缩算法,即ConsecutiveItemCompression(CIC)。这种算法其实是一种仅仅记录连续数据的结点链数据结构。即每个结点记录连续数据的起始地址和结尾地址,并包含下一结点的指针。例如,有一串数据,0,1,2,3,4,5,6,7,8,12,13,14,15,16,17,18,20,21,400,401,402...1082,23576则记录这串数据的结构如图5.9所示。图5.9CIC压缩结构从图中可看出,只需要三个结点即可描述所需要维护的庞大数据,所以这是一种相当有效的数据结构。而这种数据结构之所以能够很好的工作,是由于FAL层的垃圾块回收器(Compactor)的协作。垃圾块回收器(Compactor)总是将Flash中的块以整块的方式进行回收,即使得块中的扇区以连续的方式得到释放。其示意代码如下:classSectorMgr{public:〃加入空闲扇区链表BOOLAddSectorsToList(ListTypelistType,SECTOR_ADDRstartingSectorAddr,DWORDdwNumSectors);〃去除空闲扇区BOOLUnmarkSectorsAsFree(SECTOR_ADDRstartingPhysicalSectorAddr,DWORDdwNumSectors);〃获取下一个起始空闲扇区BOOLGetNextFreeSector(PSECTOR_ADDRpPhysicalSectorAddr,BOOLbCritical);〃将扇区标记为脏BOOLMarkSectorsAsDirty(SECTOR_ADDRstartingPhysicalSectorAddr,DWORDdwNumSectors);〃去除脏扇区BOOLUnmarkSectorsAsDirty(SECTOR_ADDRstartingPhysicalSectorAddr,DWORDdwNumSectors);private:
〃空闲扇区链表SMListm_lists[NUM_LIST_TYPES];〃脏扇区表DirtyListm_dirtyList;〃垃圾回收器Compactor*m_pCompactor;};(4)、类Compactor类Compactor,即垃圾回收器,用于将NANDFlash上的块回收加入空闲链表。其内部结构如图5.10所示。图5.10垃圾回收器结构如何选择块则由一定的策略而定,如最少脏页块。如果回收块中有有效数据,则将有效数据复制到新的空闲扇区中,并重新对其进行映射。垃圾回收器的启动时机则由SectorMgr的GetNextFreeSector()函数中决定垃圾回收的时机,这个时机是在Flash中可用的扇区低于一定的阈值或者低于Flash中的脏扇区数的时候。也就是说,当系统企图获得空闲扇区的时候,发现Flash中的空闲扇区低于预期了,则开始垃圾回收来获取更多的空闲扇区。其示意代码如下。classCompactor{public:〃开始进行垃圾块回收BOOLStartCompactor(DWORDdwPriority,DWORDdwFreeSectorsNeeded,BOOLbCritical);〃实际回收动作在此函数完成DWORDCompactBlock(BLOCK_IDblockID,SECTOR_ADDRtreatAsDirtySectorAddr);〃根据某种策略获取下一个回收的块BLOCKIDGetNextCompactionBlock(BLOCKIDblockID);〃回收块线程,等待开始命令,然后进行动作DWORDCompactorThread();private:〃通知开始回收的事件HANDLEm_hStartCompacting;〃通知回收完成的事件HANDLEm_hCompactionComplete;SectorMgr*m_pSectorMgr;MappingTable*m_pMap;};3、FMD层(FlashMediaDriver)FMD层是对NANDFlash进行实际的I/O动作的驱动层。该程序与FAL层链接即生成完整的NANDFlash的驱动程序。除此之外,该层程序也可与Bootloader相链接,使得Bootloader能够支持对NANDFlash进行烧写。1)数据结构定义FMDInterface该结构用于将FMD层的函数接口传给FAL层,FAL层使用这些函数指针对NANDFlash进行实际的操作。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;结构成员描述如下:cbSize:该数据结构的大小。pInit:指向FMD_Init函数的指针。pDeInit:指向FMD_Deinit函数的指针。pGetInfo:指向FMD_GetInfo函数的指针。pGetBlockStatus:指向FMD_GetBlockStatus函数的指针。pSetBlockStatus:指向FMD_SetBlockStatus函数的指针。pReadSector:指向FMD_ReadSector函数的指针。pWriteSector:指向FMD_WriteSector函数的指针。pEraseBlock:指向FMD_EarseBlock函数的指针。pPowerUp:指向FMD_PowerUp函数的指针。pPowerDown:指向FMD_PowerDown函数的指针。pOEMIoControl:指向FMD_OEMIoControl函数的指针。在FAL层的DSK_Init()函数(驱动加载时的初始化函数)中,FAL层会调用GetFMDInterface()函数获取FMD层的这些接口函数指针,之后FAL层中对NANDFlash的操作都是通过调用这些函数指针来实现。代码如下所示:DWORDDSK_Init(){PDEVICEpDevice=g_pDevice;•••〃获取FMD函数指针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该数据结构保存了有关Flash存储器的相关信息。typedefstruct_FlashInfo{FLASH_TYPEflashType;DWORDdwNumBlocks;DWORDdwBytesPerBlock;WORDwSectorsPerBlock;WORDwDataBytesPerSector;}FlashInfo,*PFlashInfo;结构成员描述如下:flashType:Flash的类型,NAND或者NORFlash。dwNumBlocks:Flash存储器物理块个数。dwBytesPerBlock:每个块的字节数。wSectorsPerBlock:每个块的扇区数。wDataBytesPerSector:每个扇区的字节数。该数据结构用于FMD层向FAL层返回有关Flash的物理信息。FAL层通过调用FMD层的FMD_GetInfo()函数来获取信息。SectorInfo该数据结构保存了有关Flash存储器上每个扇区相关信息。typedefstruct_SectorInfo{DWORDdwReserved1;BYTEbOEMReserved;BYTEbBadBlock;WORDwReserved2;}SectorInfo,*PSectorInfo;结构成员描述如下:dwReservedl:该部分保留给FAL层使用,FAL层将填写逻辑扇区号。bOEMReserved:该部分保留给OEM使用,可用于定于读写属性。bBadBlock:该字节是由Flash芯片坏块标志定义。wReserved2:该部分保留给FAL层使用,FAL层将填写标志位来防止掉电错误。FAL层通过FMD_ReadSector、FMD_WriteSector函数来获取或写入扇区信息。stPXANandFlash(FMD层内部数据结构)该数据结构用于保存有关操作NANDFlash的上下文信息,该结构是FMD层内部使用的数据结构。typedefstruct_stPXANandFlash{VolatileGPIO_REGS*v_pGPIORegs;PBYTEpbBassAdd;DWORDdwPagePerBlock;DWORDdwSectorsPerChip;DWORDdwPagesPerChip;DWORDdwBlocksPerChip;DWORDdwDeviceId;FlashInfoInfo;}stPXANandFlash,*PstPXANandFlash;结构成员描述如下:v_pGPIORegs:GPIO口控制寄存器。pbBassAdd:PXA255的StaticBank1地址空间的起始地址,即nCS[l]地址空间。dwPagePerBlock:Flash每个块的页数。dwSectorsPerChip:每个Flash存储芯片的扇区数。dwPagesPerChip:每个Flash存储芯片的页数。dwBlocksPerChip:每个Flash存储芯片的块数。dwDeviceId:NANDFlash的厂商ID。Info:FlashInfo结构的信息,用于返回给FAL层。2)函数接口定义由上面的数据结构可知,FMD层所需要提供的函数接口如下所示。函数名称功能描述FMDInit初始化Flash,由DSKInit函数调用。FMDDeinit卸载Flash,由DSK
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 术后并发症个案
- 中医基础理阴阳五行
- abt0506时间管理与工作统筹技巧
- ICU病人的安全管理
- 2026秋沪科版八年级物理 第一章 运动的世界综合能力检测题
- 【单元培优卷】Unit 6 Useful numbers 单元全真模拟培优卷-2026-2027学年三年级英语上册人教版(PEP)(新教材)(含答案解析)
- 公司行政后勤个人总结
- 2026北师大二下有多少个字新课标课件
- 2026年机械设计笔试题库及答案
- 氧气雾化吸入的常见并发症
- 滚针美容治疗技术解析
- 儿童自闭症康复中心项目商业计划书
- 莱州市月季产业发展规划(2018-2022年)
- 2025黑龙江七台河辰能生物质发电有限公司招聘笔试参考题库附带答案详解
- 中世纪欧洲大学的兴起与发展
- 《毛泽东思想和中国特色社会主义理论体系概论》附有答案
- 兰州市文职辅警招聘考试真题
- 田英章毛笔楷书2500字(简体版)
- 柴油机发电作业岗位职业危害告知卡
- 胰腺癌的影像诊断与鉴别诊断
- GCP培训教学讲解课件
评论
0/150
提交评论