您的位置:首页 > 其它

WINCE 下的FAL(flash abstraction layer)

2017-05-22 21:39 232 查看
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 \ 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: