NAND Flash驱动程序结构

  • 格式:doc
  • 大小:152.50 KB
  • 文档页数:11

NAND Flash驱动程序

1、 NAND Flash驱动程序框架

FAT文件系统下的NAND Flash驱动程序采用了分层结构。驱动程序的上层是Flash抽象层,是物理操作无关层,该层对NAND Flash的操作进行抽象,并采用一定的策略平衡了NAND Flash的擦写。NAND Flash驱动程序的结构如图5.5所示。

File System(FAT)FAL(Flash Abstraction Layer)FMD(Flash Media Driver)Flash HardwareFlash Driver

图5.5 FAT下NAND Flash驱动结构

在图中:

 File System

即文件系统。在这里,采用的是FAT文件系统。FAT文件系统是一种采用链式分配方式的文件系统。并没有对NAND Flash的特点优化,因此需要在下层的驱动程序做优化。

 Flash Driver

即NAND Flash驱动程序。对上层的文件系统提供以DSK为前缀的流驱动接口。该层驱动程序本身分为两层:FAL层、FMD层。

(1)、FAL层

即Flash Abstraction Layer,Flash抽象层。该层主要提供三个功能:

A、将物理的Flash抽象成统一的接口提供给上层的文件系统。

B、将逻辑扇区地址转换成物理扇区地址。上层的FAT文件系统使用的是逻辑扇区地址,并不是真正的物理扇区,其转换由FAL实现。

C、对Flash实现损耗平衡("Wear-level")。为了避免反复的擦写Flash的同一个块,需要一种策略来减少反复的擦写块。

(2)、FMD层

即Flash Media Driver,Flash介质驱动层。该层实现FAL层的请求,对Flash物理扇区进行操作。

 Flash Hardware

即NAND Flash物理芯片。

2、FAL层(Flash Abstraction Layer)

1) 函数接口定义

FAL层对上的函数接口也就是整个NAND Flash驱动程序的对外接口,由于NAND Flash是块设备,Windows CE中块设备采用的是流驱动接口,流驱动接口是一个标准的统一接口,只是各个驱动的前缀不同,在这里NAND Flash函数接口的前缀为“DSK”,这个前缀也使得Windows CE将“DSKxx:”的文件名看作为设备,使得我们能够通过Windows CE标准的Win32 API,如CreateFile、DeviceIOControl等来对设备进行打开、读写等操作。 具体的函数接口定义如下:

DWORD DSK_Init(DWORD dwContext);

BOOL DSK_Deinit(DWORD dwContext);

DWORD DSK_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode);

BOOL DSK_Close(DWORD Handle);

DWORD DSK_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes);

DWORD DSK_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwInBytes);

DWORD DSK_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod);

BOOL DSK_IOControl(DWORD Handle, DWORD dwIoControlCode,

PBYTE pInBuf, DWORD nInBufSize,

PBYTE pOutBuf, DWORD nOutBufSize,

PDWORD pBytesReturned);

VOID DSK_PowerUp(VOID);

VOID DSK_PowerDown(VOID);

这里,实际使用的函数只有DSK_Init、DSK_Deinit、DSK_IOControl、DSK_PowerUp、DSK_PowerDown。其他函数均为空函数。

 DSK_Init

NAND Flash驱动程序初始化函数,系统启动时加载驱动程序时会通过设备管理器调用此函数对NAND Flash进行初始化。

 DSK_Deinit

NAND Flash驱动程序卸载函数,在卸载驱动程序的时候调用此函数。

 DSK_IOControl

NAND Flash驱动程序的I/O函数,所有对设备进行的读写擦等操作都是由该函数实现的,也是上层主要使用的函数,而DSK_Read、DSK_Write、DSK_Seek均为空函数,不起任何作用。

 DSK_PowerUp

NAND Flash驱动程序电源管理函数。在系统唤醒时调用此函数对Flash进行电源管理。此函数是通过调用FMD层的电源管理函数实现的。

 DSK_PowerDown

NAND Flash驱动程序电源管理函数。在系统睡眠时调用此函数对Flash进行电源管理。此函数是通过调用FMD层的电源管理函数实现的。

2) 数据结构定义

 DISK_INFO

DISK_INFO结构包含了有关磁盘设备的扇区数等物理信息,系统通过该结构来了解设备具体物理细节,该结构是通过DISK_IOCTL_GETINFO获取的。

typedef struct _DISK_INFO {

DWORD di_total_sectors;

DWORD di_bytes_per_sect;

DWORD di_cylinders;

DWORD di_heads;

DWORD di_sectors;

DWORD di_flags;

} DISK_INFO, *PDISK_INFO; 结构成员描述如下:

di_total_sectors:设备扇区总数,一般情况下,块设备总是以扇区为单位进行操作。

di_bytes_per_sect:每个扇区的字节数。

di_cylinders:如果设备支持CHS寻址模式,则表示柱面数。

di_heads:如果设备支持CHS寻址模式,则表示每个柱面磁头数。

di_sectors:如果设备支持CHS寻址模式,则表示每个磁道扇区数。

由于NAND Flash没有磁头、柱面等概念,因此不使用CHS寻址模式,该模式是磁盘所特有的。

di_flags:标志位,其可能的值如下:

Flag Description

DISK_INFO_FLAG_MBR 设备使用MBR

DISK_INFO_FLAG_CHS_UNCERTAIN 设备不支持CHS寻址模式

DISK_INFO_FLAG_UNFORMATTED 设备需要格式化

DISK_INFO_FLAG_PAGEABLE 设备支持请求页

 SG_BUF

SG_BUF用于读写IOCTLs使用的缓冲,在使用DSK_IOControl函数对NAND Flash进行读写时,需传入该结构来表示要写入或读出的数据缓冲。

typedef struct _SG_BUF {

PUCHAR sb_buf;

DWORD sb_len;

} SG_BUF, *PSG_BUF;

结构成员描述如下:

sb_buf:缓冲指针。

sb_len:缓冲长度。

 SG_REQ

该结构包含了上层读写的请求的具体要求,如从什么地址开始读写多大的数据。此结构的参数sr_sglist 即指向上面所示的SG_BUF结构。FAT文件系统使用SG_REQ请求驱动程序进行读写。

typedef struct _SG_REQ {

DWORD sr_start;

DWORD sr_num_sec;

DWORD sr_num_sg;

DWORD sr_status;

PFN_REQDONE sr_callback;

SG_BUF sr_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所示。

FALMappingTable*m_pMapSectorMgr*m_pSectorMgrCompactor*m_pCompactorBuildupMappingInfo()ReadFromMedia()WriteToMedia()DeleteSectors()SectorMgrCompactorMappingTable

图5.6 FAL类结构

(1)、类FAL

类FAL有三个成员变量,分别为其三个功能部分的对象。这三个部分分别为:

 逻辑扇区到物理扇区映射表

 扇区管理器

 垃圾块回收器

类FAL的功能就是通过这三个功能部分的协作实现逻辑扇区到物理扇区的映射,并平衡NAND Flash擦写的次数。

类FAL提供的功能包括了读、写、删除和建立映射表函数。下面是示意代码:

class Fal

{

public:

//flash读函数

BOOL ReadFromMedia(PSG_REQ pSG_req, BOOL fDoMap);

//flash写函数

BOOL WriteToMedia(PSG_REQ pSG_req, BOOL fDoMap);

//flash删除函数

BOOL DeleteSectors(DWORD dwStartLogSector, DWORD dwNumSectors) ;

protected:

//flash扫描并建立映射表函数

virtual BOOL BuildupMappingInfo() ;

public:

MappingTable* m_pMap; //逻辑扇区到物理扇区映射表

SectorMgr* m_pSectorMgr; //扇区管理器

Compactor* m_pCompactor; //垃圾块回收器

};

(2)、类MappingTable