开发WinCE设备更新工具过程--详记

来源:互联网 发布:artrage 5 mac 编辑:程序博客网 时间:2024/05/13 12:08

最近在开发一款嵌入设备,基于WinCE5.0,使用的是SamSung的2416 cpu,基于2450的bsp。

 

首先是要了解eboot的详细流程,

main->BootloaderMain()

 

在看到第一句就碰到问题了,如下代码。

if (!KernelRelocate (pTOC))
{
    // spin forever
    HALT (BLERR_KERNELRELOCATE);
}

其中pToc唯一的赋值地方是在blcommon.c的声明,

ROMHDR * volatile const pTOC = (ROMHDR *)-1;     // Gets replaced by RomLoader with real address

查了很多资料后,大概知道是romimage.exe给他做了赋值,具体的过程有待进一步了解。

 

 

///////////////////////////////////////////////////////////////////////////////////////

// 关于NandFlash擦除操作相关说明

对于NandFlash目前进行的分区如下:

1.保留区

    保留区分为如下几部分:

    1)Stepldr

    2)TOC

    3)EBOOT

2.BINFS

    这是第一个分区,用于存储系统,NK.bin,在保留区的后

3.FAT1

    这是第二个分区,用于存储driver

4.FAT2

    这是第三个分区,用于存储应用程序

5.FAT3

    这是第四个分区,属于用户数据区

6.开机画面

    此区域用于存储开机画面的数据,不计入分区中。

 

如何标记保留区的块为保留块?

SectorInfo si;

// to keep bootpart off of our reserved blocks we must mark it as bad, reserved & read-only
si.bOEMReserved = OEM_BLOCK_RESERVED | OEM_BLOCK_READONLY;
si.bBadBlock    = BADBLOCKMARK;
si.dwReserved1  = 0xffffffff;
si.wReserved2   = 0xffff;

OALMSG(TRUE, (TEXT("Reserving Blocks [0x%x - 0x%x] .../r/n"), 0, IMAGE_START_BLOCK-1));

//给保留区域写入标志
for (i = 0; i < RESERVED_BOOT_BLOCKS; i++) {
    FMD_WriteSector(i, NULL, &si, 1);
}

BOOL FMD_WriteSector(SECTOR_ADDR startSectorAddr, LPBYTE pSectorBuff, PSectorInfo pSectorInfoBuff, DWORD dwNumSectors): 这个函数用于写nandflash的一个扇区。对于nandflash来说,分大page和小page,大page是2048个bytes一页,小page是512个bytes一页。所以大page每个扇区有2048 bytes,小page每个扇区有512 bytes。

    startSectorAddr: nandflash物理扇区的起始地址,对于nandflash来说,就是nandflash中从哪个page开始。

    pSectorBuff:扇区数据buffer,从nandflash中写入的每一个扇区的数据都存放在这个buffer中。

    pSectorInfoBuff:扇区信息buffer,一般每个扇区的信息会被保存在nandflash的带外数据中,针对小page,带外数据有16 bytes,大page有64 bytes。从nandflash的带外数据将该扇区的相关信息读出来,存放在这个buffer中。

 

pSectorInfoBuff参数读取相应sector状态,如果pSectorInfoBuff参数为NULL则读写sector数据。pSectorBuff为非NULL则读写sector状态。

 

 

 

///////////////////////////////////////////////////////////////////////////////////////