如何实现nand flash 存取 LOGO(在EBOOT中)?

weicunshang   2009-5-7 05:18 楼主
     最近在做一个开机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保留一个分区。
     暂时想到这些。

回复评论 (25)

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


一般都这样做,将其烧在eboot后面的flash中预留的空间内
点赞  2009-5-7 11:13
烧到某个固定的地方应该可以
点赞  2009-5-7 12:10
lz的想法是可行的,而且一直也是这样做的。
Logo.bin的组成需要跟eboot.bin/nk.bin一样,开始7位是wince的标志位,随后是烧录的地址,镜像大小,校验和。再之后就是所有有效数据块了。
具体的结构可以详细看一下eboot.bin就能明白。

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

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

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

确保nk.bin烧录时不能占用logo区。
点赞  2009-5-7 12:34
在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;
点赞  2009-5-7 13:48
楼主,logo.bin文件和nk.bin文件很类似,只要把nk的弄明白了,流程弄清楚了,这个应该不难,关键是读取那个块的信息,把logo.bin中的图片信息再读到内存中,为开机logo使用(不知道我说的有问题没有,有问题请更正)
点赞  2009-5-7 13:52
引用: 引用 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文件就可以了。
点赞  2009-5-7 14:28
引用: 引用 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?  谢谢!
点赞  2009-5-7 14:46
如果你只想在EBOOT下载用的话那个logo.bin不一定要什么工具,把BMP图片通过UltraEdit等工具打开,去掉前边70字节和后边2字节不需要的数据,再按照eboot.bin的格式添加些数据保存成bin文件就可以了。

有一点需要注意的是logo图片可能需要通过图形处理工具转一下图,否则这个logo显示出来可能是反的。
点赞  2009-5-7 15:04
前边好象是54字节,根据情况自己看下吧
点赞  2009-5-7 16:02
没有人帮我看看6楼的问题呢
点赞  2009-5-7 16:37
引用: 引用 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。
  下载和读取这些都有得参考  , 做来试试  ,有问题再上来请教。谢谢。
点赞  2009-5-7 16:44
引用: 引用 13 楼 adrian_bleu 的回复:
没有人帮我看看6楼的问题呢

是不是定义的 framebuffer太小了?
点赞  2009-5-7 16:46
引用: 引用 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文件是怎么得到的?  刚想到 ,没想刷楼,勿怪。
点赞  2009-5-7 16:48
我的是直接把bootloader所占据的位置改大的。而不是另外搞个图片存储的地方,多麻烦啊。

再说时间应该是一样的。
点赞  2009-5-7 16:48
通过转换工具得到的,呵呵,工具是现成的。别人做好的。
点赞  2009-5-7 16:58
引用: 引用 15 楼 sphink 的回复:
引用 13 楼 adrian_bleu 的回复:
没有人帮我看看6楼的问题呢

是不是定义的 framebuffer太小了?


开始的3k没有问题,但是后面的就开始出问题了,我用DNW软件,上面开始打印信息,都是乱码,应该是这里的问题。
点赞  2009-5-7 17:07
引用: 引用 18 楼 adrian_bleu 的回复:
通过转换工具得到的,呵呵,工具是现成的。别人做好的。

  工具能共享下不?  根据Veabol所说的,我现在还是不能确定到底截多少字符。你eboot中已经实现了,现在在做应用层的是吧?  看到你开的贴了。我暂时还没想做到那样,这个都够头大了,如果可能望能指教,呵呵。
   邮箱:sphink@163.com  QQ:289330210  谢谢。
点赞  2009-5-7 22:35
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复