2022年11月5日(纠正与补充)
- 无论是生成Dat文件还是生成Bin文件都必须使用TI官方的“Hex6x.exe”软件。
- 关于该“Hex6x.exe”软件的使用,请参考:SPRU186W 第十一章 Hex Conversion Utility Description。
- “Hex6x.exe”软件,需要 直接参数或者RMD文件,将“.out”文件转换成ASCII编码的文本文件。生成的文本文件的内容是用户程序编码中的各个段落。
- 在我们使用CCS烧录程序的时候,可以选择烧录bin格式的程序或者是dat格式的程序。在这两者中,bin文件的空间大小更小。
- 本文8月1日的内容,关于生成bin文件的方式存在错误。在此纠正。
1. 生成bin格式的文件
- 之前的理解都是,bin文件是按照地址位置摆放数据,但凡两个段之间相距很远,就会填充很多的0。这种生成的方式会导致bin文件很大(100M+)。
- CCSv5下载使用的bin文件,是将段追加在一起,每个段前,记录这段的大小以及段的存放位置。
1.1 步骤
(1)使用hex工具,将out文件生成“btbl文件”(文本文件)。
(2)使用“btoccs”工具,将btbl文件中的字符合并成4字节16进制的数(文本文件)。
(3)使用“ccstobin”工具,将4字节16进制的字符数转换成真实数值,以二进制文件存放。
- Hex工具是不开源的,而btoccs和ccstobin是开源的。
2022年8月1日
参考链接:
知乎讲解《CCS如何生成hex和bin文件》
官网资料《构建前和构建后的步骤》
1. 生成BIN文件
1.1 ofd6x工具
将.out文件转换为一个xml文件。
ofd6x -x --xml_indent=0 --obj_display=none,sections,header,segments Card6678_C0.out > ofd_123_456_789.xml
1.2 mkhex4bin工具
为 TI的十六进制转换工具hex6x 创建一个文件。
该文件可用于将xml文件转换为一个临时文件。
mkhex4bin ofd_123_456_789.xml > hexcmd_321_432_658.tmp
1.3 hex6x工具
十六进制转换实用程序。将来自mkhex4bin的临时文件和.out文件一起,转换为一个bin文件。
hex6x -q -b -image -o Card6678_C0.bin hexcmd_321_432_658.tmp Card6678_C0.out
2. 生成DAT文件
参考文献:
Hex6x工具介绍
全部工具链介绍
bootloader搬运代码与下载
ti官网提问:
在nysh.spi.map中设置spi 启动参数表
- 全过程示意图
2.1 hex6x.exe
- 详情参考文件《SPRU186W.pdf》Chapter 11 Hex Conversion Utility Description。
- 根据 上述文件,可以知道正确用法是: hex6x.exe filename.rmd 。
- cmd类似rmd文件,指导解析生成二进制文件时候的类型和方式。
- 如何写CMD文件,如下图所示,8个CMD文件仅仅是输入输出的文件名不同,其他的配置皆相同。
- 即使是下载的C6657双核的命令文件,也只是文件名改变。
2.2 mergebtbl工具
- 合并多个btbl文件。将多个文件中的内容拼接在一起,最后以0x00000000结尾。
- 删除辅核的的入口地址 _c_init00。(1) 在core0程序中人工将辅核地址写到对应的MAGIC_ADDRESS。(2) 或者,将各个辅核入口地址看做是一个只有4字节的段。以段的形式,添加在.btbl文件的末尾。如下图所示。
2.3 AddDdrTable6678
-
将DDR3的初始化配置添加到文件中。按照段的形式,添加在core0的入口地址之后。
-
DDR配置信息,一共是4长度+4地址+112数据=120字节。
-
长度数值:0x00000070=112字节。
-
地址数值:0x00873500。如下图所示,0x00873500为DDR的配置表地址。
-
引导加载程序bootloader在器件初始引导期间,使用 L2 SRAM 的一部分(起始地址 0x0087 2DC0 和结束地址 0x0087 FFFF)。
-
以段的形式,将DDR3的配置信息,写在文件中。设备上电启动之后,由搬运代码将DDR3的配置写到L2SRAM中的0x00873500地址处。引导程序会使用该处的配置,用来配置DDR3。
-
关于DDR3的112个配置数据,是根据titool.h中的 BOOT_EMIF4_TBL_T 定义的。这些配置除前四个之外,都是DDR中的寄存器。
-
目前:configselect=0x024280F5 尚不知道从何而来。
-
附加内容:DDR3初始化代码工程示例
-
《DDR3初始化-SPRABL2A》
2.4 b2i2c工具
- b2i2c.exe 将 .btbl文件中的内容取出,对内容进行字节分割,按照124字节写入一个block块。
- 在block块的开头,添加2字节的长度信息和2字节的校验和。一个块为 2+2+124=128字节(0x0080)。
- 在btbl文件中的数据是以ACII码形式存在。将数据转化为十六进制流,再做分割块的操作。
- 最后将十六进制流数据,再转回ASCIIHex格式,写入.i2C文件。并添加开始符号,结束符号以及$AXXXX。
- 下图略过了AddDdrTable6678的过程。
2.5 b2ccs工具
- b2ccs.exe工具将.i2c文件转换为CCS可识别的文件格式.ccs。并添加ccs header。
- 先将文件由ASCIIHex转换为十六进制流。每4个字节转换为一个32位数,作为1行到.ccs文件。
- 在.ccs文件的最前面一行,添加:1651 1 10000 1 1c5f0。
- 1651:固定标示符
- 1:数据格式
- 10000:基地址
- 1:页类型(0-数据 1-程序)
- 1c5f0:数据长度。(116208行数据+1行开头)
2.6 romparse工具和qfparse工具
- 在.ccs文件中,添加boot启动参数表。一共256行,256x字=256x32位数据。
- 参数表的定义在titool.h中。
- 如果使用romparse工具进行boot参数表的添加。需要修改nysh.spi.map配置文件。如下图所示。
- bootmode等于50而不是6,是因为这里的数值用RBL内部使用的扩展引导模式值。(可以理解为,原本的序号6,在去掉一个no boot模式后变成5。对每个序号索引扩大10倍,方便以后中间穿插拓展RBL的引导方式,因而SPI启动模式在RBL中变成了50)
- 如果使用qfparse工具,这个是个人编写的非官方工具。需要配合ParaTable.map文件。在这个map文件中,直接列出了256行参数字,直接修改其中的数值并不是很方便。如下图所示。
- 添加完参数表之后的文件如下图所示。长度有原先的0x1c5f0变成(0x1c5f0+256 = 0x1c6f0行)。
- 起始地址0x8000000。
2.7 byteswapccs工具和modify工具
- 器件是小端模式。低字节在前面。需要将每行4字节的数据,按照字节进行翻转。即0x87654321变成0x21436587。
- 文件的第一行信息不变。
- 官方工具是byteswapccs,个人工具编写的是modify。转换之后得到的新文件为.dat文件。