1、GPIO配置
要使用bootloader首先需要配置GPIO电平来设置boot方式,我手上的两块板子分别使用的是I2C EEPROM与EMIF
2、EMIF和I2C boot简单分析
2.1 EMIF boot方式
- 并行EMIF模式开始读取位于CE1空间的word地址200000h处的引导表。
- 在此引导模式下,IO4将在启动过程的开始时降低。在启动表中执行可编程延迟特性时,IO4会升高。当延迟完成时,IO4将再次降低。在引导加载结束时,IO4会升高,DSP从入口点地址开始执行。IO4对于内存来说不是必需的,但是如果其他源正在为EMIF生成数据,那么它可以用作握手信号。
下图是TI对于此方式的解释
2.2 I2C EEPROM boot方式
- 内存设备符合飞利浦I2C总线规范v2.1,从地址要为50h。
- 内存设备使用两个字节(最多64K字节)来进行内部寻址。(经我查阅资料以及尝试后确定5509A的bootloader只能搬运16Kb容量)
- 引导加载程序在随机读取操作期间将GPIO4设置为低,以此标志i2c启动模式的开始。然后在剩余的读取操作期间将GPIO4设置为高。在引导过程结束时,I2c模块仍然启用(但没有总线活动),直到用户的应用程序关闭该模块。
3、引导表(boot table)
3.1 了解引导表
程序入口地址是引导表加载结束后,用户程序开始执行的地址;寄存器配置数目决定了后面有多少个寄存器需要配置;延时标志为0xFFFF时,延时才被执行,延时长度决定了在寄存器配置后多少个CPU周期才进行下一个动作;段长度、段起始地址和数据则为用户程序中定义的各个段的内容,并且可以重复添加,最后0x00000000作为引导表的结束标志。
从引导表的格式可以看出:
-
a.引导加载程序首先读入双字程序入口地址
-
b.然后读入需要修改的寄存器数,接着是寄存器地址以及赋值(可重复)
-
c.再读入段字节数、段起始地址以及段内容(可重复)
-
d.引导表以读入双字的0值为结束,读完引导表后跳转到加载程序入口执行。
不论以何种方式加载,只是读入的方式不同,引导表的格式不同。
3.2 创建引导表
怎么创建引导表呢,用ti提供的hex55.exe工具(ccs里面有)来创建,将ccs最终编译的Test.out文件、hex55.exe以及Test.cmd文件放在同一目录下,通过DOS命令调用hex55.exe即可完成.out到hex格式的引导表文件的转化。
DOS命令实例(注:可以在windows的控制台使用,也可以编写.cmd(如取名run.cmd)文件来使用)
hex55.exe Test.cmd /* 说明使用hex55.exe软件调用Test.cmd命令 */
烧写到flash里的Test.cmd文件的实例:
-Test.out /* 输入的.out文件 */
-map Test.map /* 生成.map文件 */
-o Test.hex /* 输出.hex文件 */
-memwidth 8 /* 设置存储宽度为8bit */
-e 0x3e570 /* 指定入口点地址(实际测试发现一般不用指定,生成文件时会自动指定) */
-boot /* 说明创建boot文件格式 */
-5510:2 /* 生成55xxboot文件格式 */
-serial8 /* 使用用串行加载方式(8位) */
-b /* binary格式 */
-reg_config 0x1c00,0x02b7 /* 在0x1c00寄存器写0x02b7 */
-delay 0x100 /* 延迟100CPU时钟周期 */
ROMS
{
PAGE 0 : ROM : o=0x000000, l=0x10000
}
SECTIONS
{
.vectors boot `/*配置用于由片上引导加载程序加载的部分*/
.text boot
.cinit boot
.const boot
}
- 关于DSP程序编写时的内存分配cmd文件以及烧写到Flash的cmd文件里的内存分配项,推荐看三个文档以深入了解,下载链接:http://dl.21ic.com/download/cmd-312538.html
- 《CMD文件的原理》玄德(网名)编写
- 《DSP与CMD文件的整理》玄德原创 阿狸整理
- 《TMS320C55x Assembly Language Tools User’s Guide》TI文档
点击运行run.cmd则会生成Test.hex和Test.map。
4、二次引导的实现
4.1 概念
所谓二次引导,就是通过DSP内部ROM固化的bootloader,引导一个用户编写的引导程序,其功能和bootloader功能基本相同,然后通过二次引导加载程序将最终需要执行的程序加载到DSP中,从而实现更加灵活的程序加载 。
4.2 为何使用二次引导
- 原因1:5509A本身的bootloader只能寻址16Kb的字存储空间,对超过16K字长的引导表,引导程序无法加载(主要原因)。
- 原因2:对于有些串行加载方式,5509A本身bootloader的时钟频率过低,加载程序耗时过长。
- 原因3:为了保密性需求,往往会将主功能程序进行加密,那么就需要二次引导程序提供解密的作用。
4.3 实现
5、程序加密简述
- 方法1:对程序的初始保护。即把最终运行的程序代码写入24LCXX芯片之前,对源代码进行加密处理后再存储,DSP的一次引导过程只加载解密程序,二次引导则加载已经加密的源代码,从存储密钥的地方取出密钥,加载结束和完成解密后再继续运行,由于只用到1个密钥,破译者可以通过物理方式捕获通信数据,很容易得到密钥和解密算法
- 方法2:基于数据驱动的连续保护。它的处理对象是一些重要参数和变量,通过“加锁”,让他们一直以密文形式存在于程序中。只有需要使用这些数据时,才取出密钥进行解密;使用结束后,仍旧“加锁”保护,使之仍然是密文形式
- 方法3:对于DSP源代码加密,可以利用3DES、Geffe发生器和MD5等算法,并根据DSP运行闲余时间选择密钥个数和加密复杂程度。
参考资料:
Using the TMS320VC5503/C5506/C5507/C5509/C5509A Bootloader
TMS320C55x Assembly Language Tools User’s Guide
Developing a CCStudio 2.0 DSP/BIOS Application for FLASH Booting on the TMS320C5402 DSK
hex6x.exe的使用: https://blog.csdn.net/MDQAQ/article/details/53784851
TMS320VC5509A系列DSP的程序自举引导和加密方法: https://wenku.baidu.com/view/f5f2c0f4ba0d4a7302763a25.html
VC5509A二次引导问题: https://www.amobbs.com/thread-4922783-1-1.html