×
接口总线驱动 > 总线 > 详情

基于PCI 总线的DSP 系统应用程序的更新

发布时间:2020-05-20 发布时间:
|

  0 引言

  在DSP嵌入式业务系统设备中,一般采用片外FLASH自举方式来实现DSP端应用程序的加载和启动。当DSP业务系统需要更新应用程序时,则可通过仿真器连接JTAG 口来控制DSP,完成DSP 外围FLASH 的应用程序更新。然而,对于成型、交货的设备产品,DSP业务系统板上一般不会留有JTAG口,或在机箱中很难插拔仿真器;另一方面,对已交货产品经常插拔仿真器,会对硬件设备有所损伤,使设备硬件处于非控状态。

  如果系统设计使用了PCI作为系统通信总线,则可以通过PCI来完成DSP 业务系统应用程序的更新和加载。本设计以TI公司TMS320C6416T(简称C6416)芯片为例,来说明通过PCI总线来更新DSP系统应用程序的过程;同时本文也设计了一种C6416的上电启动方式。

  1 C6416 的PCI 特性

  1.1 C6416 PCI传输机理

  C6416 片内集成了PCI 的控制器,通过PCI 接口C6416可以完成同PCI总线上其他设备的数据交换。图1描述了C6416的结构框图。PCI接口通过EDMA 控制寄存器可以访问C6416的片内存储器/Cache,或者通过EMIF接口访问片外存储器。

  

  从图1可看出,PCI和EMIF接口都是通过EDMA传输控制器来与L2存储器/Cache联系的。EDMA 传输控制寄存器主要用来控制L2存储器和设备外围间的数据通信,包括传输请求队列、地址产生器等;而通道控制器是用户可编程部分,用户可以设置相应的寄存器,方便的设置数据传输方式(一维、二维)、事件触发选择、传输通道选择等。

  所有的EDMA传输请求可以由L2控制器、HPI/PCI和EDMA 通道三种渠道发出。一个传输请求一旦递交,将通过链接通道移送到传输交叉开关(TC),在这里它将进行优先级设置与处理。请求链为请求提供了一个内在的优先机制。假定一个请求在同一周期中只递交一次请求,那么靠近TC的首先到达,最远的最后到达。

  但进入TC的请求,则会进入传输请求队列,按照队列优先级进行相应处理,如图2所示。

  

  HPI/PCI自动产生传输请求来响应主机。这些请求具有Q2优先级且对用户是不可见的。HPI/PCI递交请求来进行固定模式的单一单元读、写和短数据猝发递增传输操作。

    1.2 C6416 PCI操作原理C6416的PCI操作可以设置为:

  主模式写:DSP主设备通过PCI接口写数据到外部PCI从设备。

  主模式读:DSP 主设备通过PCI接口从外部PCI从设备读数据。

  从模式写:外部PCI主设备通过PCI接口写数据到DSP从设备。

  从模式读:外部PCI主设备通过PCI接口从DSP从设备读数据。

  1.2.1 C6416 PCI寄存器

  PCI接口有以下3种寄存器:PCI配置寄存器,PCI I/O 寄存器和映射在DSP 存储空间的PCI 控制状态寄存器。前两类寄存器只能被外部主机访问,DSP从机是不能访问的;而最后一类寄存器,DSP从机是可以访问的,并利用其来完成PCI通信的控制和操作。

  PCI配置寄存器包含标准的PCI配置信息,包括设备标识,供应商标识,版本等信息,其可以在上电复位时自动访问E2PROM 进行加载或上电复位时可以通过默认值初始化。

  PCI I/O寄存器可以被主机用来对从机进行操作和状态监控。主机通过base2 存储空间来访问该类寄存器。该空间大小为16 B,有三个寄存器:主机状态寄存器(HSR),主机-DSP控制寄存器(HDSR)和DSP页寄存器(DSPP)。

  1.2.2 C6416 PCI存储器映射

  PCI端口通过3种基址寄存器可以完全访问DSP的存储器映射。

  Base0:4 MB 的可预存取空间,通过设置DSP 页寄存器映射来对应所有DSP存储空间,如图3所示。可以理解为,一个4 MB大小的存储窗口,来遍历整个DSP的存储映射区,而DSP 页寄存器的值则决定了这个4 MB存储窗的起始地址。如图4所示。[page]

  

  Base1:8 MB的非预取址映射。其访问起始地址固定,为0×01800000,该存储空间映射为DSP 片内寄存器。如图5所示。

  

  Base2:PCI 16 B I/O 寄存器,上已介绍。

  上电后PCI 主机将遍历整个PCI 总线,建立一棵PCI总线树,然后对每个PCI总线树上的结点(设备)进行上述3 个基地址的分配。利用这3 个基地址,PCI主机即可以访问PCI总线上的从设备的全部存储空间。

  1.2.3 PCI中断

  如果设置了PCIIEN 对应的中断使能位,当对应的中断源产生,DSP将进入中断状态。所有的中断事件对应于一个CPU中断:DSPINT.可以通过PCIIS中断源寄存器来判断产生中断的中断源。

  1.2.4 PCI引导

  PCI接口支持从PCI总线引导DSP启动。当其他设备从复位状态唤醒后,CPU被复位。在此期间,PCI主机可以尽可能的通过PCI初始化DSP内存。当PCI主机完成所需要的初始化工作,则向I/O寄存器HDCR.DSPINT位写1,使DSP 核退出复位。DSP 则从地址0 处开始运行。值得注意是的是,当C6416 使用PCI 引导方式时,需要通过硬件设置来配置DSP 上电逻辑选择PCI引导模式。

  2 利用PCI 总线来更新系统软件的设计

  2.1 应用程序的数据格式生成

  通过DSP的开发平台CCS,可以把编写的应用程序编译、链接成。out文件。该文件包含了应用程序的各个段的数据,如text段,cinit段,const段,switch段等。这些段是CCS的编译器把所写的C语言编译成汇编语言,然后生成COFF目标文件,再链接实时动态库和静态库生成DSP 核可执行的COFF 文件,提供给C6416 使用。

  但是该文件不可直接被FLASH 识别,同时也不可被C语言所识别。

  CCS 提供了一个实用工具hex6x.exe 来完成。out 文件的转换[7-8].该工具可以把。out文件的COFF数据格式转换成16 进制的ASCII 码数据格式文件。hex.然后利用TI 公司提供的hex2aray.exe 工具,把生成的。hex 文件转换成C语言能够识别的数据数组格式文件。h.

  hex6x.exe 工具的使用可以直接在Windows 的cmd中调用命令。如下:

  hex6x -a -o firm.hex filename.out

  也可以创建一个命令文件来存放命令行操作和输入、输出文件命,以被hex6x.exe所调用。

  filename.out.

  -a

  -o firm.hex

  生成的。hex 文件都是以ASCII 格式所保存。利用hex2aray.exe工具则可以完成ASCII码到16进制数据的转换。利用该工具生成的。h文件把所有数据段的数据顺次存放在一个数组中,这样则可以被C语言所访问。

  本设计中在CCS生成。out的文件夹中,加入了上述两个工具,然后创建了一个命令文件c6416_test.cmd,来输入hex6x.exe 所需要的命令行;创建了一个批处理文件c6416_test.bat,来综合调用两个工具,代码如下:

  hex6x c6416_test.cmd

  hex2aray -i c6416_test.hex -o c6416_test.h

  2.2 PCI上电直接加载应用程序到DSP存储空间

  对于PCI总线上的从DSP设备,如果没有片内或片外FLASH,则PCI主机在上电时可以直接把从DSP设备的应用程序数据写到DSP的片内RAM 或片外RAM,然后指定DSP PC指针运行的起始地址。而从DSP设备应用程序的数据应当存放在PCI主机的系统存储设备中(如片外FLASH,电子盘等)。

  首先通过调试编译DSP的应用程序,完成所有功能需求,生成C6416 可执行的。out 文件;然后利用上述工具,生成。out 文件所对应的。h 文件,该文件中数组的内容,则是应用程序的二进制代码数据;接着通过硬件管脚电平控制,来使DSP 处于PCI 引导方式,并利用DSPPCI从写模式,在系统上电后,主机把。h中的数据传输到指定的C6416程序存储空间;最后向I/O 寄存器HDCR.

  DSPINT位写1,使DSP核退出复位,C6416则从0地址开始运行。

  上述流程中有一个关键问题,就是在进行PCI数据传输时,存放数据的地址如何确定。这些地址表示的是应用程序各个数据段、代码段在C6416中运行时所存放的位置,其由应用程序中的。cmd 文件指明。在应用程序。out生成后,可以查看。map文件来清楚的获知各个段的存放地址。可以用。map 文件来明确主机PCI数据发送的具体地址,手动输入各个段存放的起始地址。然而,此方法主要用于程序调试和测试,当应用程序发生变化,主机的PCI传输程序也需要变化;此外如果使用了DSP/BIOS,.out文件会包含很多的代码段、数据段,手动输入将是一个很繁琐的工作。hex6x.exe工具有一个命令boot,利用该命令生成的数据包含了系统程序的入口地址c_int00 和各个段的起始地址、段的长度。利用这些信息,可以很方便的使用程序把各个段的数据写入到指定的C6416存储空间中,避免了繁琐的手动输入操作。由于当DSP退出复位后,PC指针是从0地址开始运行,如果数据段和代码段是存放在片外RAM时,则需要在0 地址存放一段指针跳转语句,使PC 指针跳转到片外RAM,继续运行。

  2.3 利用PCI总线完成从DSP设备外围FLASH应用程序的更新

  更多的嵌入式设备中,从DSP 设备都接有外围的FLASH 等ROM 设备,用来存放DSP 运行的应用程序。

  这样一方面可以减少PCI主机存储空间的压力,同时可以提高从机的启动速度。

  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~1 KB 位置,然后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语言的语言符号的。[page]

  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所示。

  @7

  第一步:根据C6416外围所选的FLASH 特性,来编写其代码烧写程序。在该程序中把需要更新的业务代码作为常量数据包含到工程中的const段中。

  第二步:利用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启动时应用程序加载的选择。


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分析CAN总线国内外发展与应用状况