5170|15

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于eboot的几个问题 [复制链接]

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

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

最新回复

tao
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
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

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

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
LS正解
要把Eboot做小只需要把不需要的功能全都拿掉,以前经常会做一版最精简的bootloader,专门用做烧Jtag用的
你的eboot还不支持自更新吗?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

4
 
eboot.bin文件大小就是有效的大小
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用楼主 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下不怎么好的。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

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


多谢,基本明白了!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 2 楼 hzdysymbol 的回复:
LS正解
要把Eboot做小只需要把不需要的功能全都拿掉,以前经常会做一版最精简的bootloader,专门用做烧Jtag用的
你的eboot还不支持自更新吗?


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

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

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 4 楼 gooogleman 的回复:

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


PB下不怎么好的。


你这是烧内核吧?30M?
我说的是用jtag烧写eboot,唉,你什么时候看贴能仔细点啊
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

9
 
当NOR里是空的时候,需要用JTAG烧eboot.nb0。这个时候eboot.nb0就是你在bib里配置的大小,实际有效数据可能就100多KB,后续的都补0。
当NOR里面已经有可运行的eboot时,通常用串口、USB口、网口下载eboot.bin进行eboot的更新升级。

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

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

回复

80

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 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其他都是空的。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 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操作。。。


慢慢研究吧,大家都是从这里成长的。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
我烧写内核都这么快,烧写bootloader就是几秒钟的事情。
——————————————————————————————
我使用JLINK+USB
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

13
 
ding
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

14
 
ding
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 8 楼 shuiyan 的回复:
当NOR里是空的时候,需要用JTAG烧eboot.nb0。这个时候eboot.nb0就是你在bib里配置的大小,实际有效数据可能就100多KB,后续的都补0。
当NOR里面已经有可运行的eboot时,通常用串口、USB口、网口下载eboot.bin进行eboot的更新升级。

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

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


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

该怎么表达谢意呢? :)
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

16
 
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里面没有这个函数,请问各位高手这个问题怎么解决啊?老师现在天天催项目进度,都逼死了。。谢谢!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表