阅读:1877回复:7
关于loader.h文件中对ROM_RAMIMAGE_SIZE定义引发的疑问?
#define ROM_RAMIMAGE_START 0x8C100000
#define ROM_RAMIMAGE_SIZE 0x01000000 在eboot程序的main.c代码中的函数 BOOL OEMVerifyMemory(DWORD dwStartAddr, DWORD dwLength) { ... // Is it a ram image? else if ((dwStartAddr >= ROM_RAMIMAGE_START) && ((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE))) { RETAILMSG(1, (TEXT("Downloading RAM image\r\n"))); g_ImageType = IMAGE_TYPE_RAMIMAGE; return TRUE; } ... } 问题1: 请问上述代码有何含义? 问题2: 另外,我现在编译的nk.bin文件小于10M,如果使用此eboot程序通过dnw下载nk.bin文件时,发现不能nk文件不能被烧写到nandflash中,打印的调试信息如下: ERROR: WriteRegionsToBootMedia: INVALID_IMAGE_TYPE: 0x2 WARNING: OEMLaunch: Failed to store BinFS regions to boot media. 我为了将nk.bin文件能够烧写到nandflash中,因此修改了loader.h中关于ROM_RAMIMAGE_SIZE的定义: #define ROM_RAMIMAGE_SIZE 0x300000 此时能够下载nk.bin文件,但系统启动后有一个驱动加载时发生了错误,该驱动本身并没有问题,请问 这是什么缘故造成的,如何修改? |
|
沙发#
发布于:2007-09-10 20:04
#define ROM_RAMIMAGE_START 0x8C100000
#define ROM_RAMIMAGE_SIZE 0x01000000 上面两个语句是在2440 bsp的loader.h文件中定义的。 |
|
板凳#
发布于:2007-09-11 09:37
#define ROM_RAMIMAGE_START 0x8C100000
#define ROM_RAMIMAGE_SIZE 0x01000000 在eboot程序的main.c代码中的函数 BOOL OEMVerifyMemory(DWORD dwStartAddr, DWORD dwLength) { ... // Is it a ram image? else if ((dwStartAddr >= ROM_RAMIMAGE_START) && ((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE))) { RETAILMSG(1, (TEXT("Downloading RAM image\r\n"))); g_ImageType = IMAGE_TYPE_RAMIMAGE; return TRUE; } ... } 问题1: 请问上述代码有何含义? -------------------------------------------- 我是怎么理解的 只要函数OEMVerifyMemory的两个参数保证在ROM_RAMIMAGE的范围内都是合法的,也就是可以小于等于,但不能大于 不知道这样理解对不对 |
|
|
地板#
发布于:2007-09-11 09:59
理论上这样理解没错。可是正常运行的情况下该分支得不到执行,也就是说,正常情况下分支条件
((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE)) 得不到满足,我把相关的代码贴全一点如下: BOOL OEMVerifyMemory(DWORD dwStartAddr, DWORD dwLength) { ... // Is it a ram image? else if ((dwStartAddr >= ROM_RAMIMAGE_START) && ((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE))) { RETAILMSG(1, (TEXT("Downloading RAM image\r\n"))); g_ImageType = IMAGE_TYPE_RAMIMAGE; return TRUE; } // HACKHACK: get around MXIP images with funky addresses g_ImageType = IMAGE_TYPE_RAMIMAGE|IMAGE_TYPE_BINFS; RETAILMSG(1, (TEXT("*** Downloading UNKNOWN image type ***\r\n"))); return TRUE; } 也就是说,当我的nk大于16M时,可以正常运行, g_ImageType 被设置为IMAGE_TYPE_RAMIMAGE|IMAGE_TYPE_BINFS; 而当nk小于此值时,g_ImageType 被设置为IMAGE_TYPE_RAMIMAGE,后面的代码得不到正常运行,也就是说不会将nk写到nandflash中。 这与理论上的分析不一致。你觉得呢? |
|
地下室#
发布于:2007-09-11 10:34
/* comment for fix if the image too small and locate in range,then the image type will change to ram image and cause the image can not write to flash.
// Is it a ram image? else if ((dwStartAddr >= ROM_RAMIMAGE_START) && ((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE))) { // RETAILMSG(1, (TEXT("Downloading RAM image\r\n"))); g_ImageType = IMAGE_TYPE_RAMIMAGE; return TRUE; } */ 根据你的实际需要把它注释掉吧,实际上对于我们来说总是烧写NK.BIN的,所以没有必要做这个判断,在这里它就没有什么意义了. |
|
5楼#
发布于:2007-09-11 14:50
引用第3楼powerall888于2007-09-11 09:59发表的 : 你根据你的NK大小把这个修改了不就可以了吗? #define ROM_RAMIMAGE_SIZE 0x01000000 |
|
|
6楼#
发布于:2007-09-11 14:51
引用第4楼zhengshijie于2007-09-11 10:34发表的 : 用zhengshijie 大哥这个,判断都不用了,更省事 |
|
|
7楼#
发布于:2007-09-11 15:46
确实可以这样,只是对原先设计的代码想理解一下,现在还是没有理解到!
|
|