2.3.1 C6416的FLASH启动方式
C6416的启动方式是由硬件逻辑来决定,通过EMIFB地址总线上的BEA[19:18]两个管脚的上拉、下拉来决定引导配置。[0,1]:主机引导(HPI或PCI);[1,0]:EMIFB 8bit宽FLASH引导。
当选择FLASH启动时,C6416的引导逻辑决定了,从FLASH的0地址开始,将会拷贝1 KB的数据到C6416片内RAM的0~1KB位置,然后C6416的PC指针将从片内RAM的0地址开始运行。那么对于所要启动的应用程序的大小一般都是大于1 KB,因此可以利用二级引导来完成C6416的程序加载。所谓二级引导,是指在应用程序的工程中,写一段bootload程序,该程序主要完成EMIF接口的配置,和应用程序从FLASH向C6416存储器搬移的工作。程序应当利用.cmd文件,来为bootload代码分配存储空间,其空间地址范围应该是0~1 KB。同时烧写bootload到FLASH时,应当烧写到0~1 KB的空间范围内。当系统上电,FLASH中的0~1 KB数据自动搬移到C6416片内RAM 0~1 KB,然后PC指针从0开始运行,此时EMIFA和EMIFB将被配置,允许C6416可以访问片外RAM和片外FLASH;然后完成从FLASH到存储器(片内或片外RAM)的代码段、数据段数据搬移;最后设置PC指针跳转到应用程序的入口地址c_int00来初始化C语言环境,从而开始运行应用程序。Bootload程序应该用汇编来完成,因为它是在C语言环境初始化之前被执行,此时C6416是不识别C语言的语言符号的。
2.3.2 C6416从机的启动模式设计
编写一个C6416的程序,该程序完成FLASH到片外SDRAM的数据拷贝。而拷贝的数据则是C6416具体要完成的业务任务。同时该程序包含了Bootload程序,用来完成上电后的1 KB FLASH数据搬移。见图6。
第一步:当C6416上电后,首先自动完成A搬移操作,“Bootload程序”将被搬移到C6416片内RAM的0起始地址,后开始运行该段代码,该段代码是利用汇编语言编写,其在C语言库初始化前被执行;第二步:“Bootload程序”的运行将会配置C6416的EMIF寄存器,使能片外SDRAM,同时使B搬移操作完成:“程序选择搬移代码”将被搬移到C6416片内RAM,并从程序入口地址开始执行该代码段;第三步:“程序选择搬移代码”的执行将对业务代码进行选择,查看需要加载“业务代码1”还是“业务代码2”,把选择的业务代码搬移到片外SDRAM中,完成C搬移操作或D搬移操作,然后从程序入口地址开运行,从而被选中的业务代码将被执行。
其中“程序选择搬移代码”是一段由C语言编写的C6416启动辅助代码。该段代码主要完成了业务代码的选择和搬移工作。应用用户可以在C6416片外FLASH中存放多个业务代码,通过串口、PCI总线等接口向C6416发送业务代码选择命令,在“程序选择转移代码”中,对该命令进行分析,根据协议选择所指定的业务代码。当选择了所需的业务代码,就需要完成代码的FLASH到C6416存储器的搬移。由于业务代码是利用上述的hex6x.exe和hex2aray.exe工具所生成的16进制数据,其包含了业务代码各个段的起始地址、段长和段数据,因此需要利用“程序选择搬移代码”来完成业务代码的解析,并把各个段从FLASH搬移到指定的C6416存储空间中。最后把程序指针指定到程序的入口地址,即可运行业务代码。该启动方式的设计有助于在实际应用中针对不同的设备和需求选择不同的业务应用代码,同时也有助于FLASH中的业务代码的更新。
2.3.3 利用PCI总线更新FLASH中的业务代码
当成型的设备需要对固化在DSP外围FLASH中的业务代码进行更新时,应该在DSP上运行FLASH烧写程序,把业务代码烧写到FLASH中。本设计利用PCI启动方式,通过上位机来启动C6416运行FLASH烧写程序,完成业务代码的FLASH烧写。利用上述的C6416从机启动模式,可以很容易的发现,当需要完成FLASH软件更新时,只需要更新“业务代码”即可,而“Bootload”和“程序选择搬移代码”不需要变更。如此业务代码更新就很方便,因为其只需要考虑程序应用上的变换,而不需要过多的考虑程序代码、数据段地址分配的问题,更不需要考虑C6416特有的仅1 KB数据上电自动搬移所带来的麻烦。具体步骤如图7所示。
第一步:根据C6416外围所选的FLASH特性,来编写其代码烧写程序。在该程序中把需要更新的业务代码作为常量数据包含到工程中的eonst段中。
第二步:利用hex6x.exe和hex2aray.exe工具来将FLASH烧写程序转换成C语言可以识别的16进制数组数据;第三步:选择C6416为PCI主机启动模式,主机利用PCI总线将转换为16进制的烧写程序数据搬移到C6416片内存储器;第四步:主机把C6416 I/O空间寄存器HDCR.DSPINT位置1,使C6416退出复位,开始运行。
当C6416运行了烧写程序,便把const段中的待更新业务软件数据烧写到FLASH指定的地址上。如此便完成了FLASH的业务软件的更新。
3 结语
本文介绍的利用PCI总线更新DSP业务系统应用程序的设计,完全摆脱了JTAG口的制约,利用具有高速数据通信特性的PCI总线,针对包含外围FLASH和不包含外围FLASH的DSP业务系统,实现了应用程序的更新。
特别对于含有外围FLASH的DSP业务系统,本文设计的DSP启动方式和FLASH应用程序更新流程,能高效地完成应用程序的更新,同时实现了DSP启动时应用程序加载的选择。