最近在开发一款嵌入设备,基于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状态。
///