TMS320C6678的EMIF16多核程序烧写的软件使用说明 下载本文

4 EMIF16加载转换工具说明

4.1 使用说明

在路径EMIFBootUtility\\hex_ge6678_EMIFBoot中的EMIFboot_out2bin.bat是各核的代码转换工具,它的作用是将各核的待烧写工程的.out文件转换为.bin文件。

在转换之前,需要将.out文件重命名,对于core0的.out文件,命名为core0.out;对于其它7个核的.out文件,命名的规则是:若core1~core7的待烧写工程全不相同,即有7个不同的.out文件,则将各核的.out文件命名为:corex.out(x=1…7),即core1.out、core2.out、…….core7.out;若有些核的工程相同,即共同拥有一个.out文件,则将.out文件命名成其中核号小的名字,即若core1、core2、core4的.out相同,则将.out命名为:core1.out。

重命名后,双击EMIFboot_out2bin.bat,按照DOS窗口的提示,依次点任意键,最后生成的.bin文件名字同.out文件名是对应的,最后将core0和其它核的.bin文件复制到烧写工程的文件夹中。

注:此工具所使用的十六进制转换工具C66x_hex6x.exe同C6455的加载所用的hex6x.exe不一样,前者即可以转换ELF格式的.out文件,又可以转换COFF格式的.out文件,但是后者的hex6x.exe只能转换COFF格式的.out文件,鉴于最新的编译器都是默认ELF格式的输出文件,因此一律使用最新的C66x_hex6x.exe。

4.2 生成文件格式说明

由于.bin文件不便于用户查看代码格式,因此为了方便用户更清楚的了解各核的代码经过转换后的格式,在工具中同时生成了.dat文件,可以参看EMIFBootUtility\\hex_ge6678_EMIFBoot中生成的core0.dat和coreN.dat。 4.2.1

core0的.dat文件的格式

行数1------

258-------259-------260-------261-------2------

.dat文件头信息 A B C

1KB引导代码(.bootload段) 入口地址 Section 1 size Section 1 addr Section 1 data Section 2 size Section 2 addr Section 2 data . . . Last Section size Last Section addr Last Section data 图3 core0的.dat文件格式

E D

9

如上图所示:

A: 代表.dat的头信息,一般格式是:1651 1 80000000 0 8001 。

B: 代表1KB引导代码,由待烧写工程中的bootload.asm文件中的汇编函数转换而来。 C: 待烧写工程开始运行时的入口地址。

D:待烧写工程的各个段的格式,主要有.text、.cinit、.const、.switch等初始化段(initialized),没有未初始化段(uninitialized),具体跟工程有关,可以参看EMIFBootUtility中的core0.map文件或待烧写工程的.map文件,它们都是相互对应的。

注:此文件限定core0的实际代码量在128KB以内,小于128KB时此工具自动在.dat后补0,若实际代码量超过128KB,可以修改此工具中EMIFboot_COFF2hex_core0.cmd中的len项,把它改到大于实际的代码量。 4.2.2

core1~core7的.dat文件的格式

.dat文件头信息 D部分总的代码字数(行数) 程序入口地址 Section 1 size Section 1 addr Section 1 data Section 2 size Section 2 addr Section 2 data . . . Last Section size Last Section addr Last Section data 图4 core1~core7的.dat文件格式

A B C

D

如上图所示:

A: 代表.dat的头信息,一般格式是:1651 1 80000000 0 1fb4 。

B: 代表D部分总的字数(行数),即代码所有段的总大小,不包括入口地址,这个信息主要用于判断加载是否结束。

C: 待烧写工程开始运行时的入口地址。

D:待烧写工程的各个段的格式,主要有.text、.cinit、.const、.switch等初始化段(initialized),没有未初始化段(uninitialized),具体跟工程有关,可以参看EMIFbootUtility\\hex_ge6678_EMIFBoot中的coreN.map文件或待烧写工程的.map文件,它们都是相互对应的。

注:此文件对代码量没有限定,最后生成的.dat文件的数据长度就是实际的代码量。

5 烧写工程说明

5.1 工程文件说明

文件夹c6678_EMIF_IntelNorFlash_Burn是将8个核的代码烧写到Nor Flash的工程, 此工程只需

10

要core0执行即可。其中的各个文件说明如下:

表2 烧写工程文件的函数说明

文件名 EMIF_main.c InitPLL_C6678.c 功能、用途 包含主函数 包含PLL的初始化函数 main() InitMainPLL() NOR_init() flash_nor.c 包含对flash的擦除、烧写的基本函数 NOR_writeBytes() 包含EMIF16接口的初始化函数 EMIF_init() KeyStone_EMIF16_init() NOR_FLASH_erase_blocks() NOR_FLASH_write_block() NOR_FLASH_read_block() NOR_erase() 包含的函数 函数功能 初始化外设,烧写8个核的代码 初始化PLL 初始化Nor Flash 擦除一定长度的NOR Flash 向Nor Flash中写入一定长度的数据 配置EMIF16接口的寄存器 初始化EMIF16接口 擦除flash的某块区域 烧写flash的某块区域 读取flash的某块区域 KeyStone_EMIF16_Init.c EMIF_NOR_FLASH_test.c 包含对flash擦除、烧写的用户可调用函数 5.2 程序流程图

此烧写工程是将各核的.bin文件的数据烧写到Nor Flash中去,对于core0来说,其.bin文件是必须要烧写的,而且烧写地址固定为0x70000000。对于其它核core1~core7,由于它们的待烧写代码的情况很多,比如有些核的代码相同,有些核的代码不同,相同代码就烧到同一块空间,不同代码烧到不同空间,因此预定义core1~core7的Flash烧写地址,即为每个核的代码都分配一块Flash存储空间(见表1 预定义的八个核的Flash空间分配),然后由用户决定实际的烧写地址,为了统一,这里规定:相同代码都烧到预定义的核号小的Flash空间(由表1分配的,不包括core0),例如core1、core5、core7的代码相同,则它们三个的烧写地址是core1的flash空间0x70200000(注意不管core1~core7的待烧写工程跟core0的是不是同一个,core1~core7的代码不能烧到core0的预定义空间),为了避免相同代码烧写多次,这里加入判断,若用户定义的某个核的实际烧写地址不是预定义的地址,则不烧写。比如core1和core4的代码相同,则用户定义core1和core4的Flash烧写地址是core1的Flash空间0x70200000,则执行core1的代码烧写,由于core4的跟预定义的不相同,则不执行core4的烧写,因此只烧写一次。

以烧写core1的代码为例,流程图如下:

11

core1代码烧写开始 core1_FlashAddresss?=0x70200000 N Y 用fopen打开core1.bin文件, 文件指针赋给fp 用fread读取core1.bin并存入数组, 返回文件数据项个数 根据文件数据项个数,将数组中的代码烧写到Nor Flash 烧写结束

图5 core1代码烧写流程图

6 Boot Mode设定

烧写完毕,为了验证加载是否成功,需要将加载方式设置成EMIF16 加载,C6678芯片专有Boot Mode pin[12:0]控制加载方式,对于EMIF16 boot, Boot Mode pin[12:0]=0b0000000100000,如下表所示:

表3 Boot Mode pins 定义

Boot Mode Pins 12 11 PLL Mult 000

10 9 8 7 6 5 4 3 2 1 Boot Device 000 0 Device Configuration 0000100 Boot Mode pins [12:0]与GPIO[13:1]共享管脚,因此,可以通过GPIO[13:1]来控制Boot Mode

12

pins[12:0],具体到开发板上,可以查看是否由拨码开关或FPGA程序来控制。设置完成后,可以通过CCS查看DEVSTAT寄存器(地址为0x02620020)是否为0x41。如下表所示:

表4 DEVSTAT寄存器[13:0]的含义

13 12 11 10 9 8 7 6 5 4 3 2 1 0 LENDIAN 1 Boot Mode pins [12:0] 00 0000 0100 000 7 加载成功检验

按照上述步骤操作完成之后,将板卡断电并重新上电之后,为了检验是否加载成功,最好是按例子example_pjt中那样,在待烧写的工程中加上Timer点灯程序,上电后若LED灯闪,则说明加载成功。也可以将CCS与C6678连接上之后,看PC指针的值,若PC指针的值在ROM里(0x20B00000到0x20B1FFFF),则说明加载不成功,若PC指针的值在内存范围(如0x00830000),则说明加载成功。

13