新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 在WinCE下,應用程序直接讀/寫/擦除flash設備的方法

        在WinCE下,應用程序直接讀/寫/擦除flash設備的方法

        作者: 時間:2009-05-27 來源:網絡 收藏
        在網上的很多論壇中都看到有人提問:應用程序如何直接讀寫Flash的扇區,或者是類似的問題。總之,就是希望應用程序能夠直接訪問Flash設備,直接讀寫扇區的數據,或者作其他的操作。這幾天沒事,就嘗試著做了一下,把我的方法介紹給大家。

        先做個簡單的介紹。支持Flash設備,一般指Nandflash或者是,采用的架構一般是,我們實現FMD相關的接口函數,Flash的驅動就算完成了。當啟動以后,我們能夠看到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,DWORDnInBufSize, PBYTE pOutBuf, DWORD nOutBufSize,PDWORDpBytesReturned)

          PFMDInterface pInterface = (PFMDInterface)pOutBuf;

          RETAILMSG(1, (TEXT(FMD_OEMIoControl: control code is0x%xrn),dwIoControlCode));

          switch(dwIoControlCode)

          case IOCTL_FMD_GET_INTERFACE:

          if (!pOutBuf nOutBufSize sizeof(FMDInterface))

          DEBUGMSG(1, (TEXT(FMD_OEMIoControl: IOCTL_FMD_GET_INTERFACEbadmeter(s).rn)));

          return(FALSE);

          pInterface->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: unrecognizedIOCTL(0x%x).rn), dwIoControlCode));

          return(FALSE);

          return(TRUE);

        在FMD_OEMIoControl(..)函數里面增加了3個case,這3個case里面調用了讀/寫/擦除函數。至于Case的值,我是隨便定義的。這樣Flash設備的驅動部分就改完了。

        在改完Flash驅動以后,我下面會提供兩種方法,每一種方法都和Flash設備的注冊表配置有關:

        1. 以Nandflash為例,當然對于來說大同小異,注冊表配置如下:

          [HKEY_LOCAL_MACHINEDriversBuiltInNANDFlash]

          Dll=ep94xxnandflash.dll

          Prefix=DSK

          Order=dword:4

          ;Ioctl=dword:4

          Profile=NSFlash

          IClass=A4E7EDDA-E575-4252-9D6B-4195D48BB865

          ; Override names in default profile

          [HKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlash]

          Name=Ep94xx NAND Flash

          Folder=NANDFlash

          PartitionDriver=MSPart.dll

          AutoMount=dword:1

          AutoPart=dword:1

          AutoFormat=dword:1

          [HKEY_LOCAL_MACHINESystemStorageManagerProfilesNSFlashFATFS]

          EnableCache=dword:1

          CacheSize=dword:1000

          MountBootable=dword:1

          Flags=dword:00000024

          CheckForFormat=dword:1

        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 镇原县| 富锦市| 乐至县| 印江| 仁寿县| 泰宁县| 韩城市| 镇江市| 遂川县| 临夏县| 依安县| 罗甸县| 砀山县| 万年县| 衡阳市| 碌曲县| 江达县| 鹤庆县| 杂多县| 宜兰县| 洛南县| 大足县| 宁明县| 资源县| 老河口市| 绥宁县| 闽清县| 通道| 尼玛县| 鄱阳县| 浪卡子县| 汕头市| 喀喇| 新泰市| 丁青县| 奈曼旗| 巴南区| 开远市| 张家口市| 宝应县| 沁阳市|