风来风云

工作学习感悟

sunplus8202v BIN文件中LOGO的替换工具设计思路

原创文章,如有转载,请注明出处:http://blog.csdn.net/desert2009sz/article/details/6871758


     由于前段时间在做单游戏手柄的无线转换方案,所以收集了一些关于IOP以及SPMC6502的资料。开始设计时本想省掉这个接口IC,但由于其设计难度较高,且以后双无线手柄也需要做这样的工作,所以就还是花了3天左右的时间把该方案完成。在这个过程中,对游戏手柄的工作方式,通讯协仪,以及8202v的软件架构和编译有了一定的了解。

      在完成设计后,原本想再花点时间把risc游戏手柄控制那块学习下,看看能不能对双游戏手柄提供帮助。因此又查阅了8202v的makefile,虽然最终没有找到对游戏手柄有价值的东西,但还是获益匪浅。通过对该文件的学习,对其软件的编译过程,工作模式,bin的生成过程,模块分类,模块加载和运行,模块与risc的通讯(主指iop)有了一定的了解。

       以下部分就是bin的生成过程总结:

       ① 生成romL.obj

       ② 根据dvdL.ld从romL.obj中提取:rom1.dump, ram1.dump, rom2,dump, 并将其合并为romL.dump

       ③ 根据dvdL.ld从romL.obj中

            提取iop.dump,转为iop.bin,压缩生成iop.bin.gz

            提取iop_rst.dump,转为iop_rst.bin,压缩生成iop_rst.bin.gz

            ......

            提取fsgui.dump,转为fsgui.bin,压缩生成fsgui.bin.gz

       ④ 将romL.dump生成romL.bin,将iop.bin.gz, iop_rst.bin.gz,.....fsgui.bin.gz也添加到romL.bin后面

       ⑤  @$(CHKSUM) romL.bin 64
             @$(XB2) 0x70 romL.bin rom.bin
             @$(CHKSUM) rom.bin 32
             据说第⑤步可以不做也能正常工作,待证实

 

    前几天听到同事说想设计一个能对rom.bin直接换logo的工具,我的思路如下。

一、需要解决的问题

①要想替换,就必须先找到被换的logo在哪

  根据title.c文件,得知logo文件存放在DVDTitle数组里;又根据dvdL.ld知道title.c中DVDTitle常量在drv_fsgui这个SECTIONS中;

  而drv_fsgui最终生成了fsgui.bin.gz,放在了romL.bin最后面;

  DVD在显示logo前,需要通过RISC中的LoadModual函数,将MODUAL_FSGUI_CODE模块_text_fsgui,即fsgui.bin.gz加载并解压到SDRAM运行;

  fsgui.bin.gz在romL.bin的位置: 

  unOffset = ((UINT32 *)_stextf)[MODUAL_FSGUI_CODE];
  p = (BYTE *)(_stextf + unOffset + (MODUAL_Ns * 4)); p即其位置;

  _stextf的值可以在romL.map中查到:

                0x0000000088192720                _etext=((ADDR(.rom1)+SIZEOF(.rom1))+SIZEOF(.rom2))
                0x00000000881934f0              _stextf=(_etext+SIZEOF(.ram1))

  unOffset的值可以在romL.bin中查到,即((UINT32 *)(0x00000000881934f0)[MODUAL_FSGUI_CODE])=0x01AC93 [93 AC 01 00]
  p=0x1934f0 + 0x01AC93 + 80 = 0x1AE1D3

 =================================================================================================================

 从romL.bin中导出fsgui.bin.gz;

 用winhex在fsgui.bin.gz的文件头加入1F 8B 08 08 F0 20 3E 47 02 0B 66 73 67 75 69 2E 62 69 6E 00

 然后解压缩得到fsgui.bin

      //在gzip的官网上下载gzip.

      //将该工具解压,然后通过该工具对fsgui.bin.gz解压

gzip -d -c iop_test.bin.gz >iop_test.bin



  根据romL.map查找_text_fsgui,DVDTitle

 .drv_fsgui      0x00000000806ff800    0x64e90

                       0x00000000806ff800                _text_fsgui=.

 *title.o(.rodata.DVDTitle)
 .rodata.DVDTitle
                0x0000000080754cf8     0xf980 MIPS/title.o
                0x0000000080754cf8                DVDTitle
求得fsgui.bin中logo文件的地址:0x0000000080754cf8-0x00000000806ff800=0x554F8,长度0xf980
===================================================================================================
②怎么替换
生成DVDtitle的logo文件,得到长度为N
将fsgui.bin中旧的logo文件去掉,并将新的logo文件插入,同时更新logo文件的长度,以便做为下次更新的依据
将fsgui.bin打包成fsgui.bin.gz
将romL.bin中旧的fsgui.bin.gz更新为新的

二、开发步骤
①知识点:
   gzip格式, makefile,objdump使用,bmp转bin互转等
②开发环境:vc6 或 delphi
③软件功能:可以读取、显示、修改现有romL.bin的logo文件
④限制:必须读取最后一次编译生成的map中的几个重要地址

以上是通过阅读makefile配置文件,反向思考怎么设计替换logo的工具。如果大家有更好的方法,请告诉我,谢谢!
补充 :
其实可以在romL.bin中查找fsgui.bin.gz的开头N个字节,如果相同,就将从该段(假定为X)开始到结束的那部分数据复制出来解压缩,得到fsgui.bin;而DVDTitle是由bmp转为bin生成的,其开头的M个字节和结尾处的4个字节内容是相同的,也可以根据这一点将其找出来;然后再用logo生成工具得到新的bin,将其替换到fsgui.bin中并压缩生成新的fsgui.bin.gz,然后将romL.bin的0~X这段和新的fsgui.bin.gz合并就可以了。
以上查找的实际上是fsgui.bin.gz和DVDTitle的“特征码”。
关于特征码,就是gz和BMP转换后的bin是不同的文件,他们的文件结构不同,扩展名不同,所以在文件里表现的特征是不同的.通过这些特征,我们就可以把他们从BIN文件里挖出来
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/desert2009sz/article/details/6871758
个人分类: DVD
想对作者说点什么? 我来说一句

bmp图片转logo.bin文件

2011年10月21日 2.58MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭