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 算法微软并未公开,故很难将这种机制模拟的一模一样。
的区域被 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 /