WinCe下热更新系统

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

我用的是AU1250的芯片,和K9F1208falsh.主要是通过读取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_EraseBlockFMD_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盘内,插入系统中,运行你的应用程序。它就会把你的整个系统升级了。哈哈。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值