应用于DM 648的FLASH自动加载实现方法

2014-03-16 09:22苑玮琦汤永华
电子设计工程 2014年9期
关键词:镜像文件字节应用程序

苑玮琦,于 杨,汤永华

(沈阳工业大学 视觉检测技术研究所,辽宁 沈阳 110870)

TMS320DM648(以下简称 DM648)属于 TI公司的DaVinci系列DSP芯片,主要应用于智能视频监控、网络视频服务器、机器视觉等领域[1]。DM648采用C64x+内核,主频最高可达1.1GHz,并且代码与C64x完全兼容。DM648从FLASH中加载引导程序的方法和之前C6x和C5000系列DSP芯片有很大的不同。第一,之前C6x和C5000系列DSP都是在上电后直接将FLASH的前1K空间的用户引导程序复制到片内内存运行,程序代码量不能超过1KB[2],程序功能有限,并且只能用汇编语言实现,编写难度大且可读性较差[3],而针对DM648,用户引导程序可以直接使用C语言实现,代码量不受1KB限制。第二,C6x和C5000系列DSP的应用程序使用CCS环境编译,生成的.out格式可执行文件需要使用TI提供的转换程序将格式转换成后缀为.hex的二进制文件才可以实现烧写[4]。而DM648需要将.out格式可执行文件转换为.ais格式后才可以烧写到FLASH中,使用者编写程序实现文件格式的转换。

1 FLASH启动流程分析

DM648有多种启动方式,本次设计采用从外部存储器接口(EMIF)上的NOR FLASH启动。硬件电路需要在芯片复位前将DM648引脚BOOTMODE[0:3]的电平状态配置为0100,FASTBOOT引脚配置为高电平,由引脚外接1K电阻上拉到3.3 V来实现[5]。DM648的其他启动方式及配置方法,可以参考文献[5]。

复位之后,DM648从内部的ROM空间开始运行程序,地址为0x00800000。这部分程序称为ROM Boot Loader(简称RBL),是TI公司直接烧写到内部ROM的,用户无法更改。RBL首先修改DSP内部锁相环电路倍频系数为20,即CPU的工作时钟为外部输入时钟频率的20倍。这样可以缩短程序运行的时间;RBL读取EMIFA接口中地址为0xA0000000的代码和数据,该地址为NOR FLASH的第一扇区起始地址,存放在这个地址空间的代码称为用户复制程序UBL,并且UBL程序必须以AIS格式来存放。RBL会执行AIS命令字,将UBL程序各个数据段都复制到RAM中的运行空间,并将控制权转到UBL。UBL首先完成DM648的初始化工作,配置EMIF接口、DDR2控制器和UART接口,并搜索应用程序的AIS镜像文件,UBL解析AIS镜像文件,按照镜像文件的地址将程序复制到运行地址空间中。之后,UBL完成硬件环境的初步配置,跳转到应用程序开始运行。使用UBL进行二次引导可以将引导程序与应用程序功能相脱离,应用程序可以专注于功能的实现,并且同一个UBL程序可以适用于不同的应用程序。实现DM648芯片自启动的操作步骤如图1所示,以下将分别介绍用户程序和格式转换程序的编写方法,最后介绍一个完整的自动加载实现过程。

图1 实现DM648自启动的操作步骤Fig.1 The step of DM648 achieved bootload

2 用户引导程序设计

用户引导程序UBL完成的主要工作是解析应用程序AIS镜像,并将各段数据复制到RAM中对应的运行地址。使用C语言在CCS环境下编写。内存分配方面本次设计的UBL程序运行空间在16K字节之内,因此可以独立定义其运行空间为片内的RAM空间的最初16K字节,即在UBL工程的CMD文件中增加如下代码,程序分配到RAMUBL空间中运行。

MEMORY

{

RAMUBL org=0x00A00000 len=0x00004000

}

需要注意的是应用程序中需要进行初始化的段不可以分配到上述空间运行,否则UBL在复制应用程序的过程中就会覆盖UBL运行中的程序或者数据,从而造成UBL运行崩溃。

UBL程序的工作流程为:

1)DEVICE_UART0Init()初始化串行接口,配置串口通讯的速率、数据位、校验位等内容,在执行下述每个步骤中通过串行接口将调试信息发送给PC机,便于观察启动过程和确定故障原因。

2)DEVICE_EMIFInit()配置 EMIF寄存器,使 DSP可以访问EMIF接口外接的FLASH芯片。本次设计采用16bit异步模式来访问外部NOR FLASH芯片。

3)DEVICE_DDR2Init()配置 DDR2控制器寄存器,使得DSP可以访问DDR2寄存器,实际工程中数据需要复制到DDR2 RAM存储器中。此时需要配置DDR2的总线宽度和读写时间参数等寄存器。

4)从FLASH芯片中保存的UBL镜像文件结束的下一个扇区开始查找应用程序的AIS镜像文件魔幻数。当一个有效的魔幻数被找到后,UBL会顺序读取之后的32位AIS命令并执行,将所有数据段复制到目的地址中。之后,UBL程序将Jump_Close指令的数据部分,即应用程序入口地址保存到变量gEntryPoint中。

5)UBL程序会完成硬件环境的初步配置,包括配置锁相环电路的倍频系数从而修改DM648的工作频率,配置DM648的PSC寄存器关闭不使用的片上外设降低芯片功率,配置引脚复用功能满足应用程序要求等。之后跳转到应用程序的入口地址gEntryPoint运行程序。

3 烧写文件格式转换程序设计

本次设计采用FLASH快速启动方式时,RBL只能解析AIS格式的镜像文件,而UBL和应用程序都在CCS环境中使用C语言实现,二者独立编译链接后会生成格式为COFF(公共目标文件格式)的.out文件。因此需要编写程序实现COFF文件到AIS文件的转换,本次设计中整个转换过程使用C语言在VC6.0环境实现。

3.1 COFF文件格式分析

COFF文件以段的形式将程序中的代码和数据进行组织,默认情况下COFF文件包含3个段:.text为可执行代码段;.data为初始化数据段;.bss为未初始化数据段。一个完整的COFF文件如图2所示,包括以下几部分,依次为文件头、可选文件头、段信息表、段数据、重定位信息、行号入口表、符号表和字符串表[6]。

图2 COFF文件结构Fig.2 File structure of COFF

COFF文件中与下载无关的冗余信息比较多,其中文件头、可选文件头、段信息表、段数据是本次研究的重点,现对本次设计使用到的信息详述如下。

1)文件头保存了COFF文件的基本信息,如段数目、符号表位置等。长度为22字节。文件头的前两个字节为魔幻数,标注COFF文件的版本,适用于TI公司DSP的魔幻数为0x00C2[7],第16、17字节为可选文件头的长度,该数值为0或28。0表示文件中不包含可选文件头部分。否则长度为28字节。

2)可选文件头从偏移量0x16处开始,长度可以为0。TI的DSP采用的可选文件头长度为28字节。可选文件头中以字节为单位标注了代码段、已初始化数据段和未初始化数据段的大小和基地址等信息,其中最重要的是第16到第20字节,为可执行程序的入口地址。

3)段信息表位于可选文件头之后。通常编译之后产生的数据段有很多,所以COFF文件的段信息表分成很多部分,每一个部分长度为48字节。前八个字节用来保存段名,系统默认的段名有.text,.data,.bss等。12到15字节是段数据的运行地址,也就是将可执行文件载入内存时,这个地址就是段数据第一个字节的位置。16到19字节以字节为单位标注段数据的长度。20到23字节标注段数据在COFF文件中的偏移量。40到43字节是段的属性标识,与下载相关的标识如表1所示,其余标识符数据不需要下载。

4)数据段保存段信息表所描述的数据,数据以原始数据的形式存放,只有需要下载的数据段才保存在该处。

表1 下载相关标识Tab.1 The identifier for download

3.2 AIS格式分析及格式转换程序设计

TI对AIS的定义为Application Image Script,应用镜像脚本,是一种镜像文件格式。AIS脚本以魔幻字0x41504954开始,之后包括命令和数据两部分,表2所示是AIS中命令代码[8]。称之为Opcode。在系统启动的第一个阶段,RBL会对AIS格式的UBL文件中的Opcodes进行解析执行。

上述命令代码中Section Load和Jump_Close是最重要的两个。具体的命令及数据格式如图3所示。

表2 AIS文件命令代码Tab.2 File comm and code of AIS

Section Load是数据段复制命令,以命令代码0x58535901开始,之后的数据以32位为长度,分别是复制的目的地址、数据长度和要复制的数据。当所有需要下载的数据段都已复制完成后,需要以Jump_Close命令结束。Jump_Close命令的数据部分提供了一个32位的入口地址,该地址为应用程序的入口地址。程序会跳转到该入口地址运行应用程序。

图3 AIS文件结构及命令格式Fig.3 File structure and the command format of AIS

COFF到AIS文件格式转换的过程首先就是读取COFF文件头数据,获得文件中数据段的数量,然后根据段信息表来判断该数据段是否需要下载、下载的目的地址、数据长度和数据在COFF文件中起始地址。然后将段起始地址、数据长度和数据(ROW DATA格式)填写到Section Load指令的数据部分,每个数据段对应一条Section Load指令。这一过程中只处理需要下载的数据段,因为不需要下载的数据段即未初始化数据段是在程序运行过程中被赋值的。下载的各个数据段按照目的地址由低到高的顺序填写到AIS文件中,直到所有数据段都处理完成,最后以Jump_Close命令结束,便得到了可用于烧写的AIS文件。软件流程如图4所示。

图4 COFF文件转换成AIS文件的流程图Fig.4 Program flow converted COFF file to AIS file

4 一个完整的自动加载实现过程

基于DM 648的核心板原理框图如图5所示。核心板上的主要资源包括:TMS320DM 648处理器,最高工作频率为1.1 GHz;256 MB的DDR2存储器,工作频率为533 MHz[9];32 MB的NOR FLASH,型号为S29GL256N,每个扇区大小为128 KB[10]。

图5 DM648系统结构框图Fig.5 Block diagram of DM648 system

1)准备工作

在CCS环境中使用C语言编写UBL和应用程序,编译生成.out文件,使用3.2节提到的转换程序将.out文件转换为AIS文件,后缀为.ais。

2)启动模式选择及下载环境创建

配置DM648芯片引脚BOOTMODE[0:3]全部为低电平,FASTBOOT为高电平,选择芯片的启动方式为仿真器启动。连接仿真器、DM648核心板和PC机,配置仿真器驱动保证CCS可以配合硬件环境完成程序调试。

3)烧写UBL及应用程序AIS文件

在CCS环境下打开TI公司的DVSDK中的DM648_NORWriter.pjt,该工程实现将UBL及应用程序AIS文件烧写到FLASH中。首先通过CFI接口读取FLASH芯片的参数并自动选择操作FLASH所用的命令字是AMD模式或是Intel模式。在实际开发时所选FLASH芯片可能不支持CFI接口,此时需要使用者参考自己使用的硬件系统中FLASH芯片数据手册,指定操作FLASH所用的指令字。

由于烧写程序需要将AIS镜像文件完全烧写到FLASH中而不需要对内容作解析,因此在CCS环境下以文件操作的形式,使用二进制格式将镜像文件打开,获得文件指针并读取文件内容。文件操作代码如下:

//输入UBL.ais文件路径

DEBUG_printString("Enter the binary AIS file name: ");

DEBUG_readString(fileName);

fflush(stdin);

//以二进制形式打开UBL.ais文件,获取文件指针fPtr

fPtr=fopen(fileName,"rb");

//读取AIS文件的长度(字节数)

fseek(fPtr,0,SEEK_END);

ublFileSize=ftell(fPtr);

程序运行后会弹出对话框要求输入AIS文件路径。在CCS环境中连接DM648核心板,编译并运行DM648_NORWriter.pjt工程完成烧写。

4)重新配置启动模式实现系统自启动

烧写完成后,断开CCS连接,DM648核心板断电并且重新设置引脚 BOOTMODE[0:3]状态为 0100,FASTBOOT为高电平,以此选择芯片的启动模式为EMIFA ROM快速启动。DM648核心板重新上电后自动运行UBL程序实现应用程序的自动加载。可以使用串口线连接DM648和PC机,UBL会在执行过程中将启动信息通过串行接口发送到PC机。

5 结论

实现DM648系统的自动加载需要经过编写二次引导程序,将二次引导程序和应用程序编译结果转换为可用于烧写的AIS文件,最终将AIS烧写到FLASH中。整个过程有一定的复杂性。本文给出的方法和程序为实现这一功能提供了简明的方法,通过在DM648核心板上实现FLASH烧写和自启动过程证明了该方法有效,同时文中提出的格式转换方法可以推广到DM648的其他启动方式中。

[1]Texas Instruments.TMS320DM648 Digital Media Processor[EB/OL].[2007-05].http://www.ti.com.

[2]苑玮琦,张吉,王斌.基于DSP虹膜识别系统中FLASH烧写方法的研究[J].微计算机信息,2011,27(9):20-22.YUANWei-qi,ZHANG Ji,WANG Bin.Study of flash burning method in iris recognition system based on DSP[J].Microcomputer Information,2011,27(9):20-22.

[3]卫菊红.基于TMS320C6455 DSP自动加载及FLASH烧写程序的设计[J].现代计算机,2011(11):71-77.WEIJu-hong.Design of Boot Load and Flash Burning Based on the TMS320C6455 DSP[J].Modern Computer,2011(11):71-77.

[4]樊荣,石岩,张天序.TMS320C6x DSP的FLASH引导方法研究与实现[J].电子技术应用,2004(5):73-75.FAN Rong,SHIYan,ZHANG Tian-xu.Research and implementation of TMS320C6x DSP FLASH boot loader[J].Application of Electronic Technique,2004(5):73-75.

[5]Texas Instruments.Embedded Processing Guide[EB/OL].[2009-03].http://www.ti.com.

[6]Texas Instruments.Common Object File Format[EB/OL].[2009-04].http://www.ti.com.

[7]苗军,倪奇志.COFF文件分析提取器的实现及其应用[J].现代电子技术,2009(2):42-47.MIAO Jun,NI Qi-zhi.Realization and applicotion of COFF file extraction equipment[J].Modern Electronic Technique,2009(2):42-47.

[8]Texas Instruments.Using the TMS320DM647/DM648 Bootloader[EB/OL].[2009-6].http://www.ti.com.

[9]Micron Technology.MT47H128M16 Datasheet[EB/OL].[2006-05].http://www.micron.com.

[10]Spansion Technology.S29GL-N MirrorBit Flash Family datasheet[EB/OL].[2006-10].http://www.spansion.com.

猜你喜欢
镜像文件字节应用程序
No.8 字节跳动将推出独立出口电商APP
新旧电脑资料迁移高效帮手
删除Win10中自带的应用程序
No.10 “字节跳动手机”要来了?
谷歌禁止加密货币应用程序
没光驱不要紧 装个免费虚拟的
简谈MC7字节码
开发闲置内存,为本本轻松提速
用RamOS降低公用机的维护工作量
人类进入“泽它时代”