当前位置: 代码迷 >> WinCE >> WinCE6.0 開機後燒錄NK的方法,该如何处理
  详细解决方案

WinCE6.0 開機後燒錄NK的方法,该如何处理

热度:195   发布时间:2016-04-28 11:54:44.0
WinCE6.0 開機後燒錄NK的方法
吃飽太閒,來發各文章好了
目的:
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  
    Physical First      : 0x80020000  
    Physical Last       : 0x828A39E8  
    RAM Start           : 0x828B0000  
    RAM Free            : 0x828BF000  
    RAM End             : 0x86B00000  
    Kernel flags        : 0x00000000  
    Prof Symbol Offset  : 0x00000000  
    Num Copy Entries    :          2    
    Copy Entries Offset : 0x80891FD0  
    Num Modules         :        356    
    Num Files           :        267    
    MiscFlags           : 0x00000002  
    CPU                 :     0x01c2 (Thumb)
    Extensions          : 0x80021180
Record [  0] : Start = 0x80020000, Length = 0x00000004, Chksum = 0x000001AE
Record [  1] : Start = 0x80020040, Length = 0x00000008, Chksum = 0x000003EA
Record [  2] : Start = 0x80020048, Length = 0x00000004, Chksum = 0x00000258
Record [  3] : Start = 0x80021000, Length = 0x00012FF8, Chksum = 0x005F6BBD
Record [  4] : Start = 0x80035000, Length = 0x0003A208, Chksum = 0x017BC52C
Record [  5] : Start = 0x80070000, Length = 0x0000A078, Chksum = 0x003EE570
Record [  6] : Start = 0x8007B000, Length = 0x00083FFC, Chksum = 0x0352F22B
Record [  7] : Start = 0x800FEFFC, Length = 0x000180C0, Chksum = 0x00686E92

所以了解了吧 , 要把相對應的Record解開到相對應的位址去
很慶幸的 原始檔叫做NK.nb0 在你的專案產出目錄下面就可以找到
所以只要把NK.nb0燒到NandFlash就是正確的啦 , 
不過通常NK.nb0後面都是00是不需要的
可以參考實際viewbin看到的length做裁切,把後面多出的0x00資料部份去掉
還有在NandFlash上的OS區塊是會先看到MBR
所以會是MBR(2K) + NK.nb0 這樣才會正確喔

MBR的說明如下
MBR and partition table 
Windows CE 有在看 parition table,partition table 的

system 依照 partition table 的內容,filesystem type,load 對應的 driver 進來。

msdn 說 partition table 是 mbr 的一部分,描述 disk 的 partition layout。最多可以包含 4 個 partition。

mbr 會有一個 end mark : 0x55AA。
在這個 end mark 的前面,擺 partition table [4]。

一般的mbr 是 512 bytes,所以parition table 的 offset 就是:
512 - 2 - (16x4) =

partition table 的entry (一個parititon) 的structure 定義在
c:\WINCE600\PUBLIC\COMMON\OAK\INC\bootpart.h
typedef struct _PARTENTRY {
      BYTE            Part_BootInd;           // If 80h means this is boot partition
      BYTE            Part_FirstHead;         // Partition starting head based 0
      BYTE            Part_FirstSector;       // Partition starting sector based 1
      BYTE            Part_FirstTrack;        // Partition starting track based 0
      BYTE            Part_FileSystem;        // Partition type signature field
      BYTE            Part_LastHead;          // Partition ending head based 0
      BYTE            Part_LastSector;        // Partition ending sector based 1
      BYTE            Part_LastTrack;         // Partition ending track based 0
      DWORD           Part_StartSector;       // Logical starting sector based 0
      DWORD           Part_TotalSectors;      // Total logical sectors in partition
} PARTENTRY;
size是16 bytes.
Part_BootInd 的value 也定義在 bootpart.h;
// Flags for Part_BootInd
#define PART_IND_ACTIVE                      0x1
#define PART_IND_READ_ONLY               0x2
#define PART_IND_HIDDEN                     0x4

其中Filesystem 定義在
c:\WINCE600\PUBLIC\COMMON\OAK\INC\bootpart.h
#define PART_UNKNOWN            0
#define PART_DOS2_FAT           0x01    // legit DOS partition
#define PART_DOS3_FAT           0x04    // legit DOS partition
#define PART_EXTENDED           0x05    // legit DOS partition
#define PART_DOS4_FAT           0x06    // legit DOS partition
#define PART_DOS32              0x0B    // legit DOS partition (FAT32)
#define PART_DOS32X13           0x0C    // Same as 0x0B only "use LBA"
#define PART_DOSX13             0x0E    // Same as 0x06 only "use LBA"
#define PART_DOSX13X            0x0F    // Same as 0x05 only "use LBA"

// CE only partition types for Part_FileSystem

#define PART_CE_HIDDEN          0x18
#define PART_BOOTSECTION        0x20
#define PART_BINFS              0x21    // BINFS file system
#define PART_XIP                0x22    // XIP ROM Image
#define PART_ROMIMAGE           0x22    // XIP ROM Image (same as PART_XIP)
#define PART_RAMIMAGE           0x23    // XIP RAM Image
#define PART_IMGFS              0x25    // IMGFS file system
#define PART_BINARY             0x26    // Raw Binary Data
關於head , sector , track可以參考bootpart.cpp
函式LBAtoCHS & AddPartitionTableEntry

再來看一下eboot TOC內容需要什麼
只需要去回填ID[3]的NK Launch內容
TOC {
dwSignature: 0x434F544E
BootCfg{…}
ID[0] {…} 
ID[1] {…}
ID[2] {…}
ID[3]
{
  dwVersion: 0x1
  dwSignature: 0x48534643
  String: NK
  dwImageType: 0x8
  dwTtlSectors: 0x5108
  dwLoadAddress: 0x80020000
  dwJumpAddress: 0x80027E9C
  dwStoreOffset: 0x0
}
ID[4] {…}
還記得剛剛的
Viewbin –toc nk.bin > output.txt
Viewbin –r nk.bin > output1.txt

Image Start = 0x80020000, length = 0x028839E8
Start address = 0x80027E9C
ROMOFFSET = 0x00000000
  dwTtlSectors: 0x5108
  dwLoadAddress: 0x80020000
  dwJumpAddress: 0x80027E9C
  dwStoreOffset: 0x0

會填了吧 除了dwTtlSectors , 然後sector size為2048
算法是dwTtlSectors = (length / sectorsize) + (length % sectorsize)
dwTtlSectors = (0x028839E8 / 2048) + (0x028839E8 % 2048)
= 0x5107 + 0x1 = 0x5108

這樣會了吧 , 就是這麼簡單 , 就可以在WinCE開機下燒錄 NK Image了
燒錄完要重開機才會有效喔 , 重新由NandFlash load NK到DRAM執行

如果你是使用Soft Reset在S5PV210 BSP Stepldr還要修改
c:\WINCE600\PLATFORM\SMDKV210\SRC\BOOTLOADER\STEPLDR\startup.s
裡面去掉這段
;        ldr     r0, =RST_STAT
;        ldr     r1, [r0]  
;        and     r1, r1, #BP_SWRESET
;        cmp     r1, #BP_SWRESET
;        bne     Normal_Boot_Sequence            ; Normal Booting (Not SW Reset)

;        JUMP_TO_KERNEL ; SW Reset jump to Kernel
;        b .

stepldr才會乖乖的把NandFlash OS區塊重新load到DRAM執行喔

恩沒了就這樣

至於Dragin V1.26.2.exe還是DNW.exe
我早就不用了,我自己開發了整套的產線量產工具
比這些好多了,改天有時間再說給大家聽吧
也有很多技術在裡面,很精采的

------解决思路----------------------
楼主,我支持你。这个我在2009 年的时候做过,那时候我写的叫做wince ghost 。嘿嘿。
我期待你下面的
我自己開發了整套的產線量產工具
比這些好多了,改天有時間再說給大家聽吧
也有很多技術在裡面,很精采的

  相关解决方案