现在的位置: 首页 > 综合 > 正文

基于WINCE6.0的nandflash驱动(基于K9F1G08U0B)

2012年10月29日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 评论关闭

*******************************LoongEmbedded********************************

作者:LoongEmbedded

时间:2010.11.26

类别:WINCE驱动开发

********************************LoongEmbedded********************************

 

 

1.       nandflash驱动架构概述

1

 

Windows CE下的FLASH驱动分为两层,分别为FMD层和FAL(flash abstraction layer)FMDFlash Media Driver)属于底层,直接操作Flash硬件,比如读、写和擦除等,不同的Flash硬件则FMD_XXX接口实现函数各不相同,上层则是FAL (Flash Abstraction Layer)层,该层是由微软实现并提供的,是一个与硬件无关的层,可用于FAL层实现扇区的动态分配和坏块管理等。FAL层向应用层(如API)提供DSK接口。例如CreateFile中调用的设备即是调用该FAL层提供的接口。FMD层暴露FMD_XXXFAL层调用。 PB中的阐述如下:

The flash media driver (FMD) is a device driver that performs the actual input and output of data to a flash memory device. An FMD contains all of the device-specific code necessary for read, write, and erase commands to the flash memory device. You can link the FMD with the flash abstraction layer (FAL) to create a block driver that a file system such as FAT can use. You can also link the FMD with a boot loader so that the boot loader can flash a run-time image.

 

2.FALFMD对应的实现代码部分

首先我们知道是由FAL+FMDàsmflash.dll的,下面看看FALFMD分别对应哪些代码:

 

2.1 FAL

FAL: /WINCE600/PRIVATE/WINCEOS/DRIVERS/MSFLASH,这个文件夹下的代码编译出fal.lib

也就是说FAL层是以fal.lib供链接的,fal.lib的导出文件内容如下:

LIBRARY     MSFLASH

 

EXPORTS

        DSK_Init

        DSK_Deinit

        DSK_Open

        DSK_Close

        DSK_Read

        DSK_Write

        DSK_Seek

        DSK_IOControl

                   DSK_PowerDown

                   DSK_PowerUp

 

从上面的导出函数可知FAL层向应用层(如API)提供DSK接口

 

 

2.2 FMD

smflash_lib.lib/WINCE600/PLATFORM/DMA2443/Src/Common/Smartmedia/fmd,这个文件下的代码生成smflash_lib.lib,而/WINCE600/PLATFORM/DMA2443/Src/Common/Smartmedia/Dll

文件夹将生成smflash.dll,下面是其sources的内容:

TARGETNAME=smflash

TARGETTYPE=DYNLINK

RELEASETYPE=PLATFORM

 

WINCEOEM=1

DEFFILE=smflash.def

 

TARGETLIBS=$(_COMMONSDKROOT)/lib/$(_CPUINDPATH)/coredll.lib /

 

SOURCELIBS=$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/fal.lib /

           $(_TARGETPLATROOT)/lib/$(_CPUINDPATH)/smflash_lib.lib

可以知道smflash.dll需要链接fal.libsmflash_lib.lib这个两个库,而fal.lib就是FAL层提供的链接库,smflash_lib.libFMD层提供的链接库。

 

 

3. FAL层和FMD层的交互

 

3.1 FAL层获取FMD层的函数接口

在系统启动过程中,oal.exe 载了kernel.dll, kernel.dll加载device.dll, device.dll加载devmgr.dll, 这个就是负责加载, 卸载, 管理流驱动的. 备管理器找到HKLM/Drivers/BuiltInBusEnum.dll加载, 这是一个总线枚举驱动, 依照ORDER值指示的加载顺序,它来完成后续的加载工作, 也是使用ActiveDevice来加载.设备管理器加载smflash驱动的时候,调用DSK_Init函数,这个函数在falmain.cpp下面定义,下面是其中一部分

2

下面来看GetFMDInterface函数是如何或去FMD提供的接口函数的

3

到此FAL层已经获得FMD层提供的函数接口,结构体FMDInterfacepublic/common/oak/inc/fmd.h中定义,如下:

4

 

3.2 FMD层提供的函数接口

 

3.2.1 PVOID FMD_Init(LPCTSTR lpActiveReg, PPCI_REG_INFO pRegIn, PPCI_REG_INFO pRegOut)

 

FMD_InitFlash设备的初始化函数。在WinCE启动的时候,要加载Flash驱动时,首先调用这个函数对flash设备进行初始化。如果你的系统中有nandflashcontroller,那么你需要在这里对你的nandflash controller进行初始化。如果没有的话,你需要针对你的硬件设计进行相关的片选,时序等进行配置。返回一个handle表示成功,这个handle将被FMD_Deinit(..)函数用到,如果返回NULL表示失败。下面来看看FMD_Init的函数体:

5

nand flash控制器参数TACLSTWRPH0TWRPH1的确定,可以参考我另一篇博文:

http://blog.csdn.net/LoongEmbedded/archive/2010/10/14/5939912.aspx,下面先来了解读取K9F1G08U0BID,读取K9F1G08U0B芯片ID操作首先需要写入读ID命令(0x90),然后再写入0x00地址,就可以读取到一共五个周期的芯片ID,第一个周期为厂商ID,第二个周期为设备ID,第三个周期至第五个周期包括了一些具体的该芯片信息,K9F1G08U0B关于读取ID的操作如下图:

 

6

那么函数ReadFlashID是如何实现的呢,见下图:

7

接下来继续看FMD_Init函数的后半部分:

8

 

3.2.2 BOOL FMD_Deinit(PVOID hFMD)

这个函数在nandflash驱动卸载的时候被调用,参数就是FMD_Init函数返回的Handle.一般在这个函数里面,你可以释放一些用到的资源,然后关闭nandflash controller,但是这里的FMD_Denit函数只是简单返回TRUE,所以就不做介绍了。

 

3.2.3 BOOL FMD_ReadSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors)

 

这个函数用于读nandflash

抱歉!评论已关闭.