您的位置:首页 > 其它

WinCe下热更新系统

2010-04-30 22:08 120 查看
通过几天的查资料,看代码。总算把这个问题解决了。

我用的是AU1250的芯片,和K9F1208的falsh.主要是通过读取U盘中的内核文件。然后把它替换掉旧的文件就可以了。

要实现在系统下应用程序直接调用FMD_ReadSector(),FMD_WriteSector()读写FLASH是不行的。但是可以通过FMD_OEMIoControl()函数来实现。所以要在FMD_OEMIoControl添加我要想要的函数。如下:

BOOL FMD_OEMIoControl(DWORD dwIoControlCode, PBYTE pInBuf, DWORD nInBufSize,

PBYTE pOutBuf, DWORD nOutBufSize, PDWORD pBytesReturned)

{



switch(dwIoControlCode)

{

case 0xfff00001:

ldr_NandReadBBT(); //读取Flash中的想关信息

if(FALSE == UpdataNK_formU())//重U盘中读取数据并重写相关数据块。

{

return FALSE;

}

Break;

default:

return(FALSE);

}

return TRUE;

}

UpdataNK_formU()

{

hFile = CreateFile(TEXT("//USB Disk//NK.nb0"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);//打开内核文件



Size = GetFileSize(hFile, NULL);//获取内核文件大小

//计算要写多少块数据。

if((Size % NAND_BYTES_PER_BLOCK) == 0)

{

uBlockNumsToWrite = Size / NAND_BYTES_PER_BLOCK;

}

else

{

uBlockNumsToWrite = (Size / NAND_BYTES_PER_BLOCK);

uBlockNumsToWrite ++;

}





for(i=0;i<uBlockNumsToWrite;i++)

{

ReadFile(hFile, readBuffer, NAND_BYTE_PER_SECTOR * NAND_SECTORS_PER_BLOCK, &ReadNum, NULL);//读取一个块的数据。

//调用 FMD_EraseBlock和FMD_WriteSector擦除和写入相关数据。

}

ldr_NandWriteBBT();//把相关数据写入第0块。

CloseHandle(hFile);

}

这样就修改好了内核驱动部分。后面就是修改注册表的部分了。

[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/NANDFlash]
"Dll"="nandxxxfmd.dll" ;你的flash驱动名。
"Prefix"="DSK"
"Order"=dword:4

“Index”=dword:1
;"Ioctl"=dword:4
"Profile"="NSFlash"
"IClass"="{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"

; Override names in default profile
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/NSFlash]
"Name"="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

然后就可以在应用程序中直接调用了。

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, 0xfff00001, NULL, 0, NULL, 0, NULL, NULL);

现在你就可以把NK.Nb0放到你的U盘内,插入系统中,运行你的应用程序。它就会把你的整个系统升级了。哈哈。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: