9145|25

69

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

如何实现nand flash 存取 LOGO(在EBOOT中)? [复制链接]

     最近在做一个开机LOGO ,板上有个VGA模块接到显示器(1024X768),logo太大了用以前的模式根本控制不好EBOOT的大小。   
      现在想到两个方法实现 1:在屏上指定坐标放一个指定大小的图片 ,参照优龙BIOS,这个基本已实现,但效果不是很理想;
                           2:把LOGO转化为.BIN的文件(网上down到这个工具)烧到NAND指定块,读出,显示,这个没有实现,搜了下老帖都说的很含混,有些问题弄不明白。
      问题如下:  1:用USB或是网线下载该BIN时(或许我是痴心妄想,只能用烧写工具烧写,如果真这样,那太痛苦了) ,如何控制他烧到指定块?像NBOOT  ,EBOOT,nk,都在.bin文件中有记录它们存储在nand中的起始地址等等信息(说错勿怪,努力啃书中),但是这个转化的LOGO.BIN文件,我不知道它有没有这些信息。
           2:在FLASH驱动中是否要实现分区操作为该BIN保留一个分区。
     暂时想到这些。

最新回复

还是不要转换为BIN的好  ,直接在eboot中加载并解析BMP ,得到所要的RGB数据填充到buffer,是得到一位前辈的指点。在此谢谢楼上各位的热情回复,让我得到了清晰的思路,结贴了先。等我把该功能具体实现了,在那位前辈的允许下,会把过程写到blog。  详情 回复 发表于 2009-5-9 13:26
点赞 关注

回复
举报

54

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
可以把LOGO烧到FLASH的某个位置,在EBOOT阶段读出来显示到屏幕上,烧写方式和烧写EBOOT的方式一样,也可以在EBOOT阶段通过USB下载这个BIN文件,然后通过判断文件大小的方式确定是LOGO、EBOOT、NK中的哪个,然后烧到相应位置,位置你自己设定一个,所以基本上只要改改EBOOT的代码就可以了。
FLASH驱动中注意一下不要占用LOGO的地址空间就行了。
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
好的 ,我再来看看,谢谢
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 Veabol 的回复:
可以把LOGO烧到FLASH的某个位置,在EBOOT阶段读出来显示到屏幕上,烧写方式和烧写EBOOT的方式一样,也可以在EBOOT阶段通过USB下载这个BIN文件,然后通过判断文件大小的方式确定是LOGO、EBOOT、NK中的哪个,然后烧到相应位置,位置你自己设定一个,所以基本上只要改改EBOOT的代码就可以了。
FLASH驱动中注意一下不要占用LOGO的地址空间就行了。


一般都这样做,将其烧在eboot后面的flash中预留的空间内
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

5
 
烧到某个固定的地方应该可以
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

6
 
lz的想法是可行的,而且一直也是这样做的。
Logo.bin的组成需要跟eboot.bin/nk.bin一样,开始7位是wince的标志位,随后是烧录的地址,镜像大小,校验和。再之后就是所有有效数据块了。
具体的结构可以详细看一下eboot.bin就能明白。

转换的程序最好自己写,这样便于控制。如果另找的,转换后就详细对比一下是否符合要求。

下载时就通过串口或者usb,跟一般的下载没差别。

一般将eboot.bin之后的一段空间作为logo区,240x320,16位色的256KB即可。为了确保越来越大的屏幕需求,最好留大点,比如1MB。
在eboot加载时从这部分读数据即可。

确保nk.bin烧录时不能占用logo区。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
在eboot中是可以实现的,只要参考一下nk.bin就可以了,我实现了,但是在应用层,我还没有实现,现在我可以把图片识别到了,现在就是把整个图片显示出来的问题了,lpDest=0x80200000,往这个地址拷贝数据,1K就出问题了,只是少量数据,就没有问题,所以把eboot logo能识别,但是后面的数据块很多没有写进去。不知道怎么解决了

  1. ......
  2. pBinFile = (UINT8*)MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, dwFileSize);
  3. ......
  4.        lpDest = MapMemAddr (dwImageStart, dwRecAddr);       
  5.          pBinFile +=sizeof(DWORD);
  6.         // lpDest+=sizeof(DWORD);
  7.         memcpy(lpDest,pBinFile,dwRecLen);       
  8.        pBinFile +=dwRecLen;
  9.        memcpy((LPBYTE) &dwRecAddr,pBinFile,sizeof(DWORD));
  10.         pBinFile +=sizeof(DWORD);
  11.         memcpy((LPBYTE) &dwRecLen,pBinFile,sizeof(DWORD));
  12.         pBinFile +=sizeof(DWORD);
  13.         memcpy((LPBYTE) &dwRecChk,pBinFile,sizeof(DWORD));       
  14.        lpDest = MapMemAddr (dwImageStart, dwRecAddr);         
  15.          pBinFile +=sizeof(DWORD);
  16.         memcpy(lpDest,pBinFile,0x400);
  17.         DWORD  image_addr=dwRecAddr+0x400;
  18.          pBinFile +=0x400;         
  19.          lpDest = MapMemAddr (dwImageStart, image_addr);
  20.         memcpy(lpDest,pBinFile,0x400);
  21.         for(int m=0; m<4;++m )
  22.                 {pBinFile +=0x400;
  23.                         image_addr+=0x400;
  24.                           lpDest = MapMemAddr (dwImageStart, image_addr);
  25.                         memcpy(lpDest,pBinFile,0x400);
  26.                 }
  27.        
  28. #endif
  29.       //dwImageStart=MapMemAddr(dwImageStart,dwImageStart);
  30.         *pdwImageStart =dwImageStart;
  31.         *pdwImageLeng  = dwImageLength;
复制代码
 
 
 

回复

64

帖子

0

TA的资源

纯净的硅(初级)

8
 
楼主,logo.bin文件和nk.bin文件很类似,只要把nk的弄明白了,流程弄清楚了,这个应该不难,关键是读取那个块的信息,把logo.bin中的图片信息再读到内存中,为开机logo使用(不知道我说的有问题没有,有问题请更正)
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 5 楼 shuiyan 的回复:
lz的想法是可行的,而且一直也是这样做的。
Logo.bin的组成需要跟eboot.bin/nk.bin一样,开始7位是wince的标志位,随后是烧录的地址,镜像大小,校验和。再之后就是所有有效数据块了。
具体的结构可以详细看一下eboot.bin就能明白。

转换的程序最好自己写,这样便于控制。如果另找的,转换后就详细对比一下是否符合要求。

下载时就通过串口或者usb,跟一般的下载没差别。

一般将eboot.bin之后的一段空间作为logo…


根据你所说我已经将eboot.bin分析了一下:
根据\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BLCOMMON下blcommon.c文件中各函数分析:
Eboot.bin的前7个字节("B000FF\x0A")用来判断是否为WINCE的bin文件,接下边分别是4字节映像的起始地址dwImageStart、4字节映像大小dwImageLength,接着分别是4字节接收地址dwRecAddr、4字节接收长度dwRecLen、4字节接收检验和dwRecChk,接下来是eboot.nb0压缩后的数据,即eboot运行时的数据,查看eboot.bin文件dwRecLen值为4,即根据dwRecChk后边的4字节数据得到dwRecChk,VerifyChecksum()函数是将这4字节数据相加得到dwRecChk。

只是不清楚为什么dwImageLength的值比eboot.bin文件大很多,以前通过DNW下载NK的时候也发现此问题,当时还不清楚为什么打印出来的下载数据大小会比实际大一些,估计是这个文件的原因,但是为什么dwImageLength会比实际文件大呢?


如果这个dwImageLength值不会产生影响的话后边只要把图片转成上述格式的bin文件就可以了。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 5 楼 shuiyan 的回复:
lz的想法是可行的,而且一直也是这样做的。
Logo.bin的组成需要跟eboot.bin/nk.bin一样,开始7位是wince的标志位,随后是烧录的地址,镜像大小,校验和。再之后就是所有有效数据块了。
具体的结构可以详细看一下eboot.bin就能明白。

转换的程序最好自己写,这样便于控制。如果另找的,转换后就详细对比一下是否符合要求。

下载时就通过串口或者usb,跟一般的下载没差别。

一般将eboot.bin之后的一段空间作为logo…


我用的是PIC2RAW ,以前叫BMP2RAW , 网上down的 。看他说明,没提到标志位,地址,大小之类的 。我用Viewbin打不开它生成的.bin文件,用UE 对比看了下eboot.bin和e01.bin(bmp图片用上面提到的工具转换得到的),发现并没有它标志位之类的数据。

如果转换工具自己写,真不知道从何开头,估计又得去看bmp的相关文档,shuiyan如果做过能否分享下这工具的源码。
   还有就是我如何在flash中开辟这块存放LOGO的区域,并让它不能被别的东西占用。

一般将eboot.bin之后的一段空间作为logo区,240x320,16位色的256KB即可。为了确保越来越大的屏幕需求,最好留大点,比如1MB。
在eboot加载时从这部分读数据即可。

确保nk.bin烧录时不能占用logo区。
  这里面提到的区是指RAM中的区域还是指NAND?  谢谢!
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

11
 
如果你只想在EBOOT下载用的话那个logo.bin不一定要什么工具,把BMP图片通过UltraEdit等工具打开,去掉前边70字节和后边2字节不需要的数据,再按照eboot.bin的格式添加些数据保存成bin文件就可以了。

有一点需要注意的是logo图片可能需要通过图形处理工具转一下图,否则这个logo显示出来可能是反的。
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

12
 
前边好象是54字节,根据情况自己看下吧
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

13
 
没有人帮我看看6楼的问题呢
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 11 楼 Veabol 的回复:
如果你只想在EBOOT下载用的话那个logo.bin不一定要什么工具,把BMP图片通过UltraEdit等工具打开,去掉前边70字节和后边2字节不需要的数据,再按照eboot.bin的格式添加些数据保存成bin文件就可以了。

有一点需要注意的是logo图片可能需要通过图形处理工具转一下图,否则这个logo显示出来可能是反的。

  就是只留下数据部分,然后加上WINCE标志位之类的东西,是吧。弄完之后跟用那个工具转换的一比较,差别好大。
  
经过大家的指导,现在基本理清了大致思路,如下:
1:处理图片:用Veabol的方法,直接用打开UE另存为.bin格式,这个去掉多少字节还要查证,BMP是16BIT的。
2:在nand开辟一块地方存放该LOGO。
3:在eboot中读取该LOGO ,并填充到 framebuffer。
  下载和读取这些都有得参考  , 做来试试  ,有问题再上来请教。谢谢。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 13 楼 adrian_bleu 的回复:
没有人帮我看看6楼的问题呢

是不是定义的 framebuffer太小了?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 6 楼 adrian_bleu 的回复:
在eboot中是可以实现的,只要参考一下nk.bin就可以了,我实现了,但是在应用层,我还没有实现,现在我可以把图片识别到了,现在就是把整个图片显示出来的问题了,lpDest=0x80200000,往这个地址拷贝数据,1K就出问题了,只是少量数据,就没有问题,所以把eboot logo能识别,但是后面的数据块很多没有写进去。不知道怎么解决了

C/C++ code
......
pBinFile = (UINT8*)MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, dwFile…

问下你的bin文件是怎么得到的?  刚想到 ,没想刷楼,勿怪。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

17
 
我的是直接把bootloader所占据的位置改大的。而不是另外搞个图片存储的地方,多麻烦啊。

再说时间应该是一样的。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

18
 
通过转换工具得到的,呵呵,工具是现成的。别人做好的。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 15 楼 sphink 的回复:
引用 13 楼 adrian_bleu 的回复:
没有人帮我看看6楼的问题呢

是不是定义的 framebuffer太小了?


开始的3k没有问题,但是后面的就开始出问题了,我用DNW软件,上面开始打印信息,都是乱码,应该是这里的问题。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 18 楼 adrian_bleu 的回复:
通过转换工具得到的,呵呵,工具是现成的。别人做好的。

  工具能共享下不?  根据Veabol所说的,我现在还是不能确定到底截多少字符。你eboot中已经实现了,现在在做应用层的是吧?  看到你开的贴了。我暂时还没想做到那样,这个都够头大了,如果可能望能指教,呵呵。
   邮箱:sphink@163.com  QQ:289330210  谢谢。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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