TMS320C6678开发笔记---IBL编译与分析5

9.4节  IBL编译输出文件分析

9.4.1 编译分析汇总

  • 生成的第一个文件:i2cparam_c66x_le.out即i2cparam_0x51_c6678_le_0x500.out其作用是通过CCS加载此文件,在运行gel脚本,设置ibl参数,这个过程可以将ibl写死,对应的c文件为boot_loader\ibl\src\util\i2cConfig\i2cparam.c
  • 生成的第二个文件:iblConfig.out(不能在CCS中运行,可以在MinGW中运行),对应的c文件为boot_loader\ibl\src\util\iblConfig\src\iblConfig.c,主要作用为:通过此工程可以将默认的ibl的配置文件添加到i2crom.ccs(生成的第五个文件)中,运行结果如下图

  • 生成的第三个文件:ibl_c66x_init.out(可以直接通过CCS加载执行,从而可以自己调试此代码),最终通过一系列工具转换为ibl_init.i2c.le.ccs(为第五个生成文件服务),对应的c文件为boot_loader\ibl\src\main\iblinit.c
  • 生成的第四个文件:ibl_c66x.out(可以直接通过CCS加载执行,从而可以自己调试此代码),最终通过一系列工具转换为ibl.i2c.le.ccs(为第五个生成文件服务),对应的c文件为boot_loader\ibl\src\main\iblmain.c
  • 生成的第五个文件:i2crom.ccs猜测:此文件将 ibl_init.i2c.le.ccs 和  ibl.i2c.le.ccs合并,再通过 romparse工具生成i2crom.ccs(因为romparse输出文件名被写死为i2crom.ccs),此文件必须通过EEPROMWriter.out或者NorFlashWriter.out烧写到dsp中运行,可以理解为是IBL最终代码,最终转换为bin格式:i2crom.bin即i2crom_0x51_c6678_le.bin                                                                                                                                                                                                              dat格式:i2crom.dat即i2crom_0x51_c6678_le.dat
  • 生成的第六个文件:spiRom.dat与第四次生成原理一致,只是将i2c转变为spi,猜测:此文件是烧写到spi norflash中的IBL代码,spi方式,并没有用做bin格式文件转换
  • NOR 启动的IBL不支持通过gel脚本设置IBL参数,IBL参数在c文件中写死了C:\MinGW\msys\1.0\ibl\boot_loader\ibl\src\util\iblConfig\src\device.c。

9.4.2 具体输出信息分析

<Optimizing>
<Generating>
<Interlisting>
<Assembling>
make[3]: Leaving directory `/ibl/boot_loader/ibl/src/norboot/c64x/make'
cat ibl_c66x/ibl_init_objs_template.inc | sed -e s/ENDIAN_TAG/le/g > ibl_c66x/ibl_init_objs.tmp
cl6x -ppo -DIBL_CFG_I2C_MAP_TABLE_DATA_BUS_ADDR=0x51 -DEXCLUDE_COFF -DEXCLUDE_BIS -DEXCLUDE_NAND_GPIO -DENDIAN_TAG=le ibl_c66x/ibl_init_objs.tmp
cp -f ibl_c66x/ibl_init_objs.pp ibl_c66x/ibl_init_objs.inc
cl6x -z -o ibl_c66x/ibl_c66x_init.out -m ibl_c66x/ibl_c66x_init.map ibl_c66x/ibl_init.cmd "C:/ti/C6000 Code Generation Tools 7.3.0"/lib/rts64plus.lib
<Linking>
// 第二个生成的out文件 ibl_c66x_init.out
cp -f ibl_c66x/ibl_c66x_init.out ibl_c66x/ibl_c66x_init.le.out					
rm -f -f ibl_c66x/ibl_init_obj.inc
// 通过ASCII-Hex 工具ibl_init_image.rmd 将 ibl_c66x_init.out 转成 ibl_le.b
hex6x -order L ibl_c66x/ibl_init_image.rmd ibl_c66x/ibl_c66x_init.out			
Translating to ASCII-Hex format...
   "ibl_c66x/ibl_c66x_init.out"   ==> .text
   "ibl_c66x/ibl_c66x_init.out"   ==> .cinit
   "ibl_c66x/ibl_c66x_init.out"   ==> .const
cp -f ibl_le.b ibl_c66x/ibl.b
// 通过b2ccs工具 将 ibl_le.b 转成 ibl_init.le.ccs
../util/btoccs/b2ccs ibl_c66x/ibl.b ibl_c66x/ibl_init.le.ccs	
// 通过hex6x 工具ibl_init.rmd 将 ibl_c66x_init.out 转成 ibl_le.b				
hex6x -order L ibl_c66x/ibl_init.rmd ibl_c66x/ibl_c66x_init.out					
Translating to ASCII-Hex format...
   "ibl_c66x/ibl_c66x_init.out"   ==> .cinit    (BOOT LOAD)
   "ibl_c66x/ibl_c66x_init.out"   ==> .const    (BOOT LOAD)
   "ibl_c66x/ibl_c66x_init.out"   ==> .text     (BOOT LOAD)
// 通过bconvert64x 将 ibl_le.b 转成 ibl.b
../util/bconvert/bconvert64x -le ibl_le.b ibl.b									
cp -f ibl.b ibl_c66x
// 通过b2i2c 将 ibl.b 转成 ibl.i2c.b
../util/btoccs/b2i2c ibl_c66x/ibl.b ibl_c66x/ibl.i2c.b	
// 通过b2ccs 将 ibl.i2c.b 转成 ibl_init.i2c.le.ccs 第二个生成的文件最终转换成为这个文件						
../util/btoccs/b2ccs ibl_c66x/ibl.i2c.b ibl_c66x/ibl_init.i2c.le.ccs			
sed -e 's/\\r//' ../util/symExtract/symExtract > ../util/symExtract/symExtract_unix
bash ../util/symExtract/symExtract_unix ibl_c66x/ibl_c66x_init.map ibl_c66x/ibl_init_symbols.inc iblBootBtbl iblMalloc iblFree iblMemset iblMemcpy
rm -f ../util/symExtract/symExtract_unix
cat ibl_c66x/ibl_objs_template.inc | sed -e s/ENDIAN_TAG/le/g > ibl_c66x/ibl_objs.tmp
cl6x -ppo -DIBL_CFG_I2C_MAP_TABLE_DATA_BUS_ADDR=0x51 -DEXCLUDE_COFF -DEXCLUDE_BIS -DEXCLUDE_NAND_GPIO -DENDIAN_TAG=le ibl_c66x/ibl_objs.tmp
cp -f ibl_c66x/ibl_objs.pp ibl_c66x/ibl_objs.inc
cl6x -z -o ibl_c66x/ibl_c66x.out -m ibl_c66x/ibl_c66x.le.map  ibl_c66x/ibl.cmd "C:/ti/C6000 Code Generation Tools 7.3.0"/lib/rts64plus.lib
<Linking>
// 第三个生成的out文件 ibl_c66x.out
cp -f ibl_c66x/ibl_c66x.out ibl_c66x/ibl_c66x.le.out							
rm -f -f ibl_c66x/ibl_obj.inc
// 通过hex6x ibl.rmd 将 ibl_c66x.out 转成 ibl_le.b
hex6x -order L ibl_c66x/ibl.rmd ibl_c66x/ibl_c66x.out							
Translating to ASCII-Hex format...
   "ibl_c66x/ibl_c66x.out"   ==> .cinit         (BOOT LOAD)
   "ibl_c66x/ibl_c66x.out"   ==> .const         (BOOT LOAD)
   "ibl_c66x/ibl_c66x.out"   ==> .text  (BOOT LOAD)
   "ibl_c66x/ibl_c66x.out"   ==> .switch        (BOOT LOAD)
// 通过bconvert64x 将 ibl_le.b 转成 ibl.b
../util/bconvert/bconvert64x -le ibl_le.b ibl.b									
cp -f ibl.b ibl_c66x
// 通过b2i2c 将 ibl.b 转成 ibl.i2c.b
../util/btoccs/b2i2c ibl_c66x/ibl.b ibl_c66x/ibl.i2c.b	
// 通过b2ccs 将 ibl.i2c.b 转成 ibl.i2c.le.ccs 第三个生成的文件最终转换成为这个文件						
../util/btoccs/b2ccs ibl_c66x/ibl.i2c.b ibl_c66x/ibl.i2c.le.ccs					
make[2]: Leaving directory `/ibl/boot_loader/ibl/src/make'
make -f makestg2 ARCH=c64x TARGET=c66x I2CROM=little_endian I2C_BUS_ADDR=0x51 I2C_MAP_ADDRESS= EVM=c6678l COMPACT_I2C= SPI_DEFS='SPI_MODE=1 SPI_ADDR_W
IDTH=24 SPI_NPIN=5 SPI_CSEL=2 SPI_C2TDEL=1 SPI_CLKDIV=8 SPI_ROM=1'  i2crom spiRom
make[2]: Entering directory `/ibl/boot_loader/ibl/src/make'
//产生I2C ROM
cl6x -ppo -I../cfg/c66x -DI2C_BUS_ADDR=0x51 -DI2C_MAP_ADDR=0x500 -DEVM=c6678l -DPAD_FILE_ID_1=1 -DPAD_FILE_ID_2=1 -DINIT_EXE_FILE='"ibl_c66x/ibl_init.
i2c.le.ccs"' -DEXE_FILE_1='"ibl_c66x/ibl.i2c.le.ccs"' -DEXE_FILE_2='""' ibl_c66x/i2crom.map.pre
// 第四次生成的文件,猜测:此文件将 ibl_init.i2c.le.ccs 和  ibl.i2c.le.ccs合并,
// 再通过 romparse工具生成i2crom.ccs(因为romparse输出文件名被写死为i2crom.ccs)
// 此文件必须通过EEPROMWriter.out或者NorFlashWriter.out烧写到dsp中运行,可以理解为是IBL最终代码
../util/romparse/romparse  -rom_base 0x51 ibl_c66x/i2crom.map.pp																		
cp -f i2crom.ccs ibl_c66x/i2crom.ccs
cp -f i2crom.ccs ibl_c66x/i2crom.dat
// 通过ccs2bin,将i2crom.ccs转换为i2crom.bin
../util/btoccs/ccs2bin -swap ibl_c66x/i2crom.ccs ibl_c66x/i2crom.bin	
cp ibl_c66x/i2crom.bin ../util/iblConfig/build/ibl.bin
(cd ../util/iblConfig/build;./iblConfig.out)
Opened file ibl.bin
Generated updated binary ibl.bin
cp ../util/iblConfig/build/ibl.bin ibl_c66x/i2crom.bin
rm -f i2crom.ccs ibl_le.b ibl.b

//产生SPI ROM
Making SPI ROM
cl6x -ppo -I../cfg/c66x -DSPI_MODE=1 -DSPI_ADDR_WIDTH=24 -DSPI_NPIN=5 -DSPI_CSEL=2 -DSPI_C2TDEL=1 -DSPI_CLKDIV=8 -DSPI_ROM=1 -DPAD_FILE_ID_1=1 -DPAD_F
ILE_ID_2=1 -DINIT_EXE_FILE='"ibl_c66x/ibl_init.i2c.le.ccs"' -DEXE_FILE_1='"ibl_c66x/ibl.i2c.le.ccs"' -DEXE_FILE_2='""' ibl_c66x/spiRom.map.pre
// 第五次生成的文件,与第四次生成原理一致,只是将i2c转变为spi,
// 猜测:此文件是烧写到spi norflash中的IBL代码,spi方式,并没有用做bin格式文件转换
../util/romparse/romparse  -fill 0xff -rom_base 0 ibl_c66x/spiRom.map.pp 
cp -f i2crom.ccs ibl_c66x/spiRom.ccs
cp -f i2crom.ccs ibl_c66x/spiRom.dat
make[2]: Leaving directory `/ibl/boot_loader/ibl/src/make'
make[1]: Leaving directory `/ibl/boot_loader/ibl/src/make'
cp -f ibl_c66x/i2crom.dat bin/i2crom_0x51_c6678_le.dat
cp -f ibl_c66x/i2crom.bin bin/i2crom_0x51_c6678_le.bin
// 第一个生成的out文件,其作用是通过CCS加载此文件,在运行gel脚本,设置ibl参数,这个过程可以将ibl写死
cp -f ../util/i2cConfig/i2cparam_c66x_le.out bin/i2cparam_0x51_c6678_le_0x500.out		

Administrator@PC-201906161941 /ibl/boot_loader
$

9.4.3 代码分析汇总

  • IBL代码分两部分分析,一个是iblinit.c,一个是iblmain.c,两部分代码均只是一个main函数,代码逻辑较清晰,而且第一个代码可以通过CCS仿真
  • iblinit.c(ibl_c66x_init.out)需要配合spiRom.map.pre文件使用。可以通过CCS仿真调试,调试前必须在NOR中烧写一个制作好的SPI直接可以启动的镜像(可以烧写spiRom.bin),因为iblinit.c的调试会根据镜像中的boot 参数运行程序(具体细节没有做过多分析)
  • iblmain.c(ibl_c66x.out)需要配合c6678_ibl_config分析。如果spiRom.bin正确,iblinit.c代码仿真完成后,会自动跳转到iblmain中运行,iblmain中主要是根据设置的ibl_config参数选择启动的镜像文件(具体怎么启动的没有做过多分析)

9.5节  MAD工具使用

9.5.1 参考文档

 

参考文档:

https://processors.wiki.ti.com/index.php/MAD_Utils_User_Guide

使用的是创龙提供的MAD工具,并没有对生成脚本做细致研究,此处只写出修改文件与操作方法

  • 工具位置E:\ft6678\doc\Tronlong6678\Demo\HostApp\MultiCoreBoot\Image Create

  • 参考文档:《3-1-TMS320C6678开发例程使用手册.pdf》1.7 烧写多核多镜像文件
  • 由于公司板卡没有EEPROMIBL(与MAD相关的修改请参考 “配合MAD工具使用IBL配置修改点”)经过移植在NOR中运行,这里只需要生成C6678-le.bin文件即可。烧写到NOR中即可,烧写方法参考“NOR FLASH IBL使用烧写步骤

 

9.5.2 修改脚本

  • build.bat脚本

  • deployment_C6678_bypass_prelink.json脚本

  • maptoolCfg_C6678_bypass_prelink.json脚本

9.5.3 操作方法

  1. 先安装python-2.7.10.amd64.msi
  2. 将编译成功的out文件拷贝到App目录下
  3. 根据自己的程序规划修改deployment_C6678_bypass_prelink.json(参考上文)
  4. 运行Build.bat脚本
  5. 在images目录下生成C6678-le.bin,烧写到NOR上,断电重启,即可运行

9.5.4 mad制作单一核镜像

  • 通过mad工具制作core0的镜像文件,其他核不加载镜像文件

修改deployment_C6678_bypass_prelink.json脚本如下:

9.5.5 MAD总结

  • MAD方法基于IBL引导DSP启动,可以直接加载out文件。
  • MAD方法制作镜像,不需要使用hex6x、b2css等转换工具链对out文件处理。
  • MAD方法制作镜像,不需要自己编写core0对其他core的IPC中断引导启动。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值