|
平台:s3c2440a + wince5.0
参考了文章[url=http://blog.eeworld.net/nanjianhui/archive/2008/03/19/2196466.aspx][/url]
在“Src\Common\Smartmedia\Fmd\fmd.cpp”中做了如下修改
- BOOL FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize,
- PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)
- {
- RETAILMSG(1, (TEXT("FMD_OEMIoControl: control code is 0x%x\r\n"), dwIoControlCode));
- switch(dwIoControlCode)
- {
- #if 0
- 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 IOCTL_READ_FLASH_SECTOR:
- FMD_ReadSector(..); //调用读Sector函数
- break;
- case IOCTL_WRITE_FLASH_SECTOR:
- FMD_WriteSector(..); //调用写Sector函数
- break;
- case IOCTL_ERASE_FLASH_BLOCK:
- FMD_EraseBlock(..); //调用擦除Block函数
- break;
- #endif
- case IOCTL_READ_FLASH_ID:
- *pOutBuf = ReadFlashID() >> 8;
- *(pOutBuf+1) = ReadFlashID() & 0xff;
- nOutBufSize = 2;
- default:
- DEBUGMSG(1, (TEXT("FMD_OEMIoControl: unrecognized IOCTL (0x%x).\r\n"), dwIoControlCode));
- return(FALSE);
- }
- return(TRUE);
- }
复制代码
PB5.0中编译修改的fmd.cpp通过,然后在VS2008的应用程序中,使用如下方法:
- HANDLE hReadFlashIDDev;
- hReadFlashIDDev = CreateFile(TEXT("DSK1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
- 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);
- }
复制代码
编译运行后,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都进行读写和擦除呀?
|
|