新闻中心

EEPW首页>嵌入式系统>设计应用> 应用于DM648的FLASH自动加载实现方法

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

作者: 时间:2016-09-12 来源:网络 收藏

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

本文引用地址://m.amcfsurvey.com/article/201609/305059.htm

1)文件头保存了COFF文件的基本信息,如段数目、符号表位置等。长度为22字节。文件头的前两个字节为魔幻数,标注COFF文件的版本,适用于TI公司DSP的魔幻数为0x00C2,第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所示,其余标识符数据不需要下载。

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

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

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

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

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

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

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

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

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

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

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

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

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

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 thc binary AIS file name:

rn”);

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机。



评论


技术专区

关闭