对于单核DSP的BOOT,相对简单些。一般将可执行代码存放在ROM或者FLASH里面。 比如ROM BOOT模式,EDMA自动从CE1对应的存储器空间拷贝1KB的代码到DSP内部SRAM地址0x00000000,在EDMA工作期间,CPU停止工作,拷贝完成后,CPU开始运行。大家会问,如果代码大于1KB怎么办?其实这个问题非常简单。前面我们提到的,EDMA拷贝1KB的代码,那么大家是否想过,同样是利用这个拷贝1KB的代码的过程,是否可以完成大于1KB的代码的自启动呢?答案当然是肯定的。其实在其他的MCU嵌入式中早就使用了。就是利用这1KB的代码,将其设计为把FLASH中的代码全部拷贝到内部高速存储器,然后跳转到C语言环境初始化程序的入口处“_c_int00”,这样启动就完成了。那么我们把这1KB的代码叫做第二级启动加载程序。
对于多核的C6678的DSP来说,就没这么简单咯,下面我来一一介绍。
大家知道,在C6678的内部,固化了一段程序,也就是RBL程序。关于RBL的细节,感兴趣以及有基础的朋友,可以参考文献:
http://www.ti.com/lit/ug/sprugy5c/sprugy5c.pdf KEYSTONE架构的BOOTLOADER用户指南,在看懂这篇指南前,现需要熟悉C6678的数据手册。
当DSP在上电复位后,RBL负责根据其配置将应用程序从慢速的外部存储器比如FLASH等或者是外接的主机或者网络等等地方搬到内部的高速存储器中运行。
从C6678的数据手册(SPRS691E)中得知,表示RBL在DSP的ROM中的位置,其起始地址是0x20B00000。
DSP的BOOT过程,分为主机BOOT和存储器BOOT两种形式。顾名思义,主机BOOT,就是把DSP配置为从模式,DSP等待外部主机传送代码到其内部高速存储器执行。存储器BOOT模式呢,以DSP为主,DSP自动将外部存储器中存放的代码搬到其内部高速存储器并且运行。
那么我们就看看,C6678的RBL为我们准备了多少种BOOT模式以及不同的BOOT模式所支持的外设情况。这一点非常重要,在做系统设计的时候,不能掉以轻心。因为一个小小的疏忽,可能导致你的系统设计满足不了客户的需求等等。
以下的内容,是根据TI的多种资料由我个人进行整理,完整内容请参考官方文档。
(1)EMIF16的BOOT模式:我们的用户代码存放在16BIT宽的外接存储器中,而且是异步加载。
(2)SRIO的BOOT模式:这是前面说的主机BOOT模式。也就是说外面的主机通过串行高速接口加载用户的程序,这时候有两种选择。一是使用MESSAGING模式,二是使用Direct IO 接口模式。
(3)以太网接口BOOT模式:这也是主机BOOT模式。外部主机通过以太网接口加载用户程序。这里有个问题需要注意:以太网通信是以数据包的形式进行,数据包***由核心参考时钟或者SerDes参考时钟驱动 。
(4)PCIe的BOOT模式:这依然是主机BOOT模式。外部主机通过PCI 接口加载程序到内部高速存储器运行。
(5)主I2C的BOOT模式:这是属于存储器BOOT模式。而且DSP的I2C是主,外部I2C的存储器是从。用户程序存放在外部从I2C的EEPROM中,DSP以BOOT表格式中数据块的形式加载。
(6)从I2C的BOOT模式:这是属于主机BOOT模式。DSP的I2C是从,外部I2C主机发送用户程序到DSP的存储器。同上面的模式一样,数据格式需要满足DSP的BOOT表的格式。可能很多的朋友会问,这种BOOT模式在哪里会用到?在单片的I2CEEPROM对应于多片DSP的场合下,用这种BOOT模式,可以大大节省BOOT时间。在通信或者图像处理中常常用到。
(7)SPI的BOOT模式:这是属于存储器BOOT模式。DSP通过SPI外接的FLASH读入用户程序,同样数据格式也必须满足DSP的BOOT表的格式。
(8)HYPERLINK BOOT模式:这是被动的主机BOOT模式。主机负责配置存储器同时加载用户程序并且直接BOOT DSP。
那么是如何触发这些不同的BOOT模式呢?也就是说,DSP如何识别该用哪一种模式BOOT呢?
BOOT过程取决于两个因素:一个就是通过DSP的硬件引脚的高低电平配置决定,另外一个就是触发BOOT过程的复位机制。
|