编译IBL
编译前的工作
遇到一块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