在WinCE下,应用程序直接读/写/擦除flash设备的方法
然后编写应用程序,主要就是通过CreateFile来打开DSK1:设备,然后通过DeviceIoControl(..)函数来调用FMD_OEMIoControl(..)函数,来达到直接读/写/擦除Flash设备的目的。应用程序代码如下:
HANDLE hFirm;
hFirm = CreateFile(TEXT(DSK1:), GENERIC_READ GENERIC_WRITE,0,NULL, OPEN_EXISTING, 0, NULL);
printf(Open Flash Device Failed);
return 0;
iRet = DeviceIoControl(hFirm, 0xff123456, 1, 2, 3, 4, 5,6);//Read Flash Sector
iRet = DeviceIoControl(hFirm, 0xff654321, 1, 2, 3, 4, 5,6);//Write Flash Sector
iRet = DeviceIoControl(hFirm, 0xff123457, 1, 2, 3, 4, 5,6);//Erase Flash Block
printf(DeviceIoControl OKrn);
while(1)
;
通过上面的应用程序,就能够调用到Flash设备驱动中的FMD_OEMIoControl(..)函数,这样根据不同的case就可以调用读/写/擦除函数了。
2. 以Nandflash为例,当然对于NORFlash来说大同小异,注册表配置如下:
[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
[HKEY_LOCAL_MACHINESystemStorageManagerAutoLoadNSFlash]
DriverPath=DriversBuiltInNANDFlash
LoadFlags=dword:0
BootPhase=dword:1
然后编写应用程序,主要就是通过OpenStore来打开NSFlash,然后通过DeviceIoControl(..)函数来调用FMD_OEMIoControl(..)函数,来达到直接读/写/擦除Flash设备的目的。应用程序代码如下:
HANDLE hFirm;
hFirm = OpenStore(LNSFlash);
printf(Open Flash Device Failed);
return 0;
iRet = DeviceIoControl(hFirm, 0xff123456, 1, 2, 3, 4, 5, 6);
iRet = DeviceIoControl(hFirm, 0xff654321, 1, 2, 3, 4, 5, 6);
iRet = DeviceIoControl(hFirm, 0xff123457, 1, 2, 3, 4, 5, 6);
printf(DeviceIoControl OKrn);
while(1)
;
通过这种方法,也可以在应用程序中调用到FMD_OEMIoControl(..)函数,从而达到直接访问Flash设备的目的。
总结一下,上面的两种方法大致原理其实是一样的,都是通过DeviceIoControl函数来调用FMD_OEMIoControl函数,然后达到直接访问Flash驱动的目的,这样就可以在应用程序中直接读/写/擦除Flash设备了。
最后需要注意的是:你的Flash驱动里面需要对读/写/擦除等直接操作Flash硬件的函数进行保护,因为Flash设备应该是由WinCE的文件系统来管理的,而现在你的应用程序也可以直接访问它了,所以保险起见,添加互斥量保护避免访问冲突。
上面的所有实现,都是在WinCE6.0上面做得,相信在WinCE5.0上面应该差不多。
评论