paul_chao大侠您好:
“1. + 68 => Please refer %_WINCEROOT%\public\common\oak\inc\romldr.h Line 59 - ROM_TOC_POINTER_OFFSET (Offset from the image's physfirst address to the TOC pointer.)
也就是在 NK.nb0 中, TOC 的位址.
2. ( ((DWORD)lpdwToc & 0x90000000) == 0x80000000 )
判断该 NK.nb0 是要给 RAM 用的, 还是要烧至 flash 中用的, 故 LZ 可参考 OEMAddressTable, Flash 是否对映至 VA 0x8xxxxxxx, RAM 是否对映至 VA 0x9xxxxxxx.
总括来看, LZ 应是要透过 usb 下载 NK.nb0, 但 .nb0 中并无位址资讯, 故要透过 TOC 的所在的 Virtual Address, 来判断该 NK.nb0 是要放在 ram 上执行, 还是要烧录至 flash 上执行 (即 platform builder 中的 build option -- IMGFLASH 是否为1).
Paul, Chao @ Techware ”
根据您的解释,我知道了+ 68的含义
但是还有几点不是很清楚:
lpdwToc = (LPDWORD)(*(DWORD*)(RAMSTART + 68)); //Offset from the image's physfirst address to the TOC pointer
if( ((DWORD)lpdwToc & 0x90000000) == 0x80000000 ) //这里的9000_0000代表着SDRAM的虚拟地址,
8000_0000代表FLASH的虚拟地址
//这里是要看最高位是否为‘1’,那么lpdwToc当前是代表一段什么字段
//与上9000_0000 可以 == 8000_0000????
//而这个是在WINCE4下的定义,在WINCE5下,我的OEMaddressTable中定义的
//正好跟WINCE4相反,即:9000_0000代表的是FALSH,8000_0000代表的是SDRAM
{
memcpy((LPVOID)&RomHdr, (LPVOID)(RAMSTART + ((DWORD)lpdwToc - FLASH_IMG_START)), sizeof(ROMHDR));
//这段更不懂了,1、为什么要向RomHdr拷贝内容,
这个RomHdr我在以后好象并没有
//用到,它的作用是什么呢?
//2、为什么要用lpdwToc - FLASH_IMG_START???
//在WINCE42下这个是可以减的,在WINCE5下FLASH_IMG_START是大于lpdwToc
//那么这个lpdwToc 跟FALSH有什么关系吗?else
{
memcpy((LPVOID)&RomHdr, (LPVOID)lpdwToc, sizeof(ROMHDR)); //这句的疑问跟上面一样------用RomHdr是要做什么?
}
if( ((DWORD)lpdwToc & 0x90000000) == 0x80000000 ) //最后判断这个,如果满足就
{
if (FlashWrite( RAMSTART, dwPhysLen)) //开始在这里向FALSH中写入NK数据
{
while (1);
}
launch(flashstart); //从FLASH启动NK;
}
else
{
launch(ramstart); //直接从SDRAM启动NK
}
return TRUE;
}
还有最后一个问题:
通过这种方式 是否 只是 用来判断 是从SDRAM起 还是从FLASH起的??
如果是这样的话我可以不用TOC来判断,而用其他方法来做判断啊
1. if( ((DWORD)lpdwToc & 0x90000000) == 0x80000000 )
WinCE4.2 还是 WinCE5.0 不是重点, 重点是 LZ 的 OEMAddressTable 的值是设为多少, 因为 4.2 与 5.0 是不同的 bsp, 故这 2 个版本的 OEMAddressTable 定义可能会不同. 还有就是 config.bib 中, NK 的位置是在哪里, 是否会因 IMGFLASH 的值不同而有所改变?? LZ 可测试 IMGFLASH 设 1 or 不设, lpdwToc 其值是否会改变.
2. memcpy((LPVOID)&RomHdr, (LPVOID)(RAMSTART + ((DWORD)lpdwToc - FLASH_IMG_START)), sizeof(ROMHDR));
2.1 RomHdr 是 Global Variable, 故无法得知其用途, 若是无人使用, 则应可忽略该行. 至於 TOC 的用途, LZ 可在 c:\WINCE500\platform\common\src\common\boot\blcommon\blcommon.c 看到 static BOOL KernelRelocate (ROMHDR *const pTOC), 它就是用 TOC 将 eboot 的 global variable 做初值的设定动作. (c language 中, global variable 没初值的清为 0, 有初值的会将初值放入)
2.2 lpdwToc - FLASH_IMG_START 是因为 lpdwToc 是放在 Flash 中, 但在执行 FlashWrite 前, 它还是在 RAMSTART (OEMusbdown() 中的第 4 行 PBYTE pImgStart = (PBYTE) RAMSTART; //定义了一个下NK到SDRAM的地址) 中, LZ 可用 UltraEdit 这类的软体, 用 Hex Mode 去看 NK.nb0, 在 offset 68 的地方, 你会看到一个 lpdwToc 的值.
Paul, Chao @ Techware