当前位置: 代码迷 >> WinCE >> WinCE上在系统进行内核更新有关问题
  详细解决方案

WinCE上在系统进行内核更新有关问题

热度:34   发布时间:2016-04-28 12:30:46.0
WinCE下在系统进行内核更新问题
最近在研究WINCE系统下进行内核nb0文件的更新,采用的方式是这样的:
将新的NK.nb0文件通过activesync拷贝到系统的FLASH的某个目录下,应用程序打开该文件成功后,会对系统内核所在的FLASH区域进行格式化,然后将NK.nb0文件读出并进行相应区域的数据写入。

我的区域存放于FLASH的Block6-389区域,因为我之前使用JTAG进行烧写也是将对应的NK.nb,文件烧写到同样的区域实现,但是使用应用程序进行写入就不正常。
使用JTAG读出数据,发现前面几个block的数据不正常,很多被写成了00,后面区块的数据是正常的。
应用程序调用的方式是 使用CreatFile打开FLASH驱动,试用ReadFile将数据分块读出,再使用FLASH驱动的DeviceIoControl发送对应的参数给底层驱动进行写入,驱动中对FLASH的驱动 FMD.c中的FMD_OEMIoControl进行了修改,增加了写入FMD_WriteSector和擦除FMD_EraseBlock的指令,擦除是正常的,对应的区域被擦成了全FF。写入则是部分正确。

另外我尝试在程序中使用CreatFile创建一个读一个写句柄,将NK.nb0使用ReadFile读出,用WriteFile写入NK2.NB0,发现NK2.nb0是正确的,那这应该读数据是没有问题的,为啥写入FLASH就不正常呢?
如果写保护,应该不能擦除的才对的,我看了下代码,也没有对这些区域进行保护。

------解决方案--------------------
我没这样写过,应该考虑写的驱动是否有问题。
------解决方案--------------------
我之前發表過了
目的:
S5PV210 BSP WinCE6.0
讓WinCE6.0開機進入shell後還能燒錄NK的方法
通常開發板都是透過工具然後在eboot階段燒錄NK
但是這對一各產品而言不實用
我們的產品配備有一各PC開發工具,會有一各更新OS的功能
所以需要在WinCE6.0開機進入shell後還能燒錄NK的方法
我敎大家怎嚜實現

過程:
一般而言都只有在eboot才能夠燒錄NK Image
利用什麼Dragin V1.26.2.exe還是DNW.exe來弄
要在WinCE6.0開機進入shell後還能燒錄NK

首先記得空板子第一次燒錄OS的時候
記得你在切割NandFlash區塊的時候,建議切割固定的OS區塊,固定的User區塊
當然這需要改程式c:\WINCE600\PLATFORM\SMDKV210\SRC\BOOTLOADER\EBOOT\nand.cpp
WriteFlashNK函式裡面BP_OpenPartition配固定大小就可以解決
然後記得OS區塊之前的部份block要打上FMD_SetBlockStatus的BLOCK_STATUS_RESERVED狀態

然後寫Code支援fmd ioctl可以跳過微軟filesystem直接存取NandFlash block
#define IOCTL_XXX_READBLOCK             IOCTL_DISK_USER(13)
#define IOCTL_XXX_WRITEBLOCK            IOCTL_DISK_USER(14)
#define IOCTL_XXX_ERASEBLOCK            IOCTL_DISK_USER(15)
#define IOCTL_XXX_GETBLOCKSTATUS        IOCTL_DISK_USER(16)
c:\WINCE600\PLATFORM\SMDKV210\SRC\COMMON\NANDFLASH\FMD\fmd.cpp
FMD_OEMIoControl函式增加上面功能
利用函式FMD_GetBlockStatus,FMD_ReadSector,FMD_WriteSector,FMD_EraseBlock
這些函式來組合這些功能
程式應該會寫吧

再來是燒錄NK最好按照bootpart.cpp步驟

是否為bad block,是就跳過到下一各block
IS_BLOCK_UNUSABLE(dwBlock)

讀block資料,目的是為了sectorinfotable
這各內容在partition建立時,有特殊的值,也就是logic sector number會被寫入
ReadBlock(dwBlock, NULL, g_pSectorInfoBuf)

抹除block
FMD_EraseBlock(dwBlock)

燒錄block
WriteBlock(dwBlock, pbBuffer, g_pSectorInfoBuf)


再來看看nk.bin內容 , 因為nk.bin內容是Record壓縮格式
直接燒錄到NandFlash是不能使用的

可以打開VS2005->PB6.0環境的DOS CMD下輸入
Viewbin –toc nk.bin > output.txt
Viewbin –r nk.bin > output1.txt

可以看到些重要的資料,需要去填寫到eboot控管的TOC Block內容
這樣Lanuch NK的時候才會正確

Image Start = 0x80020000, length = 0x028839E8
Start address = 0x80027E9C
Checking record #166 for potential TOC (ROMOFFSET = 0xFE975FC8)
Checking record #256 for potential TOC (ROMOFFSET = 0xFF469FC8)
Checking record #259 for potential TOC (ROMOFFSET = 0xFF47C020)
Checking record #313 for potential TOC (ROMOFFSET = 0x00000000)
Found pTOC  = 0x8289efe0
ROMOFFSET = 0x00000000

ROMHDR ----------------------------------------
    DLL First           : 0x4001C001  
    DLL Last            : 0x41DCC119  
  相关解决方案