wince4.2内核热更新

     搞了一段时间的eboot,很可惜还没有搞定。不过从这个过程中也学到了不少东西。在对flash操作这块就是这样的。偶然间想到,当wince系统起来之后用应用程序来更新在flash中的nk.nb0(nk.bin),这样的话应该会非常方便,只要有u盘或者sd卡之类的外围存储设备就可以了(可能早有大侠们已经实现了,见笑了!)。
     想做就做,还好我现在有时间也有硬件条件。其实这个也没有什么技术含量,大体的思路就是在应用程序中用虚拟地址将bootloader中对flash操作的几个功能函数实现,然后从外围设备中检测某个目录下时候有nk.nb0文件,有的话就将其写到flash的固定地址(bootloader中写nk的地址)。我用到的函数有以下几个:
DWORD NAD_Init(DWORD dwContext);
int NF_WritePage(int block,int page,BYTE *buffer);
int NF_ReadPage(int block,int page,BYTE *buffer);
int NF_IsBadBlock(int block);
int NF_EraseBlock(int block);
      直接从bootloader中照搬就行了,注意的就是将各个寄存器的地址用映射后的虚拟地址附值。
      要说的就是ecc的问题,我对这个东西不怎么理解,也是直接照搬bootloader的。在我调试的时候总是ecc出错,看了看代码才发现范了个低级的错误,在写之前没有对要写的block擦除,ecc不出错才怪了。用映射的虚拟地址还有一点就是速度问题,在bootloader中执行cmd之后循环100次就ok,但是在应用程序中,这样总会出错,在NF_EraseBlock和NF_WritePage中就是这样(读不到NFSTAT的正确的值),解决的办法可以通过再加一条RETAILMSG。
      这种办法更新内核缺点就是速度有些慢,主要是从外围存储设备读nk文件这一步。如果将对flash的相关操作写成流驱动的话也是可以的,我试过,速度会稍微更慢些,这个原因应该是在writefile了。
      做好上面的工作之后就是图形界面的更新进度条问题了,有点烦琐不过不难,在此就不多说了。

你可能感兴趣的:(更新,职场,内核,休闲,wince4.2)