WinCe下热更新系统

通过几天的查资料,看代码。总算把这个问题解决了。

我用的是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盘内,插入系统中,运行你的应用程序。它就会把你的整个系统升级了。哈哈。

你可能感兴趣的:(Flash,null,dll,byte)