欢迎来到天天文库
浏览记录
ID:41007869
大小:33.50 KB
页数:5页
时间:2019-08-13
《在WinCE下,应用程序直接读写擦除flash设备的方法》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、WinCEWinCE1WinCEWinCE1在网上的很多论坛中都看到有人提问:应用程序如何直接读写Flash的扇区,或者是类似的问题。总之,就是希望应用程序能够直接访问Flash设备,直接读写扇区的数据,或者作其他的操作。这几天没事,就尝试着做了一下,把我的方法介绍给大家。先做个简单的介绍。WinCE支持Flash设备,一般指Nandflash或者是NORFlash,采用的架构一般是FAL+FMD架构,我们实现FMD相关的接口函数,Flash的驱动就算完成了。当WinCE启动以后,我们能够看到Flash设备的磁盘。我们可以操作磁盘上面的文件,但是
2、不能直接操作flash设备,对Flash设备的操作无非就是:读,写,擦除,读ID。现在开始介绍实现的方法。我们如果想在应用程序中直接调用FMD中的FMD_ReadSector(..),FMD_WriteSector(..),FMD_EraseBlock(..)是不太现实的。这里再补充一下,这三个函数分别是Flash的读扇区,写扇区,擦除块的函数。好像有点罗嗦了。但是我们可以在应用程序中调用到FMD_OEMIoControl(..)函数,这个是可以做到的。所以我们需要改一下Flash设备的驱动程序,也就是改Flash设备驱动中的FMD_OEMIoC
3、ontrol(..)这个函数。我的改动如下:BOOL FMD_OEMIoControl(DWORDdwIoControlCode,PBYTEpInBuf,DWORDnInBufSize,PBYTEpOutBuf,DWORDnOutBufSize,PDWORDpBytesReturned){ PFMDInterfacepInterface=(PFMDInterface)pOutBuf; RETAILMSG(1,(TEXT("FMD_OEMIoControl:controlcodeis0x%xr"),dwIoControlCode));
4、 switch(dwIoControlCode) { caseIOCTL_FMD_GET_INTERFACE: if(!pOutBuf
5、
6、nOutBufSize7、 pInterface->cbSize=sizeof(FMDInterface); pInterface->pInit=FMD_Init; pInterface->pDeInit=FMD_Deinit; pInterface->pGetInfo=FMD_GetInfo; pInterface->pGetInfoEx=NULL;//FMD_GetInfoEx; pInterface->pGetBlockStatu8、s=FMD_GetBlockStatus; pInterface->pSetBlockStatus=FMD_SetBlockStatus; pInterface->pReadSector=FMD_ReadSector; pInterface->pWriteSector=FMD_WriteSector; pInterface->pEraseBlock=FMD_EraseBlock; pInterface->pPowerUp=FMD_Power9、Up; pInterface->pPowerDown=FMD_PowerDown; pInterface->pGetPhysSectorAddr=NULL; pInterface->pOEMIoControl=FMD_OEMIoControl; break; case0xff123456: FMD_ReadSector(..); //调用读Sector函数 10、 break; case0xff654321: FMD_WriteSector(..);
7、 pInterface->cbSize=sizeof(FMDInterface); pInterface->pInit=FMD_Init; pInterface->pDeInit=FMD_Deinit; pInterface->pGetInfo=FMD_GetInfo; pInterface->pGetInfoEx=NULL;//FMD_GetInfoEx; pInterface->pGetBlockStatu
8、s=FMD_GetBlockStatus; pInterface->pSetBlockStatus=FMD_SetBlockStatus; pInterface->pReadSector=FMD_ReadSector; pInterface->pWriteSector=FMD_WriteSector; pInterface->pEraseBlock=FMD_EraseBlock; pInterface->pPowerUp=FMD_Power
9、Up; pInterface->pPowerDown=FMD_PowerDown; pInterface->pGetPhysSectorAddr=NULL; pInterface->pOEMIoControl=FMD_OEMIoControl; break; case0xff123456: FMD_ReadSector(..); //调用读Sector函数
10、 break; case0xff654321: FMD_WriteSector(..);
此文档下载收益归作者所有