?
WinCE下应用程序直接读 / 写 / 擦除flash 设备的方法
?
在网上的很多论坛中都看到有人提问: 应用程序如何直接读写 Flash 的扇区, 或者是类似的
问题。 总之,就是希望应用程序能够直接访问 Flash 设备,直接读写扇区的数据,或者作其
他的操作。这几天没事,就尝试着做了一下,把我的方法介绍给大家。
在网上的很多论坛中都看到有人提问: 应用程序如何直接读写 Flash 的扇区, 或者是类
似的问题。 总之,就是希望应用程序能够直接访问 Flash 设备,直接读写扇区的数据,或者
作其他的操作。这几天没事,就尝试着做了一下,把我的方法介绍给大家。
先做个简单的介绍。 WinCE支持 Flash 设备, 一般指 Nandflash 或者是 NORFlash,采用
的架构一般是 FAL+FMD架构,我们实现 FMD相关的接口函数, Flash 的驱动就算完成了。当
WinCE启动以后,我们能够看到 Flash 设备的磁盘。我们可以操作磁盘上面的文件,但是不
能直接操作 flash 设备,对 Flash 设备的操作无非就是:读,写,擦除,读 ID。
现在开始介绍实现的方法。我们如果想在应用程序中直接调用 FMD中的
FMD_ReadSector(..) ,FMD_WriteSector(..) ,FMD_EraseBlock(..) 是不太现实的。这里再
补充一下,这三个函数分别是 Flash 的读扇区,写扇区,擦除块的函数。好像有点罗嗦了。
但是我们可以在应用程序中调用到 FMD_OEMIoControl(..) 函数,这个是可以做到的。所以
我们需要改一下 Flash 设备的驱动程序,也就是改 Flash 设备驱动中的
FMD_OEMIoControl(..) 这个函数。我的改动如下:
BOOL FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize,
PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
{
PFMDInterface pInterface = (PFMDInterface)pOutBuf;
RETAILMSG(1, (TEXT("FMD_OEMIoControl: control code is 0x%x"),
dwIoControlCode));
switch(dwIoControlCode)
{
case IOCTL_FMD_GET_INTERFACE:
if (!pOutBuf || nOutBufSize < sizeof(FMDInterface))
{
DEBUGMSG(1, (TEXT("FMD_OEMIoControl: IOCTL_FMD_GET_INTERFACE bad
parameter(s).")));
return(FALSE);