基于TMS320C6455的DSP加载模式研究

引言

        数字信号处理技术广泛应用于雷达、通信、图像处理等领域,其中有些信号处理运算量很大、算法结构复杂,且要求高速实时、高性能、灵活地完成各种处理任务。近年来,以数字信号处理器(DSP)为基础的通用信号处理模块[1~5]的研制受到人们的重视,它的研制成功满足了信号处理系统实时性和通用性的要求。由于在DSP程序运行前,都有程序加载的问题,尤其当信号处理模块由多DSP构成时,要充分考虑到上位机与DSP间、主DSP与从DSP间的加载关系,DSP也提供了多种灵活的加载方式以满足应用要求。因此在设计通用信号处理模块前,有必要研究DSP的多种加载方式[6~8]。

        TMS320C6455是世界上最大的DSP(数字信号处理)芯片商—TI(德州仪器)新推出的高端DSP芯片,也是目前单片处理能力最强的定点DSP。与另一DSP芯片商ADI的高端产品TigerSHARC系列TS201相比:TS201时钟频率为600MHz,16位定点处理能力为4800MMAC/s;TMS320C6455时钟频率为1.2GHz,16位定点处理能力为9600MMAC/s。可见,单片DSP的定点处理能力,TMS320C6455强于TS201。另外,ADI逐渐把精力投入到Blackfin系列DSP[9],TigerSHARC系列DSP不再升级;TI却仍在不断打造自己的高端市场,TMS320C6455后续产品也在不断跟进。ADI的TigerSHARC系列DSP拥有独特的link口,适合于构建多处理器平台。在推出TMS320C6455以前,TI的DSP单片处理能力较强,但是芯片间的数据传输问题没有解决,构建多处理器平台比较复杂[10]。但是新推出的TMS320C6455,采用了Serial RapidIO接口技术,互连速率每秒高达25Gbits,很好的解决了芯片间的数据传输问题,搭建多处理器平台变得简单方便。RapidIO互连规范已成为ISO/IEC DIS 18372标准,RapidIO Trade Association已经囊括了世界主要半导体芯片供应商、通信系统OEM和计算机系统制造商。link口虽然也可以实现高速数据传输,但link口是ADI自定义总线。所以link口应用范围狭窄,而RapidIO技术将有广阔的发展前景。可以预见,TMS320C6455(以下简称C6455)将在雷达、通信、图像处理等领域得到广泛应用。基于C6455的通用信号处理模块也在研制之中。本文在完成C6455评估板的基础上,深入研究并实现了C6455的多种加载(引导)模式。这些模式几乎囊括了目前DSP的所有加载方式,也可作为实现其他DSP加载的参考。

1、加载模式分类

         在TMS320C6455的地址空间0x00100000到0x00107FFF间集成了32K的内部ROM。此ROM中固化了一段叫作“boot loader”的引导代码,它的主要作用是在DSP上电时,对DSP进行必要的配置,以便辅助HPI/PCI/SRIO等接口进行加载;另外,它还可以将代码从外部存储器读到内部L2 SRAM,以完成代码加载。

         TMS320C6455复位和上电时的引导模式主要有:NO BOOT模式、主机(HPI/PCI接口)引导模式、FLASH引导模式、主I2C引导模式、从I2C引导模式、SRIO引导模式。采用哪种引导模式,由复位或上电时采样管脚 来决定。

2 数据格式转换及boot table

        用TI的编程工具CCS(Code Composer Studio)编译连接生成后缀为.out可执行文件,此目标文件格式被称作通用目标文件格式(COFF)。COFF按照模块化思想对程序进行管理,它的最小单位称为段(section)。段是占据一个连续空间的代码块或者数据块,与其他段一起在存储器映射图内。但各个段是分开的,各有特色。对于C语言文件,编译器生成的代码段分配在.text段中,全局变量和静态变量分配在.bss段中,而局部变量或寄存器变量分配到.stack段,还有其他段和自定义段,可以查询TI的有关文档。

        连接器生成的可执行COFF文件(后缀为.out),含有一些定位符号和文件头等信息,这些信息能够被仿真器识别,仿真器可以从COFF文件中提取有用的程序,并把提取的程序加载到DSP的L2 SRAM。 但是,如果我们采用FLASH、PCI或SRIO等加载时,COFF文件中的一些信息不能被识别,而且由于含有的无效信息较多,COFF文件比较大,因此,我们首先应该对COFF文件进行提取和精简处理。这就需要用到TI提供的十六进制转换工具(Hex6x.exe)。十六进制转换工具可以把COFF文件转换成以下文件格式:ASCII-HEX格式、扩展的Tektronix(泰克)格式、Intel MCS-86(英特尔)格式、Motorola Exorciser(摩托罗拉-S)格式、Texas Instruments SDSMAC(TI-Tagged)格式。
Boot table主要由三部分构成,如图1所示。第一个32位数据是程序的入口地址;最后一个32位数据0x00000000,它是boot table的结束标志;中间部分是主体部分,由程序中的若干section构成。所有的section都有一个统一的结构,以section i 为例,第一个32位数据是此section的大小,以字节为单位;第二个32位数据是此section在L2 SRAM中的存放首地址;剩下部分是此section的数据内容。



图1  boot table



3、FLASH加载

         对于TMS320C6455来说,固化在DSP内部ROM中的“boot loader”会在系统上电时将FLASH ROM的前1K空间的内容复制到片内L2 SRAM的0x800000到x8003FF地址空间,复制完成后DSP会从0x800000地址处开始运行。因为需要搬到内存中运行的应用程序的向量表、初始化段等往往超过1K大小,为了能在系统上电时自动引导应用程序运行,就需要在引导的1K代码中编写引导代码,此引导代码的工作就是把待加载的代码复制到L2 SRAM中,复制完成后跳转到程序初始化入口处(_c_int00),从而实现二次加载。

        FLASH引导模式需要进行二次引导,因此需要编写二次引导代码。此二次引导代码实现三个功能:配置EMIFA端口为异步读模式,总线宽度为8-bit;将FLASH空间起始地址0xB0020000的代码装载到L2 SRAM中;拷贝完成后,程序跳转到程序初始化入口处(_c_int00)。假设待加载程序为跑马灯测试程序。在开发板上通过DSP的GPIO控制小灯的熄灭,当GPIO输出电平为高时,小灯被点亮,当GPIO输出电平为低时,小灯熄灭。此测试程序控制多个小灯,让其轮流熄灭。测试通过后,生成了myled.out文件,此程序就是待加载到DSP中的程序,首先必须对myled.out文件按照上节所述过程进行格式转换,生成小段模式、二进制形式的boot table。

        因为需要进行二次引导,在上面编写点灯程序时需要把二次引导代码链接进去。此二次引导代码在编译链接时需要被分配到L2 SRAM的0x800000到0x8003FF地址空间。经过转换后,二次引导代码被转换成boot table中的section 1,在此称它为boot section。 为了便于在线烧写,将此boot table做进一步的转换,生成一个新boot table和二次引导代码段。将此二次引导代码段烧写到0xB0000000到0xB00003FF FLASH地址空间,将新的boot table烧写到起始地址为0xB0020000的FLASH地址空间。图2详细阐述了格式转换和烧写流程。


图2  FLASH引导模式下格式转换



        上电后,固化在DSP内部ROM中的“boot loader”将FLASH ROM的前1K空间的二次引导代码复制到片内L2 SRAM的0x8000000到x8003FF地址空间。复制完成后DSP从0x800000地址处开始运行,也就是说DSP运行二次引导,此时,DSP将FLASH空间起始地址为0xB0020000的数据按照section指定的地址复制到片内L2 SRAM,复制完成后,二次引导代码跳转到程序初始化入口处(_c_int00),加载过程结束。

4、主机加载

        主机加载包括HPI和PCI接口的加载。在主机加载模式下,DSP处于等待状态,上位机直接将代码和数据写入DSP内部存储空间,此时不使用boot table。当上位机完成所有代码和数据的写入后,将产生一个主机中断(HPI/PCI),DSP将开始执行加载入的程序。HPI接口的加载很简单,DSP被当作存储器。PCI接口的加载需要考虑地址映射,复杂一些。下面就以PCI接口的加载来说明主机加载模式。

4.1 DSP地址空间到PCI空间的映射

        PCI模块支持主从模式,DSP工作在从模式,上位机对DSP进行读写访问。DSP拥有自己的地址空间,上位机要通过PCI总线访问DSP,必须将DSP空间映射到PCI空间。将DSP地址空间映射到主机空间的过程由以下寄存器来完成:

        PCIBARMSK(PCI base address mask register)指示DSP向上位机申请的窗的大小。上位机上电时,BIOS根据PCIBARMSK的值为DSP分配相应大小的存储块,此存储块相当于一个移动的窗,上位机就是通过移动这个窗来访问DSP的地址空间。

        PCIBAR(PCI base address register)指示窗在PCI空间的起始地址,此处由上位机上电后自动分配。

        PCIBARTRL(PCI base address translation register)指示窗在DSP空间的起始地址,此处的值可以实时修改,从而使窗进行移动。

       DSP有6组这样的寄存器,因此,一次可以向上位机申请6个窗。图3是DSP地址空间向PCI空间的映射图,为了便于理解,假设PCIBAR0MSK申请了1M的窗,PCIBAR0 = 0xD0000000,PCIBAR0TRL = 0x00800000,此时将DSP的地址空间0x00800000到0x008FFFFF映射到PCI空间的0xD0000000到0xD00FFFFF。 当上位机对PCI地址空间0xD0000000到0xD00FFFFF进行访问时,相当于访问了DSP地址空间0x00800000到0x008FFFFF。


图3 DSP地址空间到PCI地址空间映射



4.2 PCI引导过程


图4  PCI引导过程


        BOOTMODE[3:0] = 0111时,为主机引导模式,并且PCI_EN=1时,主机通过PCI接口加载DSP,此时必须使CFGGP[2:0]=0。 图4便是PCI引导过程,上电后,固化在DSP内部ROM的“boot loader”对DSP进行一些必要的初始化配置。

        首先,使能全局中断并且使能PCI的中断管脚,使DSP可以接收来自主机的中断。

        其次,boot loader配置PLL1模块为15倍频,也就是使内核工作在750MHz。而其他引导模式下,没有使能PLL1模块,也就意味着PLL1模块工作在50MHz。上位机访问PCIBAR0,把待加载代码通过PCI总线装载到L2 SRAM中,装载完成之后,上位机访问PCIBAR2,对PCIBINTSET寄存器的DSPINT位写1,向DSP发送DSPINT中断,从而使DSP脱离“挂起(stall)”状态,DSP从地址0x800000处开始执行程序。

        由于基于C程序或基于C语言框架的混和语言程序,系统复位和数据初始化都必须基于C的运行环境,而C运行环境的建立必须由c_int00( )函数来完成,所以在DSP复位后从0x800000处执行指令时,必须首先跳转到C环境的入口点_c_int00(该点在rts64plus.lib库中定义),从而能够调用c_int00( )函数完成建立堆栈,变量初始化和调用Main函数等工作。所以在“加载代码”之后,为了使DSP能够响应DSPINT RESET中断并跳转至_c_int00处“执行代码”,需要编写中断向量表,把中断向量表分配到起始地址为0x800000的空间,并使硬件复位中断的服务程序的内容,是执行跳转到_c_int00。从而当DSP从0x800000处执行代码后紧接着就跳转到程序入口处。

5、SRIO加载

        RapidIO的传输操作是基于请求和响应机制,包(packet)是系统中端点器件的通信单元。图5是一次传输操作的流程图。首先由发起者产生一个传输请求,请求包被传输到相邻的交换器件,从而进入交换结构,通过交换机构这个完整的请求包被转发到目标器件。目标器件根据请求完成相应操作后,发送相应的响应包,经过交换机构传回到发起者。此时一个完整的传输过程完成。


图5  RapidIO传输操作框图



         RapidIO有三个层的协议共同组成,每层协议在包中都有体现。图6给出典型的请求包和响应包的包格式示意图。



图6  请求包和响应包格式


        请求包以物理层字段开始。S位指示这是一个包还是一个控制符号。AckID表明交换结构器件将使用控制符号来确认哪一个包。Prio字段指示用于流量控制的包优先级。

        TT、目标地址和源地址字段指示传输地址的机制类型、包应被递送到的器件的地址和产生包的器件的地址。Ftype和事务指示正被请求的事务。长度字段等于编码后事务的长度。RapidIO事务数据的有效载荷长度从1到256字节不等。源事务ID指示发送器件的事务ID。RapidIO器件在两个端点器件间最多允许256个未完成的事务。对于存储器映射事务,跟随在源事务ID后面的是器件偏移地址字段,用于指示数据的存放地址。CRC为校验码。

        响应包与请求包类似。状态字段指示是否成功完成了事务。目标事务ID字段的值与请求包中断事务ID字段的值相等。

         对于slave来说,调整拨码开关,使BOOTMOOD[3:0]=1x00,此时为SRIO引导模式,SRIO被配置成四个1x端口,由port0对DSP进行加载。另外,差分晶振选择125M的时钟源。上电后,固化在DSP内部ROM的“boot loader”对slave DSP进行一些必要的初始化配置:

       使能全局中断,SRIO的中断管脚被使能,使slave DSP可以接收来自master DSP的中断;
        boot loader配置PLL1模块为15倍频,也就是使内核工作在750MHz;
        boot loader初始化slave DSP的SRIO端口,使SRIO的时钟模块配置成1.25G。

        Master DSP对SRIO端口进行初始化配置,并将时钟模块配置成1.25G。 此时master DSP与slave DSP之间互相发送同步信息,直到链路建立。链路成功建立以后,master DSP执行NWRITE操作,将待加载程序装载到L2 SRAM内存中。代码装载完成后,执行门铃操作,向slave DSP发送中断,slave DSP收到中断后脱离“挂起”状态,从地址0x800000处运行程序,加载过程结束。图7便是SRIO引导过程。



图7  SRIO引导过程



6、I2C加载

6.1 EEPROM读写

         在I2C总线上,每个I2C设备(EEPROM)都有一个相应的设备地址(Device address)。设备地址好比一个I2C设备的ID,用于区别不同的I2C设备。当主设备访问I2C设备时,首先给出设备地址,只有设备地址符合的I2C设备会做出响应,其他I2C设备都忽略此次操作。烧写EEPROM时,支持页方式写和字节写方式。选用字节写方式时,每次只能写一个字节。选用页写方式时,一次最多写256个字节。页写程序编写流程如图8左半部分所示。编程中将DSP配置成主-发送模式,假如向DSP发送128字节数据,首先DSP启动写操作,并查询设备地址,得到EEPROM响应后,向EEPROM发送16bit地址数据,高地址在前,低地址在后;地址发送完毕后,紧接着向EEPROM发送128字节数据。发送完毕后,产生“STOP”,结束本次写操作。


图8  EEPROM读写程序编写流程图


         图8右半部分是EEPROM读程序编写流程图。读EEPROM时,可以批量读,最多可以读64Kbytes。 启动操作后,DSP被配置成主-发送模式,首先查询设备地址,得到EEPROM响应后,向EEPROM发送16bit地址数据,高地址在前,低地址在后。地址发送完毕后,DSP被配置成主-接收模式,由EEPROM将寻址的数据发送到DSP,数据接收完毕后,DSP产生“STOP”,结束本次读操作。

6.2 EEPROM引导准备工作

         加载前都必须进行格式转换,但是EEPROM格式转换更加复杂,仅仅如2节那样生成boot table还远远不够。当选用EEPROM进行加载时,DSP内部固化的boot loader 能接受的代码格式称作“image”文件。它主要由两部分构成:第一部分是boot parameter 文件,第二部分是boot table文件。Boot parameter 文件由26个字节组成,它主要包含配置I2C的一些信息以及从EEPROM哪个地址开始读取boot table文件等信息,表1是boot parameter的构成。

        主要强调以下几点,Device address(LSW)这一项,它指的是boot table文件存放的起始地址。 Device address(MSW)这一项,指的是EEPROM的设备地址。选用EEPROM加载时,没有使能PLL1模块,内核时钟频率为50MHz。 将I2C接口时钟配置成50kHz。 Boot loader上电后先从EEPROM读取boot parameter,根据此文件里的值来配置I2C接口。配置好I2C接口后,从Device address(LSW)指示的地方读取boot table文件。


表1  Boot Parameter


        Boot table文件不能被boot loader识别,还需要进行相应的转换。图9便是生成“image”文件的流程图。为了比较完整的阐述转换过程,下面从CCS生成的.out文件的转换说起。首先调用hex6x.exe将.out文件转换成ASCII文件,在下表中后缀为.btbl文件;紧接着将.btbl文件作拆分,每124个字节组成一组,在每组前面加入四个字节的头文件,此头文件包括此组的数据个数和校验码。头文件和124个字节的数据组成128字节含有校验码的组。最后一组可能不足128字节,因为数据个数可能不能被124整除。这时生成的文件称作.btbl.i2c文件。然后把boot parameter 文件和.btbl.i2c文件组合到一起生成.i2crom文件。此时boot parameter分配到起始地址0x0000处,.btbl.i2c被分配到起始地址为0x420处,然后将其转换成二进制文件.ccs,此文件称作“image”文件,是转换的最终格式。利用在线编程程序将其烧写到EEPROM中。


图9  EEPROM引导模式下的格式转换



6.3 EEPROM引导过程

        将引导模式配置成No boot模式,利用6.1节编写的EEPROM烧写程序将“image”文件烧写到EEPROM中。烧写完成后,再调用读程序将数据从EEPROM中读出来,并且与生成的“image”文件作比较,以验证烧写的数据是否完整无误。如果烧写到EEPROM的数据正确,关闭电源。

        调整拨码开关,使BOOTMOOD[3:0] = 0101,此时引导模式为主I2C引导模式。DSP上电后boot loader使能I2C接口,DSP作为主设备,从EEPROM地址0x0000处读取数据。首先读取的是boot parameter,boot loader根据boot parameter来配置I2C接口的速率。配置完成后,boot loader从EEPROM地址0x420处读取待加载程序代码,将其装载到L2 SRAM中。装载完成后,程序跳转到程序入口处执行程序,加载过程结束。

        如使BOOTMOOD[3:0] = 0110,此时为从I2C引导模式。需要另一I2C设备作为主设备,将程序代码从EEPROM中读出,再写入DSP中。与主I2C引导模式的区别仅是代码写入的方式,不再赘述。

7、结论

        TMS320C6455支持多种加载方式:常规的FLASH加载、主机(HPI/PCI接口)加载,以及特有的RapidIO加载和I2C加载。丰富的加载方式为通用信号处理板的研制提供了便利,例如在通用信号处理板中常常需要使用多块DSP并行工作,此时以FLASH引导、主机或MASTER I2C引导方式加载主DSP,然后以RapidIO或SLAVE I2C方式加载从DSP,实现并行程序加载。
posted @ 2008-11-29 22:27  张卫东  阅读(766)  评论(0编辑  收藏  举报