C6000系列的DSP推出来已经有好久了,接触6713型号的DSP也很久了,但由于以往一直都是拿来主义,真正等到自己用的时候,还是存在诸多的细枝末节没能掌握,尤其是最近在实现的通过MCU来引导DSP启动,甚至想要通过MCU来远程的实现DSP程序的更新 功能的时候就碰到了一些问题,这里将整个的实现过程记录一下,以描述这段时间的工作情况。
1、C6713DSP的HPI接口
DSP的HPI接口是一个16位的并行接口,可灵活地和主机Host相连接,主机通过HPI接口可以直接访问DSP的存储空间(包括映射的片内外设、外部内存空间等),从而实现主机与DSP之间的数据传输。不过作为一个并行端口,只有主机才拥有对该端口的控制权(其实所有的HPI接口都一样,作为从机的芯片本身是不具有对该端口的控制权的,只有对向 Host才拥有控制权)。C6713 DSP的HPI接口为DSP内部提供了标准32位的数据接口,而对外部主机,则是提供了一个16位接口,所以对外部主机而言,必须执行2次的16位操作才可以(相当于一次高半字、一次低半字)。这些操作都是通过3个寄存器(HPIC、HPIA、HPID)来完成主机和DSP的通讯的。
2、C6713 DSP的Boot介绍
6713 DSP提供了至少3中的Boot方式(主机boot、仿真器、外部rom),本文只介绍如何实现Host boot的方式,有关外部ROM Boot的方式,可以参考CSDN 其他大神的文档,当然这篇文档也是有参考其他大神的内容的。
主机通过HPI进行程序下载的过程如下:首先进行芯片的复位操作,在外部复位(reset管脚)完成时候,检测芯片的Bootmode管脚(HD3和HD4),从而来确定具体对应的是哪一种Boot方式,(当然也可以在复位之前就设置好芯片的boot方式),当外部复位完成,此时芯片(称之为CPU)的内核还处于复位状态,其他外设已经处于激活状态;引导过程中,外部Host通过HPI接口来初始化CPU(包括PLL、存储空间,也包括对EMIF等的初始化);主机完成所有的初始化工作后,装载对应的镜像文件到CPU对应的内存空间(此处涉及到ccs直接编译得到的out文件、out文件的coff格式、out文件的转码等操作),当所有都完成后,主机通过向HPIC寄存器的DSPINT位写1,来使得CPU的内核唤醒,此时CPU退出复位状态,开始从默认的0地址开始执行。
3、主机引导的程序设计
在进行dsp的程序开始时,一般采用CCS IDE,其编译 得到的文件为out文件,这是一种模块化的文件格式——coff格式。程序中的代码和数据是以段的形式组织存放。要想把这种文件通过主机下载到CPU中,必须对coff文件进行解析,确定下载的地址从、长度、内容等信息。
3.1 coff文件格式
coff文件是由文件头、段头、符号表以及段数据等数据结构组成。文件中包含了段的完备信息,如段的绝对地址、段的名字、段的各种属性、段的原始数据等。coff文件的具体结构如下图所示
其中段落头可以有多个,其他类型的段只能有一个。文件头用来保存coff文件的基本信息,如版本ID、目标器件的ID、创建的时间、各个段的位置、段落的数目等。可选文件头用来保存在文件头中没有描述到的信息,包括数据段、代码段大小、入口地址、开始地址等信息。段落数据是coff文件中最大的数据段,每个段落真正的数据就放在这个位置。
文件头的结构为:
段落头的结构为:
知道了coff文件各个部分的结构定义,就可以编写主机的引导程序了。在这里,将coff文件按照格式解析成最终用于下载到cpu的可用信息,采用了专门的工具,最终得到中断向量表段、代码段、数据段等内容。【解析的工具软件,首先将coff文件中的文件头读出,确定段落头的数目,然后按照顺序将段落头的信息读出,根据信息中的段落标志来确定是否是有用的段,如果是有用段,则根据段数据偏移、虚拟地址、段长度这些个信息,将代码提取出来以备下载使用,下载时只需要下载有用的段就可以,如text段、data段、hwi-vet段等】。
3.2 主机与cpu的交互
主机与CPU之间的交互,通过程序实现,包括读和写两个过程,对应的函数命名为:write-to-dsp-hpicad(ctl1,ctl0,data)和read-from-dsp-hpicad(ctl1,ctl0,data)这样的方式来进行读写操作。
部分操作流程为:resetdsp() -> initdsp()->downloaddsp()--> rundsp(),这样的操作过程。
①resetdsp,涉及到对reset管脚和bootmode管脚(HD3、HD4)的设置;
②initdsp,涉及到对dsp的PLL、EMIF等的设计,相关的设置步骤可以参考TI给出的参考文档;
③downloaddsp,就是将coff文件中提出出来有用的信息下载的过程,涉及前述的write和read两个操作函数;
④rundsp,涉及到对DSPINT信号的操作,需要通过HPIC寄存器,将DSPINT位置1,来使DSP正常工作。
部分参考的TI文献,如下:没看到有哪里上传的地方,只能给出链接了。
①creating a dsp boot image for host boothttps://www.ti.com/lit/an/sprab60/sprab60.pdf?ts=1617851666464&ref_url=https%253A%252F%252Fwww.ti.com%252Fsitesearch%252Fdocs%252Funiversalsearch.tsp%253FsearchTerm%253Dhpi%2Bboot
②spra512-implementing the tms320c6201/c6701/c6211 hpi boot processhttps://www.ti.com/lit/an/spra512/spra512.pdf?ts=1617851904044&ref_url=https%253A%252F%252Fwww.ti.com%252Fsitesearch%252Fdocs%252Funiversalsearch.tsp%253FsearchTerm%253Dspra512
③SPRU578C TMS320C6000 DSP Host Port Interface (HPI) Reference Guide-https://www.ti.com/lit/ug/spru578c/spru578c.pdf?ts=1617851971308&ref_url=https%253A%252F%252Fwww.ti.com%252Fsitesearch%252Fdocs%252Funiversalsearch.tsp%253FsearchTerm%253DSPRU578C