在WinCE下,应用程序直接读写擦除flash设备的方法.doc_第1页
在WinCE下,应用程序直接读写擦除flash设备的方法.doc_第2页
在WinCE下,应用程序直接读写擦除flash设备的方法.doc_第3页
在WinCE下,应用程序直接读写擦除flash设备的方法.doc_第4页
在WinCE下,应用程序直接读写擦除flash设备的方法.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

WinCEWinCE1WinCEWinCE1在网上的很多论坛中都看到有人提问:应用程序如何直接读写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%xrn), dwIoControlCode); switch(dwIoControlCode) case IOCTL_FMD_GET_INTERFACE: if (!pOutBuf | nOutBufSize cbSize = sizeof(FMDInterface); pInterface-pInit = FMD_Init; pInterface-pDeInit = FMD_Deinit; pInterface-pGetInfo = FMD_GetInfo; pInterface-pGetInfoEx = NULL; /FMD_GetInfoEx; pInterface-pGetBlockStatus = FMD_GetBlockStatus; pInterface-pSetBlockStatus = FMD_SetBlockStatus; pInterface-pReadSector = FMD_ReadSector; pInterface-pWriteSector = FMD_WriteSector; pInterface-pEraseBlock = FMD_EraseBlock; pInterface-pPowerUp = FMD_PowerUp; pInterface-pPowerDown = FMD_PowerDown; pInterface-pGetPhysSectorAddr = NULL; pInterface-pOEMIoControl = FMD_OEMIoControl; break; case 0xff123456: FMD_ReadSector(.); /调用读Sector函数 break; case 0xff654321: FMD_WriteSector(.); /调用写Sector函数 break; case 0xff123457: FMD_EraseBlock(.); /调用擦除Block函数 break; default: DEBUGMSG(1, (TEXT(FMD_OEMIoControl: unrecognized IOCTL (0x%x).rn), dwIoControlCode); return(FALSE); return(TRUE); 在FMD_OEMIoControl(.)函数里面增加了3个case,这3个case里面调用了读/写/擦除函数。至于Case的值,我是随便定义的。这样Flash设备的驱动部分就改完了。在改完Flash驱动以后,我下面会提供两种方法,每一种方法都和Flash设备的注册表配置有关:1. 以Nandflash为例,当然对于NORFlash来说大同小异,注册表配置如下:HKEY_LOCAL_MACHINEDriversBuiltInNANDFlashDll=ep94xxnandflash.dllPrefix=DSKOrder=dword:4;Ioctl=dword:4Profile=NSFlashIClass=A4E7EDDA-E575-4252-9D6B-4195D48BB865; Override names in default profileHKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlashName=Ep94xx NAND FlashFolder=NANDFlashPartitionDriver=MSPart.dllAutoMount=dword:1AutoPart=dword:1AutoFormat=dword:1HKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlashFATFSEnableCache=dword:1CacheSize=dword:1000MountBootable=dword:1Flags=dword:00000024CheckForFormat=dword:1然后编写应用程序,主要就是通过CreateFile来打开DSK1:设备,然后通过DeviceIoControl(.)函数来调用FMD_OEMIoControl(.)函数,来达到直接读/写/擦除Flash设备的目的。应用程序代码如下:HANDLE hFirm;hFirm = CreateFile(TEXT(DSK1:), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);if(hFirm = INVALID_HANDLE_VALUE) printf(Open Flash Device Failed); return 0;iRet = DeviceIoControl(hFirm, 0xff123456, para1, para2, para3, para4, para5, para6); /Read Flash SectoriRet = DeviceIoControl(hFirm, 0xff654321, para1, para2, para3, para4, para5, para6); /Write Flash SectoriRet = DeviceIoControl(hFirm, 0xff123457, para1, para2, para3, para4, para5, para6); /Erase Flash Blockprintf(DeviceIoControl OKrn);while(1) ;通过上面的应用程序,就能够调用到Flash设备驱动中的FMD_OEMIoControl(.)函数,这样根据不同的case就可以调用读/写/擦除函数了。2. 以Nandflash为例,当然对于NORFlash来说大同小异,注册表配置如下:HKEY_LOCAL_MACHINEDriversBuiltInNANDFlashDll=ep94xxnandflash.dllPrefix=DSKOrder=dword:4;Ioctl=dword:4Profile=NSFlashIClass=A4E7EDDA-E575-4252-9D6B-4195D48BB865; Override names in default profileHKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlashName=Ep94xx NAND FlashFolder=NANDFlashPartitionDriver=MSPart.dllAutoMount=dword:1AutoPart=dword:1AutoFormat=dword:1HKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlashFATFSEnableCache=dword:1CacheSize=dword:1000MountBootable=dword:1Flags=dword:00000024CheckForFormat=dword:1HKEY_LOCAL_MACHINESystemStorageManagerAutoLoadNSFlashDriverPath=DriversBuiltInNANDFlashLoadFlags=dword:0BootPhase=dword:1然后编写应用程序,主要就是通过OpenStore来打开NSFlash,然后通过DeviceIoControl(.)函数来调用FMD_OEMIoControl(.)函数,来达到直接读/写/擦除Flash设备的目的。应用程序代码如下:HANDLE hFirm;hFirm = OpenStore(LNSFlash);if(hFirm = INVALID_HANDLE_VALUE) printf(Open Flash Device Failed); return 0;iRet = DeviceIoControl(hFirm, 0xff123456, para1, para2, para3, para4, para5, para6);iRet = DeviceIoControl(hFirm, 0xff654321, para1, para2, para3, para4, para5, para6);iRet = DeviceIoControl(hFirm, 0xff123457, para1, para2, para3, para4, para5, para6);printf(DeviceIoControl OKrn);while(1) ;通过这种方法,也可以在应用程序中调用到FMD_OEMIoControl(.)函数,从而达到直接访问Flash设备的目的。总结一下,上面的两种方法大致原理其实是一样的,都是通过DeviceIoC

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论