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 /
 
这样你的code 就可以生成了fasdl.dll, 就可以加载并调试。同事的问题也就得到了解决。
FAL 层里面的东西据说和TUREFS 差不多,大家有兴趣可以研究下,我也要干活了。
 
转自:http://blog.csdn.net/Professionaler/archive/2006/09/07/1188635.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值