DSP5509A bootload与二次引导详解

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

posted @ 2019-05-22 16:09  princepeng  阅读(1800)  评论(0编辑  收藏  举报