关于eboot的几个问题

chinaxu1986   2009-1-6 17:30 楼主
1、为什么我编译成功的eboot.bin烧写到nor中不起作用?害得我每次都的烧写eboot.nb0,但是板商提供的bootloader是.bin格式的
怎么才能让.bin格式的eboot在nor中运行起来?是在boot.bib中有一些选项吗?

2、我编译的eboot有256k太大了,每次烧写都得20几分钟,怎么才能把eboot做的小一点?(板商的才78k,而且还带logo图片)
通过修改boot.bib可以改eboot的大小,但是怎么知道有效数据是多大呢?

回复评论 (15)

1.烧nb0文件是对的,pb编译出来的bin文件是带有特定格式的,直接用JTAG烧录是无法正确运行的。至于你说板商提供的bootloader是bin格式的问题,那是因为它不是用pb编译的,这个bin和pb生成的bin格式是不一样的。你把这个bin名称修改为nb0烧录下去也不会有问题,关键是文件格式,而不是名称。
2.你先看看eboot.bin文件有多大,这个基本上是真实的文件大小;eboot.nb0是在bib中设定了大小的,其余部分用0来补齐,。
点赞  2009-1-6 17:49
LS正解
要把Eboot做小只需要把不需要的功能全都拿掉,以前经常会做一版最精简的bootloader,专门用做烧Jtag用的
你的eboot还不支持自更新吗?
点赞  2009-1-6 18:17
eboot.bin文件大小就是有效的大小
点赞  2009-1-6 18:22
引用: 引用楼主 kaios1 的帖子:
1、为什么我编译成功的eboot.bin烧写到nor中不起作用?害得我每次都的烧写eboot.nb0,但是板商提供的bootloader是.bin格式的
怎么才能让.bin格式的eboot在nor中运行起来?是在boot.bib中有一些选项吗?

2、我编译的eboot有256k太大了,每次烧写都得20几分钟,怎么才能把eboot做的小一点?(板商的才78k,而且还带logo图片)
通过修改boot.bib可以改eboot的大小,但是怎么知道有效数据是多大呢?


__还是我用ADS bootloader好,爆快,30M烧写不超过两分钟


PB下不怎么好的。
点赞  2009-1-6 19:06
引用: 引用 1 楼 yashi 的回复:
1.烧nb0文件是对的,pb编译出来的bin文件是带有特定格式的,直接用JTAG烧录是无法正确运行的。至于你说板商提供的bootloader是bin格式的问题,那是因为它不是用pb编译的,这个bin和pb生成的bin格式是不一样的。你把这个bin名称修改为nb0烧录下去也不会有问题,关键是文件格式,而不是名称。
2.你先看看eboot.bin文件有多大,这个基本上是真实的文件大小;eboot.nb0是在bib中设定了大小的,其余部分用0来补齐,。


多谢,基本明白了!
点赞  2009-1-6 20:01
引用: 引用 2 楼 hzdysymbol 的回复:
LS正解
要把Eboot做小只需要把不需要的功能全都拿掉,以前经常会做一版最精简的bootloader,专门用做烧Jtag用的
你的eboot还不支持自更新吗?


呵呵,我的eboot连下载内核的功能还没实现呢。现在主要是文件太大,调试太不方便了,每次烧写都费很长时间。

前一段下载内核的时候总是下载到52%就停了,后来发现是内存配置有冲突,现在倒是可以下到SDRAM里了,不过在擦除
nand的时候,又不停地提示坏块,无法擦除。硬件肯定是没有问题的,因为我用他们提供的bootloader擦一遍nand就
可以下载了。但是用我做的这个eboot又会出现那个不停地提示坏块而无法下载的情况。估计是写nand的代码有问题,
这几天正在研究呢,也没什么头绪,前辈给点提示了,呵呵!
点赞  2009-1-6 20:08
引用: 引用 4 楼 gooogleman 的回复:

__还是我用ADS bootloader好,爆快,30M烧写不超过两分钟


PB下不怎么好的。


你这是烧内核吧?30M?
我说的是用jtag烧写eboot,唉,你什么时候看贴能仔细点啊
点赞  2009-1-6 20:11
当NOR里是空的时候,需要用JTAG烧eboot.nb0。这个时候eboot.nb0就是你在bib里配置的大小,实际有效数据可能就100多KB,后续的都补0。
当NOR里面已经有可运行的eboot时,通常用串口、USB口、网口下载eboot.bin进行eboot的更新升级。

这是开发板为什么提供bin的原因,因为开发板原来里面肯定有可运行的eboot了。

你的eboot既然可以下载系统镜像了,那么肯定可以下载eboot.bin的,你没试过吗?
点赞  2009-1-6 20:43
引用: 引用 8 楼 shuiyan 的回复:
当NOR里是空的时候,需要用JTAG烧eboot.nb0。这个时候eboot.nb0就是你在bib里配置的大小,实际有效数据可能就100多KB,后续的都补0。
当NOR里面已经有可运行的eboot时,通常用串口、USB口、网口下载eboot.bin进行eboot的更新升级。

这是开发板为什么提供bin的原因,因为开发板原来里面肯定有可运行的eboot了。

你的eboot既然可以下载系统镜像了,那么肯定可以下载eboot.bin的,你没试过吗?


没试过,我现在的情况相当于移植一个eboot吧,eboot的功能都要自己实现。你说的这个eboot刷新的功能
我也知道,但我还没实现呢。现在正在看对flash的操作这部分。

flash.c中的代码是对nor的操作还是对nand的操作?比如这些函数:
BOOL OEMIsFlashAddr(DWORD dwAddr);
LPBYTE OEMMapMemAddr(DWORD dwImageStart, DWORD dwAddr);
BOOL OEMStartEraseFlash(DWORD dwStartAddr, DWORD dwLength);
void OEMContinueEraseFlash(void);
BOOL OEMFinishEraseFlash(void);
BOOL OEMWriteFlash(DWORD dwStartAddr, DWORD dwLength);
我感觉是对nor的操作,因为里面的函数都会对地址范围进行判断(OEMIsFlashAddr),而nand好像不统一编址
功能相当于硬盘,那么nand是怎么操作的呢?

在网上也下了个2440的bsp,但是这些函数除了OEMMapMemAddr其他都是空的。
点赞  2009-1-6 21:18
引用: 引用 9 楼 kaios1 的回复:
引用 8 楼 shuiyan 的回复:
当NOR里是空的时候,需要用JTAG烧eboot.nb0。这个时候eboot.nb0就是你在bib里配置的大小,实际有效数据可能就100多KB,后续的都补0。
当NOR里面已经有可运行的eboot时,通常用串口、USB口、网口下载eboot.bin进行eboot的更新升级。

这是开发板为什么提供bin的原因,因为开发板原来里面肯定有可运行的eboot了。

你的eboot既然可以下载系统镜像了,那么肯定可以下载eboot.bin的,你没试过吗?…



是对nand操作。。。


慢慢研究吧,大家都是从这里成长的。
点赞  2009-1-6 21:25
我烧写内核都这么快,烧写bootloader就是几秒钟的事情。
——————————————————————————————
我使用JLINK+USB
点赞  2009-1-7 08:44
ding
点赞  2009-1-7 09:04
ding
点赞  2009-1-7 09:04
引用: 引用 8 楼 shuiyan 的回复:
当NOR里是空的时候,需要用JTAG烧eboot.nb0。这个时候eboot.nb0就是你在bib里配置的大小,实际有效数据可能就100多KB,后续的都补0。
当NOR里面已经有可运行的eboot时,通常用串口、USB口、网口下载eboot.bin进行eboot的更新升级。

这是开发板为什么提供bin的原因,因为开发板原来里面肯定有可运行的eboot了。

你的eboot既然可以下载系统镜像了,那么肯定可以下载eboot.bin的,你没试过吗?


醍醐灌顶的感觉,呵呵,,

该怎么表达谢意呢? :)
点赞  2009-1-7 09:05
BOOL OEMWriteFlash(DWORD dwStartAddr, DWORD dwLength); 关于这个函数,我在网上找到了微软通用的源代码
BOOL OEMWriteFlash(DWORD dwImageStart, DWORD dwImageLength)
{
    DWORD dwFlashAddr, dwExtraBytes = 0;
    LPBYTE pbCache = NULL;
    UCHAR nNumBlocks = 0;




    //确认起始地址和长度都在Flash区域内
    if (!OEMIsFlashAddr(dwImageStart) || !OEMIsFlashAddr(dwImageStart + dwImageLength - 1))
    {
        return(FALSE);
    }


    //确认起始地址是Block字节对齐的
    if (dwImageStart % FLASH_BLOCK_SIZE)
    {
        return(FALSE);
    }


    //计算要写入的block数量
    nNumBlocks   = (UCHAR)(dwImageLength / FLASH_BLOCK_SIZE);
    dwExtraBytes = (dwImageLength % FLASH_BLOCK_SIZE);
    dwFlashAddr  = dwImageStart;
    pbCache      = OEMMapMemAddr (dwImageStart, dwFlashAddr);




    //写Flash  
    while(nNumBlocks)
    {  
        if (CFI_Write_Block((unsigned32*)dwFlashAddr, (unsigned32*)pbCache, FLASH_BLOCK_SIZE, NULL) != PASS)
        {
            EdbgOutputDebugString("ERROR: OEMWriteFlash - unable to write to block (block address=0x%x).\r\n", dwFlashAddr);
            return(FALSE);
        }


        dwFlashAddr += FLASH_BLOCK_SIZE;
        pbCache = OEMMapMemAddr (dwImageStart, dwFlashAddr);
        --nNumBlocks;
    }


    //将额外的数据写入Flash中
    if (dwExtraBytes)
    {
        if (CFI_Write_Block((unsigned32*)dwFlashAddr, (unsigned32*)pbCache, dwExtraBytes, NULL) != PASS)
        {
            EdbgOutputDebugString("ERROR: OEMWriteFlash - unable to write to block (block address=0x%x).\r\n", dwFlashAddr);
            return(FALSE);
        }
    }


    return(TRUE);
}



但关键是这里面的函数CFI_Write_Block不知道怎么实现啊,BSP里面没有这个函数,请问各位高手这个问题怎么解决啊?老师现在天天催项目进度,都逼死了。。谢谢!
点赞  2009-5-7 15:06
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复