4753|4

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

WinCE中如何擦除及读写NandFlash [复制链接]

平台:s3c2440a + wince5.0
参考了文章[url=http://blog.eeworld.net/nanjianhui/archive/2008/03/19/2196466.aspx][/url]
在“Src\Common\Smartmedia\Fmd\fmd.cpp”中做了如下修改

  1. BOOL FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize,
  2.                       PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
  3. {
  4.     RETAILMSG(1, (TEXT("FMD_OEMIoControl: control code is 0x%x\r\n"), dwIoControlCode));
  5.     switch(dwIoControlCode)
  6.     {
  7.         #if 0
  8.         case IOCTL_FMD_GET_INTERFACE:
  9.             if (!pOutBuf || nOutBufSize < sizeof(FMDInterface))
  10.             {
  11.                  DEBUGMSG(1, (TEXT("FMD_OEMIoControl: IOCTL_FMD_GET_INTERFACE bad parameter(s).\r\n")));
  12.                  return(FALSE);
  13.             }   
  14.             pInterface->cbSize = sizeof(FMDInterface);
  15.             pInterface->pInit = FMD_Init;
  16.             pInterface->pDeInit = FMD_Deinit;
  17.             pInterface->pGetInfo = FMD_GetInfo;        
  18.             pInterface->pGetInfoEx = NULL; //FMD_GetInfoEx;
  19.             pInterface->pGetBlockStatus = FMD_GetBlockStatus;     
  20.             pInterface->pSetBlockStatus = FMD_SetBlockStatus;
  21.             pInterface->pReadSector = FMD_ReadSector;
  22.             pInterface->pWriteSector = FMD_WriteSector;
  23.             pInterface->pEraseBlock = FMD_EraseBlock;
  24.             pInterface->pPowerUp = FMD_PowerUp;
  25.             pInterface->pPowerDown = FMD_PowerDown;
  26.             pInterface->pGetPhysSectorAddr = NULL;            
  27.             pInterface->pOEMIoControl = FMD_OEMIoControl;            
  28.             break;
  29.       
  30.        case IOCTL_READ_FLASH_SECTOR:
  31.             FMD_ReadSector(..);                //调用读Sector函数
  32.             break;
  33.        case IOCTL_WRITE_FLASH_SECTOR:
  34.             FMD_WriteSector(..);                //调用写Sector函数
  35.             break;
  36.        case IOCTL_ERASE_FLASH_BLOCK:
  37.             FMD_EraseBlock(..);               //调用擦除Block函数
  38.             break;
  39.        #endif

  40.        case IOCTL_READ_FLASH_ID:
  41.             *pOutBuf = ReadFlashID() >> 8;
  42.             *(pOutBuf+1) = ReadFlashID() & 0xff;
  43.             nOutBufSize = 2;

  44.        default:
  45.             DEBUGMSG(1, (TEXT("FMD_OEMIoControl: unrecognized IOCTL (0x%x).\r\n"), dwIoControlCode));
  46.             return(FALSE);
  47.     }

  48.     return(TRUE);
  49. }
复制代码


PB5.0中编译修改的fmd.cpp通过,然后在VS2008的应用程序中,使用如下方法:

  1. HANDLE hReadFlashIDDev;
  2. hReadFlashIDDev = CreateFile(TEXT("DSK1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  3. if(hReadFlashIDDev == INVALID_HANDLE_VALUE)
  4. {
  5.     MessageBox(_T("Open Flash Device Failed"));
  6. }
  7. else
  8. {
  9.     iRet = DeviceIoControl(hReadFlashIDDev, IOCTL_READ_FLASH_ID, NULL, 0, ReadBuffer, ReadBufferSize,
  10.                             NULL, NULL);
  11. }
复制代码


编译运行后,hReadFlashIDDev 一直是 INVALID_HANDLE_VALUE,也就是说驱动“DSK1”没有打开,这是怎么回事???

我的flash注册表如下:
[HKEY_LOCAL_MACHINE\Drivers\BlockDevice\SMFLASH]
  "Prefix"="DSK"
  "Dll"="smflash.dll"
  "Order"=dword:0
  "Ioctl"=dword:4
  "Profile"="SMFLASH"
  "FriendlyName"="MS Flash Driver"
  "MountFlags"=dword:11
  "BootPhase"=dword:1
  "Flags"=dword:1000

[HKEY_LOCAL_MACHINE\System\StorageManager\AutoLoad\SMFLASH]
  "DriverPath"="Drivers\\BlockDevice\\SMFLASH"
  "LoadFlags"=dword:1
  "MountFlags"=dword:11
  "BootPhase"=dword:1
  "Flags"=dword:1000

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH]
  "DefaultFileSystem"="FATFS"
  "PartitionDriver"="mspart.dll"
  "AutoMount"=dword:1
  "AutoPart"=dword:1
  "AutoFormat"=dword:1
  "Folder"="ResidentFlash"
  "Name"="Microsoft Flash Disk"
  "BootPhase"=dword:0
  "Flags"=dword:1000

[HKEY_LOCAL_MACHINE\System\StorageManager\Profiles\SMFLASH\FATFS]
  "FriendlyName"="FAT FileSystem"
  "Dll"="fatfsd.dll"
  "Flags"=dword:00280014
  "Paging"=dword:1
  "CacheSize"=dword:0
  "EnableCacheWarm"=dword:0
  "EnableCache"=dword:1
  "MountFlags"=dword:2

请问系统加载的flash驱动应该是"smflash.dll" , "Prefix"是"DSK",那在应用程序中CreateFile("DSK1:")应该是可以的呀,怎么没打开呢?
我查看注册表,发现在BuiltIn中并没有“smflash.dll”,这是为什么???

如果按照这种方法,是不是可以再WinCE的应用中对nand flash的每一个block都进行读写和擦除呀?

最新回复

答案重新贴一下 打开方法不对,使用下面的试一试: HANDLE hReadFlashIDDev; hReadFlashIDDev=OpenStore(L"SMFLASH"); if(hReadFlashIDDev == INVALID_HANDLE_VALUE) {     MessageBox(_T("Open Flash Device Failed")); } else {     iRet = DeviceIoControl(hReadFlashIDDev, IOCTL_READ_FLASH_ID, NULL, 0, ReadBuffer, ReadBufferSize,                             NULL, NULL); } 另外可能要加入些头文件Storemgr.h的。 用EVC编译是可以的,VS2008未试过!   详情 回复 发表于 2010-5-7 13:36
点赞 关注

回复
举报

5

帖子

0

TA的资源

禁止访问

沙发
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
多谢指点!!!
测试通过,是我的打开方式不对。
结贴。
 
 
 

回复

58

帖子

0

TA的资源

五彩晶圆(中级)

4
 
看看解答
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
答案重新贴一下
打开方法不对,使用下面的试一试:

HANDLE hReadFlashIDDev;
hReadFlashIDDev=OpenStore(L"SMFLASH");
if(hReadFlashIDDev == INVALID_HANDLE_VALUE)
{
    MessageBox(_T("Open Flash Device Failed"));
}
else
{
    iRet = DeviceIoControl(hReadFlashIDDev, IOCTL_READ_FLASH_ID, NULL, 0, ReadBuffer, ReadBufferSize,
                            NULL, NULL);
}

另外可能要加入些头文件Storemgr.h的。

用EVC编译是可以的,VS2008未试过!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名赢【小米双肩包、contigo水杯】 | TI MSPM0 系列 MCU 再添新成员
了解TI 前沿新品——高性能与高性价比的优秀组合 MSPM0G351x / MSPM0L111x,4月24日(周四)上午10:00直播~

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 15

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表