TMS320C6657 重新编译官方的IBL引导nor Flash中的程序

编译前的工作

遇到一块6657的板子,外接一块nor Flash用来存储代码,但使用TI官方的小工具将CCS编译出的.out文件转为.ccs文件写入至Flash中,始终无法启动该代码。然后查询到TI官方的另一种方法,使用IBL(二级bootloader),启动Flash中的代码。
不过TI的IBL是编译放在eeprom中,这块6657的板子没设计eeprom,只能将IBL放在norFlash的前部,引导Flash后边的用户程序,查询了很多帖子,终于实现了用户程序的引导。
本文章便是编译IBL源码的一个过程记录。

MinGW & MSYS安装

在win下编译IBL需要先安装MinGW和MSYS,这两个软件在win下提供了一套Linux命令行环境。可以直接安装MSYS(MSYS下载地址),安装MSYS会自动安装MinGW,然后安装gcc和make。或者直接参考这个博客安装MSYS和一些库。

IBL源码

IBL源码在mcsdk库中,拷贝mcsdk_2_01_02_06\tools\boot_loader文件夹至MSYS用户目录(msys安装目录\home\用户名)下。
在这里插入图片描述
双击msys安装目录下的mingw64.exe打开命令行窗口,显示一下文件,已经可以看到刚刚拷贝的boot_loader文件夹了
在这里插入图片描述

修改编译参数

指定c6000编译器

修改ibl\src\make\setupenvMsys.sh文件中的编译器路径,编译器路径在 CCS安装目录\ccsv5\tools\compiler下

#!/bin/bash

# Environment setup to be done if using MSYS Bash shell for build

# Specify the base directory of the c6000 compiler with UNIX style path separator
# export C6X_BASE_DIR='"C:/Program Files/Texas Instruments/C6000 Code Generation Tools 7.2.4"'
export C6X_BASE_DIR="E:/program/ccs550/ccsv5/tools/compiler/c6000_7.4.4"
# E:\program\ccs550\ccsv5\tools\compiler\c6000_7.4.4\bin

# Specify the base directory of the c6000 compiler in format understandable by the MSYS Bash shell 
# export C6X_BASE_DIR_MSYS=/c/Program\ Files/Texas\ Instruments/C6000\ Code\ Generation\ Tools\ 7\.2\.4
export C6X_BASE_DIR_MSYS=/e/program/ccs550/ccsv5/tools/compiler/c6000\_7\.4\.4

# Don't modify the below variables. They are derived from the above definitions 
export PATH=$PATH:$C6X_BASE_DIR_MSYS/bin
export TOOLSC6X=$C6X_BASE_DIR
export TOOLSC6XDOS=$C6X_BASE_DIR

修改make文件

修改ibl\src\make\Makefile文件

  • 第251行,添加evm_c6657_spi
.PHONY: all $(IBLS_C6X) evm_c6455 evm_c6472 evm_c6474 evm_c6474l evm_c6457 evm_c6678_i2c evm_c6670_i2c evm_c6657_i2c
修改为
.PHONY: all $(IBLS_C6X) evm_c6455 evm_c6472 evm_c6474 evm_c6474l evm_c6457 evm_c6678_i2c evm_c6670_i2c evm_c6657_i2c evm_c6657_spi
  • 第317行,修改evm_c6657_spi make参数
evm_c6657_spi:
	make -f makestg1 ARCH=c64x TARGET=c665x I2C=no I2C_BUS_ADDR=0x51 I2C_MAP_ADDR=0x500 ENDIAN_MODE=little CEXCLUDES=I2C SPI_DEFS='$(EVM_667x_SPI_DEFS)' c66x
修改为
evm_c6657_spi:
	make -f makestg1 ARCH=c64x TARGET=c665x EVM=c6657l I2C=no I2C_BUS_ADDR=0x51 I2C_MAP_ADDR=0x500 ENDIAN_MODE=little CEXCLUDES='I2C NAND_GPIO' SPI_DEFS='$(EVM_667x_SPI_DEFS)' c665x
  • 在第407行clean下添加
	find ../ -name *.ppa | xargs rm -f

修改ibl\src\make\makestg2文件

  • 第145行的spiRom添加如下命令
spiRom:
	@echo Making SPI ROM
	$(CC) -ppo -I../cfg/$(TARGET) $(SPI_CFG) ibl_$(TARGET)/$@.map.pre
	../util/romparse/romparse $(COMPACT) -fill 0xff -rom_base 0 ibl_$(TARGET)/$@.map.pp
	$(CP) i2crom.ccs ibl_$(TARGET)/$@.ccs
	$(CP) i2crom.ccs ibl_$(TARGET)/$@.dat
修改为
spiRom:
	@echo Making SPI ROM
	$(CC) -ppo -I../cfg/$(TARGET) $(SPI_CFG) ibl_$(TARGET)/$@.map.pre
	../util/romparse/romparse $(COMPACT) -fill 0xff -rom_base 0 ibl_$(TARGET)/$@.map.pp
	$(CP) i2crom.ccs ibl_$(TARGET)/$@.ccs
	$(CP) i2crom.ccs ibl_$(TARGET)/$@.dat
	../util/btoccs/ccs2bin -swap ibl_$(TARGET)/$@.ccs ibl_$(TARGET)/$@.bin
	cp ibl_$(TARGET)/$@.bin ../util/iblConfig/build/ibl.bin
	(cd ../util/iblConfig/build;./iblConfig.out)
	cp ../util/iblConfig/build/ibl.bin ibl_$(TARGET)/$@.bin
	$(RM) i2crom.ccs ibl_le.b ibl.b

修改ibl\src\make\c64x\makeeco.mk文件

  • 第164行
GGAMAKEDEP = $(MAKEDEP) $(MAKEDEP_OPT) $(ADEPINC) -a -e$(AOBJEXT) -o$$.$(ADEPEXT) $<
修改为
GGAMAKEDEP = $(MAKEDEP) $(MAKEDEP_OPT) $(ADEPINC) -a -e$(AOBJEXT) $<

  • 第192行,双引号改单引号
	sed -e "s/\\/\//g" < $(patsubst %.$(CDEPEXT),%.$(CDEPEXT)_TMP_2,$@) > $@
改为
	sed -e 's/\\/\//g' < $(patsubst %.$(CDEPEXT),%.$(CDEPEXT)_TMP_2,$@) > $@

修改ibl\src\make\c64x\makedefs.mk文件

修改如下

MAKEDEP = $(AS)
MAKEDEP_OPT = -q -apd $(CPUFLAGS)
ADEPEXT = ppa

重新设定DDR初始化参数

  • 修改ibl\src\hw\ddrs\emif4\emif4.c第221行开始的代码
    DDR配置寄存器的值由ddr数据线在PCB上布局的长度决定的,可以下载文件进行计算。
    else if (v == DEVICE_C6657_JTAG_ID_VAL)
    {
		...//修改这一块的代码
    }		
  • 修改ibl\src\util\iblConfig\src\device.c第1181行开始的代码,同样是修改DDR配置相关的寄存器的值。

boot table参数修改

  • 修改ibl\src\make\ibl_c665x\spiRom.map.pre第16行section中的值
  sw_pll_prediv	 = 1
  sw_pll_mult    = 20
  sw_pll_postdiv = 1
  sw_pll_flags   = 1

  options        = 1
  core_freq_mhz  = 1000

  bus_freq_mhz     = 1
  bus_freq_khz     = 0

  addr_width   = 24
  n_pins       = 5
  mode         = 1
  csel         = 2
  • 同时修改SPI相关参数,ibl\src\util\iblConfig\src\device.c文件的第1222行
    ibl.spiConfig.addrWidth  = 24;
	ibl.spiConfig.nPins      = 5;
	ibl.spiConfig.mode       = 1;	
	ibl.spiConfig.csel       = 2;
	ibl.spiConfig.c2tdelay   = 1;
	ibl.spiConfig.busFreqMHz = 20;

重新设定IBL载入区域

IBL 默认会加载在L2区域,但若是用户程序cmd文件中指定某些段放在L2,会使得IBL在搬运用户程序时,可能会覆盖掉IBL代码。因此将IBL加载区域放在相对L2不那么重要的多核共享缓存MSMC区域中,会更好一点。要注意在用户程序的cmd文件中,MSMC段不要包括IBL区域。

  • 修改ibl\src\make\ibl_c665x\ibl_common.inc文件,MEMORY中的值
 MEMORY
{
	TEXT_INIT :  origin = 0x0C000000, length = 0x4200
	TEXT      :  origin = 0x0C004200, length = 0xbe00
	STACK     :  origin = 0x0C010000, length = 0x0800
	HEAP      :  origin = 0x0C010800, length = 0x8000
	DATA_INIT :  origin = 0x0C018800, length = 0x0400
	DATA      :  origin = 0x0C018c00, length = 0x2c00
	CFG       :  origin = 0x0C01b800, length = 0x0300
	STAT      :  origin = 0x0C01bb00, length = 0x0200

	LINKRAM   :  origin = 0x0C01be00, length = 0x0200
	CPPIRAM   :  origin = 0x0C01c000, length = 0x0200
	PKTRAM    :  origin = 0x0C01c200, length = 0x0800
}
  • 修改ibl\src\make\ibl_c665x\ibl_init_image.rmd,ROM中的值
ROMS
{
	ROM1:  org = 0x0C000000, length = 0x20000, memwidth = 32, romwidth = 32
	files = { ibl_le.b }
}

修改用户程序烧录位置

  • 修改ibl\src\util\iblConfig\src\device.c第1242行代码。
	ibl.bootModes[0].u.norBoot.bootAddress[0][0]	= 0;		/* Image 0 NOR offset byte address in LE mode */ 
//修改为
	ibl.bootModes[0].u.norBoot.bootAddress[0][0]	= 0x80000;		/* Image 0 NOR offset byte address in LE mode */ 
//0x80000意为用户程序从flash的0x80000地址开始烧录

创建编译脚本

在boot_loader目录下创建文件SPI_6657_buildibl.sh

cd ibl/src/make
source setupenvMsys.sh
make clean
echo "*******************make evm_c6657_spi*******************"
make evm_c6657_spi
cd ../../../

编译一下看看,所有打印输出重定向至logs.log
在这里插入图片描述
打开看看,没啥问题,生成的文件为spiRom.bin和spiRom.ccs
在这里插入图片描述

参考文章

TMS320C6678开发笔记—IBL编译与分析
IBL build problem

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值