成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在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\r\n"), 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).\r\n")));
                 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: unrecognized IOCTL (0x%x).\r\n"), dwIoControlCode));
            return(FALSE);
    }

    return(TRUE);
}

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

 

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

 

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

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NANDFlash]
"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_MACHINE\System\StorageManager\Profiles\NSFlash]
 "Name"="Ep94xx NAND Flash"
 "Folder"="NANDFlash"
 "PartitionDriver"="MSPart.dll"
 "AutoMount"=dword:1
 "AutoPart"=dword:1
 "AutoFormat"=dword:1

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NSFlash\FATFS]
"EnableCache"=dword:1
"CacheSize"=dword:1000
"MountBootable"=dword:1
"Flags"=dword:00000024
"CheckForFormat"=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 Sector
 iRet = DeviceIoControl(hFirm, 0xff654321, para1, para2, para3, para4, para5, para6);  //Write Flash Sector
 iRet = DeviceIoControl(hFirm, 0xff123457, para1, para2, para3, para4, para5, para6);  //Erase Flash Block

 printf("DeviceIoControl OK\r\n");


 while(1)
  ;

通過上面的應用程序,就能夠調用到Flash設備驅動中的FMD_OEMIoControl(..)函數,這樣根據不同的case就可以調用讀/寫/擦除函數了。

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

[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\NANDFlash]
"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_MACHINE\System\StorageManager\Profiles\NSFlash]
 "Name"="Ep94xx NAND Flash"
 "Folder"="NANDFlash"
 "PartitionDriver"="MSPart.dll"
 "AutoMount"=dword:1
 "AutoPart"=dword:1
 "AutoFormat"=dword:1

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\NSFlash\FATFS]
"EnableCache"=dword:1
"CacheSize"=dword:1000
"MountBootable"=dword:1
"Flags"=dword:00000024
"CheckForFormat"=dword:1

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\NSFlash]
"DriverPath"="Drivers\\BuiltIn\\NANDFlash"
"LoadFlags"=dword:0
"BootPhase"=dword:1

然后編寫應用程序,主要就是通過OpenStore來打開NSFlash,然后通過DeviceIoControl(..)函數來調用FMD_OEMIoControl(..)函數,來達到直接讀/寫/擦除Flash設備的目的。應用程序代碼如下:

 HANDLE hFirm;

 hFirm = OpenStore(L"NSFlash");
 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 OK\r\n");


 while(1)
  ;

通過這種方法,也可以在應用程序中調用到FMD_OEMIoControl(..)函數,從而達到直接訪問Flash設備的目的。

總結一下,上面的兩種方法大致原理其實是一樣的,都是通過DeviceIoControl函數來調用FMD_OEMIoControl函數,然后達到直接訪問Flash驅動的目的,這樣就可以在應用程序中直接讀/寫/擦除Flash設備了。

***需要注意的是:你的Flash驅動里面需要對讀/寫/擦除等直接操作Flash硬件的函數進行保護,因為Flash設備應該是由WinCE的文件系統來管理的,而現在你的應用程序也可以直接訪問它了,所以保險起見,添加互斥量保護避免訪問沖突。

上面的所有實現,都是在WinCE6.0上面做得,相信在WinCE5.0上面應該差不多。

【編輯推薦】

  1. 基于Windows CE的嵌入式電子郵件系統設計與實現
  2. WinCE中nandflash驅動開發介紹
  3. WinCE中串口驅動及接口函數介紹
責任編輯:符甲 來源: 博客園
相關推薦

2009-07-17 13:45:16

WinCE開始菜單

2014-05-13 13:01:13

越過AppStore安裝應用

2010-08-18 09:23:19

Flash Lite移動應用程序開發

2010-03-26 13:12:27

2022-09-27 15:16:42

開發Android應用程序

2011-12-29 11:13:58

移動Web應用程序標準

2009-05-27 15:11:24

2012-03-20 09:20:40

Go語言

2011-04-13 15:09:06

JavaBlackBerry

2009-11-18 09:25:02

linux應用程序

2013-01-14 12:10:46

firefox osfirefox os

2011-03-31 13:15:18

BlackBerry

2011-03-22 10:03:55

Windows AzuSilverlight

2022-08-29 17:34:05

鴻蒙操作系統

2009-07-17 14:35:27

WinCE系統 GSM

2011-08-18 09:47:42

2019-09-02 15:55:20

云計算監控安全

2020-04-11 22:49:47

開源應用程序監控工具

2009-09-22 12:17:59

ibmdwLotus

2011-10-12 11:24:44

AndroidPC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕免费视频 | 亚洲高清免费观看 | 久久com| 欧美视频中文字幕 | 一区二区免费高清视频 | 伊人手机在线视频 | 精品自拍视频在线观看 | 伊人网站视频 | 午夜欧美 | 免费大黄视频 | 国产日产欧产精品精品推荐蛮挑 | 91在线电影| 天天色影视综合 | 日韩高清中文字幕 | 国产黄色小视频在线观看 | 精品国产乱码久久久久久88av | 国产精品免费在线 | 国产成人精品一区二区 | 国产精品国产馆在线真实露脸 | 精品无码久久久久久国产 | 亚洲日日 | 在线成人| 久久夜视频 | 国产精品久久久久久久免费大片 | 天天干人人 | 伊人伊人 | 欧美视频在线观看 | 日韩一区二区福利视频 | 国产精品久久久久久久久久 | 欧美精品欧美精品系列 | 日韩精品一区二区三区在线播放 | 免费观看色| 国产一卡二卡三卡 | 中文字幕亚洲国产 | 久草免费电影 | cao视频| 中文二区 | 国产精品永久免费视频 | 午夜看电影在线观看 | 岛国av免费看| 久久精品国产一区二区三区 |