powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
阅读:1877回复:7

关于loader.h文件中对ROM_RAMIMAGE_SIZE定义引发的疑问?

楼主#
更多 发布于:2007-09-10 20:01
#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文件,但系统启动后有一个驱动加载时发生了错误,该驱动本身并没有问题,请问
这是什么缘故造成的,如何修改?
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-10 20:04
#define ROM_RAMIMAGE_START          0x8C100000
#define ROM_RAMIMAGE_SIZE          0x01000000
上面两个语句是在2440 bsp的loader.h文件中定义的。
sniper167
驱动中牛
驱动中牛
  • 注册日期2006-07-12
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望411点
  • 贡献值0点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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的范围内都是合法的,也就是可以小于等于,但不能大于
不知道这样理解对不对
[url]http://sniper167.bokee.com[/url]
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
地板#
发布于: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中。

这与理论上的分析不一致。你觉得呢?
zhengshijie
驱动小牛
驱动小牛
  • 注册日期2003-07-11
  • 最后登录2009-03-18
  • 粉丝1
  • 关注0
  • 积分8分
  • 威望217点
  • 贡献值0点
  • 好评度199点
  • 原创分3分
  • 专家分0分
地下室#
发布于: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的,所以没有必要做这个判断,在这里它就没有什么意义了.
sniper167
驱动中牛
驱动中牛
  • 注册日期2006-07-12
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望411点
  • 贡献值0点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-11 14:50
引用第3楼powerall888于2007-09-11 09:59发表的  :
理论上这样理解没错。可是正常运行的情况下该分支得不到执行,也就是说,正常情况下分支条件
((dwStartAddr + dwLength - 1) < (ROM_RAMIMAGE_START + ROM_RAMIMAGE_SIZE))
得不到满足,我把相关的代码贴全一点如下:
BOOL OEMVerifyMemory(DWORD dwStartAddr, DWORD dwLength)
{
.......


你根据你的NK大小把这个修改了不就可以了吗?
#define ROM_RAMIMAGE_SIZE          0x01000000
[url]http://sniper167.bokee.com[/url]
sniper167
驱动中牛
驱动中牛
  • 注册日期2006-07-12
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分13分
  • 威望411点
  • 贡献值0点
  • 好评度321点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-09-11 14:51
引用第4楼zhengshijie于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)))
    {
.......


用zhengshijie 大哥这个,判断都不用了,更省事
[url]http://sniper167.bokee.com[/url]
powerall888
驱动小牛
驱动小牛
  • 注册日期2007-03-02
  • 最后登录2010-09-29
  • 粉丝0
  • 关注0
  • 积分906分
  • 威望329点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-09-11 15:46
确实可以这样,只是对原先设计的代码想理解一下,现在还是没有理解到!
游客

返回顶部