原创 【连载】Sunplus DVD软件Makefile详解(四)

2009-12-16 09:59 2620 5 5 分类: MCU/ 嵌入式

Sunplus DVD软件Makefile详解(四)


         xluoly@hotmail.com


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

根目录Makefile


1   #


2   # Makefile


3   #


4  


5   PATH    := $(PATH) .


6   VPATH   = DSP3 MIPS IR_VFD IOP SETUP mcu_protocol


7  


8   .SUFFIXES:


9   .PHONY:     force


10 


11  sinclude Makefile.utl


12 


13  LIBDIR      = mipsel-elf


14  LIBPPCMDIR  = mipsel-elf-ppcm


15  LIBAACDIR    = mipsel-elf-aac


16  #LIBWMADIR   = mipsel-elf-wma


17  LIBDTSDIR    = mipsel-elf-dts


18  LIBSRVDIR   = srv-elf


19  GOAL         = romL.obj


20  LDSCRIPT = dvdL.ld


21  CFLAGS_ENDIAN   = -DLITTLE_ENDIAN


22 


23  INIT0       = MIPS/init0.o


24  ROMINIT0 = MIPS/rominit.o


25  ROMFINIT0   = MIPS/romfinit.o


26  CRT0         = MIPS/crt0.o


27 


28  INCLUDE_DIR = -<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />I. -Ih/ -Iosd/ -Isetup/  -Iemu/ -Inav/ -Iauth/ \


29                -Iservo/ -Ichinese/ -Iir_vfd/ -Ipeif/ -Igame/ \


30                -Isystem/ -Iauddrv/ -Imcu_protocol/


31 


32  # generic flags


33  CFLAGS_SUPPORT  = -D__EMU__ -DFINALSYS


34  CFLAGS_SIM  =


35  CFLAGS_COMPILE  = $(CFLAGS_SUPPORT) $(CFLAGS_SIM)


36 


37  # CFLAGS_CPPX


38  # for dvdL.ldp parsing


39  CFLAGS_CPPX = $(CFLAGS_COMPILE) -I. -Ih -x c++


40 


41  # ld related flags (LDFLAGS)


42  LIBRARIES   =


43  LDFLAGS_LIB =


44  LDFLAGS     = -nostartfiles -T $(LDSCRIPT) -L$(LIBDIR) -L$(LIBPPCMDIR) \


45                -L$(LIBAACDIR) -L$(LIBDTSDIR) -L$(LIBSRVDIR) $(LDFLAGS_LIB) \


46               --cref -Wl,--gc-sections,--sort-common,-Map,$*.map


47 


48  # Sources


49  SOURCES_IOP = \


50      iop.c \


51      ioprom.c \


52 


53  SOURCES_AUD = \


54      dsp3_config.c\


55      dsp3_intr.c \


56      DSP3Codec.c \


57 


58  SOURCES     = \


59      ap_main.c \


60      emuio.c \


61      databuf.c \


62      membuf.c \


63      membufv.c \


64      c_i2c.c \


65      gpio.c \


66      card_media.c \


67      usb_media.c \


68      disc_media.c \


69      fs_file_ext_info_tab.c\


70      fs_ui.c\


71      resume_util.c \


72      sp_nvmem.c \


73      flash_if.c \


74      shuffle_new.c \


75      car_mcu.c\


76      $(SOURCES_IOP) \


77      $(SOURCES_AUD) \


78     


79  SOURCES_S   = intdrv.S


80     


81  DEPENDS_C   = \


82      $(addprefix MIPS/,$(SOURCES:.c=.d))


83 


84  DEPENDS_S   = \


85      $(addprefix MIPS/,$(SOURCES_S:.S=.d))


86 


87  DEPENDS     = $(DEPENDS_C) $(DEPENDS_S)


88  OBJS    = $(DEPENDS:.d=.o)


89 


90  # main target


91  all: $(GOAL)


92      @$(CHKSUM) romL.bin 64


93      @$(XB2) 0x70 romL.bin rom.bin


94      @$(CHKSUM) rom.bin 32


95      @$(ECHO) \"all made\"  


96 


97 


98  # dvdL.ld


99  dvdL.ld: dvdL.ldp force


100         @$(ECHO) \"generate linker script\"


101         @$(CPP) $(CFLAGS_CPPX) dvdL.ldp > dvdL.ld


102


103 # GOAL


104 $(GOAL): %.obj: $(LIBRARIES) $(OBJS) $(INIT0) $(CRT0) \


105                $(ROMINIT0) $(BOOT_FLASH) dvdL.ld


106         @$(ECHO) \"linking..\"


107    @$(XCC) $(CFLAGS_MIPS) -o $@ $(INIT0) $(OBJS) $(CRT0) \


108                   $(ROMINIT0) $(BOOT_FLASH) $(LDFLAGS)


109         @$(ECHO) \"dumping..\"


110         @$(XOBJDUMP) -j .rom1 -s $@ > $*.dump


111         @$(XOBJDUMP) -j .ram1 -s $@ >> $*.dump


112         @$(XOBJDUMP) -j .rom2 -s $@ >> $*.dump


113         @$(XOBJDUMP) -j .drv_iop -s $@ > iop.dump


114         @$(XOBJDUMP) -j .drv_iop_rst -s $@ > iop_rst.dump


115         @$(XOBJDUMP) -j .drv_ap1 -s $@ > ap1.dump


116         @$(DUMP2BIN) iop.dump iop.bin


117         @$(FGZIP2) -f iop.bin


118         @$(DUMP2BIN) iop_rst.dump iop_rst.bin


119         @$(FGZIP2) -f iop_rst.bin


120         @$(DUMP2BIN) ap1.dump ap1.bin


121         @$(FGZIP2) -f ap1.bin


122         @$(ECHO) \"packaging..\"


123         @$(DUMP2BIN) $*.dump $*.bin


124         @$(MODUAL) $*.bin ap1.bin.gz iop.bin.gz iop_rst.bin.gz


125


126 %.dis : %.obj


127         @$(ECHO) \"disassembling..\"


128         @$(XOBJDUMP) --disassemble -j .rom1 --source $< > $@


129


130 # special commands.


131 MIPS/init0.o : user_init.h


132 MIPS/init0.o : init0.S ./h/regmapa.h ./h/sdctrl.h  ./sdram.h


133 MIPS/crt0.o : crt0.S ./h/regmapa.h ./h/sdctrl.h ./user_init.h ./sdctrl.inc


134 MIPS/boot_flashs.o : boot_flashs.S ./h/regdef.h


135


136 ifneq ($(MAKECMDGOALS),clean)


137 ifneq ($(MAKECMDGOALS),tar)


138 ifneq ($(MAKECMDGOALS),bak)


139 sinclude    $(DEPENDS)


140 endif


141 endif


142 endif


143


5)将当前目录(.)加入系统路径变量PATH


6)定义输入文件的搜索路径。


1318)定义各种库文件的搜索路径


19)定义总的目标文件名romL.obj


20)定义链接脚本文件名dvdL.ld


2326)定义启动代码的相关的目标文件。它们的依赖关系定义在第130134行。源代码是汇编语言(.S),编译命令定义在核心MakefileMakefile.ult)的第107109行,编译生成.o文件。


4446)定义链接命令参数。-T指定链接脚本文件;-L指定链接库路径;-Map指定生成的map文件。


4879)列举所有输入文件,其中包括.c.S文件。


8188)指定所有输入文件对应的依赖文件(.d)和目标文件(.o)。它们的编译命令前面已经介绍过了。


98101)定义链接脚本文件的依赖关系和生成命令。dvdL.ldp文件经cpp预处理后生成dvdL.ld文件,dvdL.ld才是链接命令使用的脚本文件。dvdL.ldp只是便于阅读和管理而建立的。


103108)定义总目标文件的依赖关系和编译命令。首先将所有.c.S文件编译成对应的.o文件,然后链接成总目标文件romL.obj。这是ELF格式文件。


110112)将section .rom1.ram1.rom2的全部内容依次串接起来,输出到$*.dump文件(romL.dump)。


113115)将section .drv_iop.drv_iop_rst.drv_ap1的全部内容分别输出到文件iop.dumpiop_rst.dumpap1.dump。下面节选romL.dump文件中的部分内容。很直观的看出每个section的内容及其地址。


romL.obj:     file format elf32-littlemips


 


Contents of section .rom1:


 88000000 cdab4234 00000000 85000010 00000000  ..B4............


 88000010 0800e003 00000000 00000000 00000000  ................


 88000020 00000000 00000000 00000000 00000000  ................


……


88003580 00000000 23100200 08006001 00000000  ....#.....`.....


 88003590 2158e003 21508000 530d000e 00000000  !X..!P..S.......


 880035a0 21108000 f5ff0010 00000000 00000000  !...............


 


romL.obj:     file format elf32-littlemips


 


Contents of section .ram1:


 80000000 696e6974 69616c20 6f6b0000 00000000  initial ok......


 


romL.obj:     file format elf32-littlemips


 


Contents of section .rom2:


 880035c0 4c697474 6c652065 6e646961 6e0a0000  Little endian...


 880035d0 25730a00 74657374 0a000000 30782578  %s..test....0x%x


 880035e0 0a000000 25640a00 74657374 206f6b00  ....%d..test ok.


 ……


116123)将各个.dump文件通过工具dump2bin处理分别生成各自对应的.bin文件。然后各.bin文件再经过压缩工具fgzip2处理生成同名.bin.gz文件。但是romL.bin除外,它不经压缩工具处理,原因在接下来的内容中会给予说明。下面是romL.dump处理后生成的romL.bin,是二进制文件,用UltraEdit打开,看到如下。容易看出,它是将romL.dump中的各个section内容依次连接在一起。


00000000   CD AB 42 34 00 00 00 00  85 00 00 10 00 00 00 00   B4....?......


00000010   08 00 E0 03 00 00 00 00  00 00 00 00 00 00 00 00   ..?............


00000020   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00   ................


……


00013696   00 00 00 00 23 10 02 00  08 00 60 01 00 00 00 00   ....#.....`.....


00013712   21 58 E0 03 21 50 80 00  53 0D 00 0E 00 00 00 00   !X?!P€.S.......


00013728   21 10 80 00 F5 FF 00 10  00 00 00 00 00 00 00 00   !.€.?..........


00013744   69 6E 69 74 69 61 6C 20  6F 6B 00 00 00 00 00 00   initial ok......


00013760   4C 69 74 74 6C 65 20 65  6E 64 69 61 6E 0A 00 00   Little endian...


00013776   25 73 0A 00 74 65 73 74  0A 00 00 00 30 78 25 78   %s..test....0x%x


00013792   0A 00 00 00 25 64 0A 00  74 65 73 74 20 6F 6B 00   ....%d..test ok.


……


9095)定义默认目标的依赖关系和处理命令。$(GOAL)是它的依赖,因此,上面我们已经介绍过的目标$(GOAL)会在它之前得到执行,生成romL.bin。这里的三条处理命令是对romL.bin加入checksum和加密(xb2)后生成rom.bin文件。加密命令xb2似乎只是将romL.bin中一段内容与一个数据序列进行异或运算(xor)。如果这里只是异或运算的话,只要将xb2生成的文件再进行一次相同的xb2处理就能还原该文件,这里没有深入研究过。其实不经过这三条命令处理,得到的romL.bin也能运行。


124)将前面生成的各模块.bin文件按顺序合成一个romL.bin文件


126128)用于反编译romL.obj。这里仅对section .rom1进行反编译。利用反编译查找系统死机位置非常精确。当不明原因引起死机时,调试任务会将系统当前各种信息打印出来。其中就包括EPC寄存器值,这是异常发生时的程序指针(异常返回地址),在反编译的文件中查找EPC指向的地址,就知道系统死机的位置了。


『未完,待续...』

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条