WINCE 下的FAL(flash abstraction layer)

WINCE 下的FAL(flash abstraction layer) 
今天同事翻出NAND flash 的驱动问我为啥不能编译出DLL,我一看OAK\BLOCK\MSFLASHFMD确实有问题,就顺便来研究下。  
我们就以该目录下的FASL Code来做下分析。FASLD目录就是生成LIB,先看以下里面的SOURCE 文件:  
TARGETNAME=fasld_lib  
TARGETTYPE=LIBRARY  
WINCEOEM=1  
WINCETARGETFILE0=$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\fasld.def  
INCLUDES=..\;..\..\inc  
CDEFINES=$(CDEFINES) -DREAD_FROM_REGISTRY  
SOURCES=..\fmd.cpp  
对上面的编译定义就不在阐述。  
在看下fasld.def文件中的导出函数列表:  
LIBRARY     FASLD  
EXPORTS  
    DSK_Init  
       DSK_Deinit  
       DSK_Open  
       DSK_Close  
       DSK_Read  
       DSK_Write  
       DSK_Seek  
       DSK_IOControl  
       DSK_PowerDown  
       DSK_PowerUp  
原来 FMD (The flash media driver ) 也是走的BLOCK驱动的接口,在看下FMD。CPP里面的接口函数  
DSK_Init  
       FMD_Deinit  
       FMD _Open  
       FMD _Close  
       FMD _Read  
       FMD _Write  
       FMD _Seek  
       FMD _IOControl  
       FMD _PowerDown  
       FMD _PowerUp  
突然有点郁闷,别急我们看下MSDN,找到了 typedef struct _FMDINTERFACE { DWORD cbSize;  
PFN_INIT pInit;  
PFN_DEINIT pDeInit;  
PFN_GETINFO pGetInfo;  
PFN_GETINFOEX pGetInfoEx;  
PFN_GETBLOCKSTATUS pGetBlockStatus;  
PFN_SETBLOCKSTATUS pSetBlockStatus;  
PFN_READSECTOR pReadSector;  
PFN_WRITESECTOR pWriteSector;  
PFN_ERASEBLOCK pEraseBlock;  
PFN_POWERUP pPowerUp;  
PFN_GETPHYSSECTORADDR pGetPhysSectorAddr;  
} FMDINTERFACE, *PFMDINTERFACE;  
更重要的是获得了这样一条信息:  
When building your driver, verify that your driver links to the Fal.lib link library.  
原来FASLD 要和FAL.lib一起link才能生成我们想要的东西,哈哈,做到这一步基本有了点思路,原来FMD.CPP之所以定义了一堆FMD_XXXXXX是为了满足FMDINTERFACE 接口的回调。在这里可能有人要问我 FAL里面到低做了那些工作,对我也很想知道FAL里面到底做了那些工作,在GOOGLE里面Search了一把,有以下的信息:  
由于WinCE对FAT文件系统读写实现了wear-leveling(磨损均衡)机制,fat table等常进行写入  
的区域被WinCE的FAL层算法均衡的写在flash的不同区域,而不是同一位置反复刷写。而这种  
wear-leveling算法微软并未公开,故很难将这种机制模拟的一模一样。  
彻底绝望,看来MS真的让很多的程序员受伤啊,看到这里只能去FMD。CPP里面实现驱动接口了。至于最后要生成DLL,可能大家要修改下SOURCE文件,比如:  
TARGETNAME=fasld  
TARGETTYPE=DYNLINK  
RELEASETYPE=PLATFORM  
DLLENTRY=DllMain  
WINCEOEM=1  
INCLUDES=..\;..\..\inc  
TARGETLIBS=$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\FAL.LIB                                   \  
           $(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib           \  
           $(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\CEDDK.lib                
CDEFINES=$(CDEFINES) -DREAD_FROM_REGISTRY  
SOURCES=..\fmd.cpp \ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值