目录

0前话

一、SPI BOOT理解

1、配置Device configuration

2、boot table 格式

3、常规流程介绍

二、工具链介绍

三、多核启动过程

四、BOOT工具链软件的优化与实现


0前话

这篇博文已经搁置一年之久,今天终于是下定决心整理和书写下来了。对于C6678我参与其中,最记忆深刻的两个技术点要算是:SPI BOOT及其优化实现和网络GE工程的调试优化。这篇文章主要还是讲SPI BOOT 方面的内容。对于GE工程调试,简单提一下(后续也不再写单独写了),遇到最大的问题,可能是使用官方例程,直接运行,会while死循环,或者phy link up和link down等问题。解决措施是:需要根据自己的板卡对应设置好时钟与MDIO、PHY的内容。这将会是我在嵌入式这个行业上最后一篇博文了,已经在换行的路上了,期望在地理信息、图像处理等领域有所发展吧!

一、SPI BOOT理解

原理可参考钱丰的《TI c66x 系列DSP 多核BOOT 的研究》论文。

1、配置Device configuration

SPI 启动的流程需要在两处修改管脚配置(EVM 板的拨码开关)。第一次是在烧写镜像工程进入 Flash 时,需要将 EVM 板调成 No-Boot 模式。第二次是成功烧写多核镜像后进行 reboot 的过程,将拨码开关配置成 SPI 模式才能将镜像成功读取并启动。

根据拨码开关和对应的说明,则有:

no boot
SW6 SW5 SW4 SW3
0011 0000 0000 0001
SPI boot 为例展开说明:
SW6 SW5 SW4 SW3
0001 0100 0000 1101 off 1 on 0

2、boot table 格式

由于boot image 是用户编程实现,大小不定。为了使RBL搬移bootimage时知道搬移的目的地址和搬移量大小,我们定义了boot table 格式。通过 TI 的hex6x 工具将 boot image 转换为boottable格式,然后将 boot table格式的boot image 存放在SPI FLASH中。

boot table 包含一个32位的头地址、多个段和一个结束标志,如图所示。

  • 32位头地址

在boot table的起始处,RBL 在搬移完后,跳转到该头地址。该头地址也是加载到合适存储位置的boot image 的起始地址。

boot table 的主要部分是一个或多个段。每个段分为三部分:

  1. 32位的段字节数(要搬移的数据字节数)
  2. 32位的段地址(要搬移数据的目的起始地址)
  3. 要搬移的数据
  • 结束标志

32位全0(可以理解为32位的段字节数为0)

RBL 在搬移boottable 格式的boot image 过程中,不断地读取和搬移段数据,当遇到段字节数为0(其实就是结束标志),则跳转到 boot table 最开始指定的 32位头地址。核0 开始执行boot image 程序。

示例数据分析:

3、常规流程介绍

通过Nor flash 烧写加载程序的全部流程:(在no-boot模式下)

1). 编译测试工程,生成.out文件

2). 将.out文件拷贝到SPI_Bootloader工具链路径下,生成.dat文件

3). 将evm板调成no-boot 模式

4). 打开MCSDK自带的nor-writer工程,将工程bin文件夹下的nor_writer_input.txt 打开,修改输入文件名为spirom_le.dat 并将spirom_le.dat拷贝到mcsdk_xxxx\tools\writer\nor\evmc667xl\bin路径下

5). 链接工程,等PC指针停在main函数入口,打开view--memory browser,输入0x80000000,load memory 选择spirom_le.dat,(自动)勾上Use the header...

再次确认start address 为0x80000000,length为spirom_le.dat的长度(单位是word) 开始往DDR里灌数。

6). 烧写工程run,注意console输出  显示与length长度大小相同的文件烧入flash,则烧写成功,此时单位是字节。

7). 最后拨码开关拨到SPI boot模式下,断电重启

二、工具链介绍

这部分本应该详细介绍的,主要包括各个转换软件的功能介绍、批量处理文件.bat介绍以及单核多核boot文件的编写等。但由于这些有些博主写的也很清楚了,详细可参考:TMS320C6678的SPI Nor Flash的程序烧写

三、多核启动过程

C66x DSP 内部有一个固化的ROM,里面存放着boot 代码(ROM bootloader)。每当DSP 启动时,会自动从这里读取代码并执行。这里执行的代码是固化的不可更改的,其作用就是根据DSP的管脚配置方式对核进行初始化(比如PLL 等)和完成不同模式的Boot 处理。所有的core 执行同一份代码。不同的core 在执行的时候通过DNUM(核编号索引)来去做区分。初始化外设的操作由 core0来完成。所以core0初始化其他外设的同时,其他core都会执行相关的代码映射IPC 中断,并配置相应的寄存器,然后进入IDLE 状态,等待core0 的IPC中断发起。简言之,其他核是在core0 的命令下执行第一句代码。

Boot Magic 地址是每个core 各自一块固定的内存。该字存放的是各个core 初始化之后需要跳转到的c程序入口地址 _c_int00()。TMS320C6678的Boot Magic地址是0x1x87FFFC,因为L2 RAM只有512KB。

如果多核DSP 是由同一套工程分别编译,那么每个核内存分配完全相同。core0 在读取自己核的Boot Magic 地址(0x108ffffc)后,加上0x0*000000 后就可以得到其他核的Boot Magic 地址(*为核号)。但是如果各核编译各自独立工程,各变量内存映射关系不再相同,那么就无法从core0 的Boot Magic 地址里的值去推算其他核相应地址。这个时候只能事先记录下各核的 Magic地址,然后写死在核 0 的用户初始化代码上。

在完成所有上述操作后,core0 需要对每个核的IPCGRx 寄存器写中断以唤醒其他核的正常运行状态。IPCGRx 寄存器的31-4 比特位是IPC 中断源索引,最多可支持多达28 个中断源,文中例程可以设置为全0;比特3-1 是保留位,可以任意赋值。因此只要对最低比特赋1 就可以完成IPC 中断的触发。

四、BOOT工具链软件的优化与实现

无论是从钱丰的论文中,还是在“TMS320C6678的SPI Nor Flash的程序烧写”这篇博文中,我们都不难发现此工具链的一些弊端。钱丰论文中有提到:

事实上,工具链中受到大小限制的部分不仅仅是b2i2c.exe文件;还有就是最后加表头小工具的确可改变“暂停,将i2crom.ccs中的第9行51改为00”的手动局面。下面将是我的优化和实现过程。

由于调用的是TI官方软件,其中软件存在文件大小的限制。在大工程生成执行文件过大或多核文件合并后文件过大时,这样的转换软件将无法正常工作。由此根据原理,修改替换相应的软件,解决了当下的限制。

1、修改了b2ccs.exe、b2i2c.exe两个软件内的数组大小设置,手段是直接更改其对应的.c文件内容,然后通过gcc工程生成相应的执行软件。修改部分是将其中的0x20000均改成了0x80000000。位置:C:\ti\mcsdk_2_01_02_06\tools\boot_loader\ibl\src\util

2、替换了romparse.exe软件,该软件的作用就是对上一步生成的btbl文件添加上固定的信息头。但该文件的大小设置限制了其使用范围,由此在分析原理和对比前后文件差别后,决定将其修改掉,利用VS2010平台,将构造的信息头(以.h数组的形式确定),直接添加在btbl文件内容之前,并生成执行软件C6678romparse.exe,如此可达到相同的效果。

#define _BOOTARRAY_h_
char *array[256]=
{"0x00500000","0x00320000","0x40200002","0x00010018","0x00040000","0x00010000","0x03200000","0x01f40051","0x04000000","0x00000000","0x00000000","0x00000000","0x00000000",
.
.
."0x00000000"
};
 string str("");//读取一行数据//事例 1651 0 80000000 0 7c0//Magic Number、Format、Starting Address、Page Num、Lengthint MagicNum = 0;int Format = 0;int StartAddr = 0;int PageNum = 0;string Length16,Length;//由于长度是16进制表示,里面可能存在字母,用字符串接出int ArrLength = 0,NewLength = 0;getline(fin,str);//获取第一行istringstream ou(str);ou >> MagicNum >>  Format >> StartAddr >> PageNum >> Length16;Change16to10n(Length16,ArrLength);//16进制数转10进制数NewLength = ArrLength + HeaderLen;Length = DecIntToHexStr(NewLength);fout <<MagicNum <<" "<< Format <<" "<< StartAddr <<" "<< PageNum <<" "<< Length << endl;//头//char string[25];for(i = 0;i < HeaderLen;i++){//itoa(array[i],string,10);fout << array[i] <<endl;}for(j = 0;j < ArrLength;j++){getline(fin,str);fout << str <<endl;}fin.close();fout.close();

3、优化了该转换流程。由于最后真正使用的boot文件,需要修改相应的表头,以及调整文件格式。那么在转换流程中添加了c6678_SpiBoot.exe来修改表头、C6678swapDat_Bin.exe可将dat文件转为bin文件、zhuanhuan.exe可将bin文件转成mcs文件,最终用于FPGA烧录,减少了再次开启烧录工程,运行工程往flash中写入的步骤。

/**************************************************
*对需要修改的行进行修改
*主要是第6行改片选;第9行改boot table,第10行改跳转长度
*最后返回字符串
****************************************************/
string ChangeProcess(string str,int j,int cs)
{const char *p = NULL;char a[11] = {0};a[10] = '\0';//加一个结束符,用于转换成字符串string cstr;p = str.c_str();//拆分字符串为单个字符for(int i = 0;i < 10;i++){a[i] = *(p+i);//cout<< a[i] <<endl;}//修改相应位置if(j==3)//根据要求,修改主频{a[4] = '0';a[5] = 'a';a[9] = '1';}if(j==5)//根据要求,修改成片选0{if(cs == 0){a[9] = '0';//片选0}else{a[9] = '1';//片选1}}if(j==7)//根据要求,修改主频{a[4] = 'e';a[5] = '8';}if(j == 8)//500K bus raterateraterate ;后四位原来是0x0051,因为boot paramter table不全所以改为了0000{//a[6] = '0';//a[7] = '0';a[8] = '0';a[9] = '0';}if(j == 9)//跳转长度从1K 0x400字节改成0x50字节{a[2] = '0';a[3] = '0';a[4] = '5';a[5] = '0';}cstr = a;//cout<< cstr <<endl;return cstr;}

优化后的批处理文件内容将为:(单核如下,双核只是加上mergebtbl即可,多核依旧如此添加simple执行文件即可)

hex6x simple.rmd

hex6x simple1.rmd

mergebtbl simple.btbl simple1.btbl simple.btbl

b2i2c simple.btbl simple.btbl.i2c

b2ccs simple.btbl.i2c simple.i2c.ccs

C6678romparse simple.i2c.ccs i2crom.ccs

c6678_SpiBoot i2crom.ccs i2cromn.ccs 0    //第三个参数为片选0/1的flag

byteswapccs i2cromn.ccs spirom_le.dat

C6678swapDat_Bin spirom_le.dat temp.txt out.bin   //文件格式改变,并且内容以二进制写出同时转成小端模式 temp.txt为中间过渡文件

zhuanhuan out.bin out.mcs

pause

烧录步骤:

1、转换软件的文件夹放在本机中,其绝对路径中尽量不用中文字符;

2、CCS软件编译工程,生成相关的.out执行文件,并将其拷贝至转换软件文件夹中;

3、更改.out文件名为simple.out;

4、运行文件夹内的批处理文件(双击spibootyh.bat/yhspiboot_multi_2cores.bat),会出现doc对话框(黑框);

5、观察黑框中调用各软件的运行情况,如若有停顿,按Entrer键继续,直至黑框退出;

6、此时在文件夹下会生成一系列新的文件,譬如.dat、.bin、.mcs文件等;

7、选用.mcs文件来用于spi boot的烧入。

最后,我也会将相关的资源上传的,有需要的可以自己下载。

DSP篇--C6678 SPI BOOT详解及其优化实现相关推荐

  1. 【java】SPI机制详解

    1.概述 以前的文章:[SPI]java基础之SPI框架实现 转载:Java常用机制 - SPI机制详解 PI(Service Provider Interface),是JDK内置的一种 服务提供发现 ...

  2. STM32开发实战:W25Q32JV SPI Flash详解

    STM32开发实战:W25Q32JV SPI Flash详解 在STM32单片机的应用中,使用SPI Flash能够有效地扩展程序和数据存储空间.W25Q32JV SPI Flash是一种常用的Fla ...

  3. Java NIO学习篇之缓冲区ByteBuffer详解

    定义: ByteBuffer是Buffer的实现类之一,是一个通用的缓冲区,功能要比其他缓冲区子类多.支持直接内存.是一个抽象类.子类实现是HeapByteBuffer(非直接缓冲区子类),Direc ...

  4. Java SPI机制详解

    Java SPI机制详解 1.什么是SPI? 2.SPI的用途 Driver实现 Mysql DriverManager实现 spi工具类`ServiceLoader` 将自己注册到驱动管理器的驱动列 ...

  5. 88-Spring Boot详解

    Spring Boot详解 SpringBoot基本应用: 约定优于配置: 上面是引自官网的一段话,大概是说: Spring Boot 是所有基于 Spring 开发的项目的起点 Spring Boo ...

  6. [网络安全学习篇2]:IP详解及简单的DOS命令(千峰网络安全视频笔记 2 day)

    引言:我的系列博客[网络安全学习篇]上线了,小编也是初次创作博客,经验不足:对千峰网络信息安全开源的视频公开课程的学习整理的笔记整理的也比较粗糙,其实看到目录有300多集的时候,讲道理,有点怂了,所以 ...

  7. 【Linux】循序渐进学运维-服务篇-FTP服务配置文件详解

    大家好,我是互联网老辛,本文是Linux运维-循序渐进学运维-服务篇的第14篇文章 文章目录 前言 ftp配置文件详解 1. 常见默认配置参数 2. 常见参数的含义 配置文件使用举例 1. 创建本地用 ...

  8. STM32常用协议之SPI协议详解

    SPI协议详解 SPI协议简介 一.SPI物理层 二.SPI协议层 2.1 SPI基本通信过程 2.2 通信的起始和终止信号 2.3 数据有效性 2.4 CPOL/CPHA及通信模式 三.编程实现 四 ...

  9. SPI协议详解(总结)

    关于SPI协议 1)SPI是串行外设接口(Serial Peripheral Interface)的缩写: 2)是一种高速的,全双工,同步的通信总线: 3)在芯片的管脚上只占用四根线,节约了芯片的管脚 ...

最新文章

  1. HTTP/HTTPS抓包工具-Fiddler
  2. vc++ 隐式链接dll
  3. 1.7 Java try catch finally语句
  4. Boost:connect pair连接对测试程序
  5. java canvas 缩放图片_详解如何用HTML5 Canvas API控制图片的缩放变换
  6. 【PAT天梯】【L2-2 小字辈(左子右兄加强版)】(树,水题)
  7. php 检测死锁,MySQL 死锁检测
  8. input 底线_社区建设如何帮助组织的底线
  9. 中国电信9月将率先推出5G新号段:资费也随之曝光 最高599元/月?
  10. 实现拷贝函数(strcpy)
  11. unity 彩带粒子_Unity3d粒子特效:制作火焰效果
  12. java 反射机制及其应用
  13. python语法_元组
  14. 什么是WPF,对WPF的认识
  15. 自定义封装无人值守Windows10镜像
  16. html如何实现文章分类功能,HTML文本自动分类技术的研究与工具的实现
  17. 数据结构:C#语言与面向对象技术(1)
  18. 终于弄懂 CRC 循环冗余校验 辽
  19. 商业智能中的决策, 数据和数据处理方法
  20. 磁性开关 —— 干簧管的原理和应用

热门文章

  1. python石头剪子布while循环_14.python之石头剪子布
  2. Android Qcom lcd display 学习(4)
  3. 极光推送 android6.0,极光推送Unity-Android-API
  4. 深度学习笔记(转载)
  5. 密码学------DNA密码学发展概述
  6. ASP.NET上传文件的三种基本方法
  7. JAVA里面一加到一百等于多少_1加到100是多少?详细算法
  8. (HAL库学习8)STM32CubeMX 驱动0.96寸IIC oled(取字模,取图模)
  9. ASCII, LATIN1, UTF8 简介
  10. Sharepoint 2010 版本号