【DSP】【第三篇】C6678启动过程 您所在的位置:网站首页 dsp6678开发板教程 【DSP】【第三篇】C6678启动过程

【DSP】【第三篇】C6678启动过程

#【DSP】【第三篇】C6678启动过程| 来源: 网络整理| 查看: 265

2022年6月27日 1. 概述 关于C6678启动,本文只研究emif和spi的方式。固化在ROMBootLoader区域内的RBL引导程序,用户不能修改。RBL引导程序(外部硬件引脚决定)通过emif接口或者spi接口,从设备外挂NorFLASH中读取需要加载的程序数据。RBL最先读出的是写在最前面的boot参数表(256个字),关于何种启动方式以及配置。 2. 官方资料解读 参考《SPRUGY5C》。ROM 引导加载程序 (RBL) 是驻留在片上只读存储器 (ROM) 中的软件代码,可帮助客户传输和执行其应用程序代码。RBL 的起始地址为 0x20B00000。 为了适应不同的系统场景,RBL 提供了不同的引导模式。 引导模式 在所有引导模式下,整个引导操作可以分为两个部分: • 初始化 • 引导过程 在初始化阶段,RBL 配置设备资源以启动引导过程。 使用的资源取决于引导模式的要求。 在启动过程阶段,映像被加载到设备中并被执行。 引导过程取决于以下因素: • 启动引导操作的触发器 • 引导映像的位置(主机或内存)。 如果映像位于外部主机中,则引导过程会根据引导设备内存映射的主机知识而有所不同。 本文档涵盖: • 可以启动引导操作的不同触发器 • 初始化过程 • 基于映像位置的引导过程 • 针对不同引导模式的特定引导过程功能 2.1 有哪些复位的方式

KeyStone 架构支持四种类型的重置:

上电复位 (POR)硬复位(芯片 0 复位 + 芯片 1 复位)软复位(芯片 1 复位)本地复位

前三种重置被认为是全局重置,会影响整个设备。本地重置仅影响 CorePac,不会触发引导过程。 关于全局复位,当引导加载过程设置为使用 C66x(作为主机)驱动引导时,引导过程由 C66x CorePac0 执行。 在这里插入图片描述

2.2 设备初始化 2.2.1 上电复位 上电复位复位整个芯片,所有内容都重置为其默认状态。可以通过 POR 引脚或 RESETFULL 引脚进行初始化。当 POR 引脚在上电序列期间被置位时,RESETFULL 由主机置位以复位整个器件。RESETFULL 在上电复位序列期间也被置位。在 RESETFULL 断言期间,对用于引导配置的通用引脚进行采样,以将引导配置值锁存到设备状态 (DEVSTAT) 寄存器中。使用来自设备状态 (DEVSTAT) 寄存器的设备配置设置,引导过程执行初始化代码。

下面列出了 RBL 执行的初始化设置:

RBL 启用复位隔离(在所有支持的外设中)。这些外设的电源状态不会改变。RBL 启用电源和时钟域(对于启动所需的任何外围设备)。RBL 配置系统PLL 以设置器件速度。引导配置管脚为 RBL 提供参考时钟的信息。对于no-boot、SPI 和I2C 引导,主PLL 保持旁路模式。对于其他引导模式,执行 PLL 初始化序列以将主 PLL 配置为 PLL 模式。(在设备的所有内核中)RBL 保留L2 SRAM 的一部分来执行引导。段的起始地址、大小和定义在设备特定的数据手册中列出。对于 EMIF16 引导,RBL 不保留任何内存;内存使用完全取决于镜像(在 NOR 闪存中存储和执行)。除 IPC 中断和 PCIe、SRIO (DirectIO) 和 HyperLink 引导模式所需的主机中断外,所有中断均被禁用。在启动过程中,RBL在辅助CorePacs 上执行IDLE 命令并保持辅助CorePacs 等待中断。在这些辅核的应用程序代码被加载完成并且填写完成各个辅核中的 BOOT_MAGIC_ADDRESS 值后,CorePac0 中的应用程序代码可以触发 IPC 中断以唤醒辅核,辅核跳转到各自 BOOT_MAGIC_ADDRESS 中指定的地址。RBL将所有L1D和L1P配置为高速缓存,L2 内存配置为可寻址内存。RBL 为用户提供了配置 DDR EMIF 的能力(在使用 DDR 结构将image镜像加载到外部存储器之前)。该结构保留在 L2 中。 对于 RBL 读取的每个部分,它都会验证是否设置了 DDR 启用magic魔术字。如果设置了magic word,则使用DDR结构来初始化DDR。RBL 使用硬件引脚(可通过 DEVSTAT 寄存器获得)来设置初始配置结构,称为启动参数表。该表存储在 CorePac0 的 L2 的保留部分中。RBL 使用 BOOTCOMPLETE 寄存器(可控制 BOOTCOMPLETE 引脚状态)来指示 RBL 引导过程的完成。当所有内核的 BOOTCOMPLETE 寄存器中的引导完成位被设置时,BOOTCOMPLETE 引脚变为高电平。CorePac0 对应的寄存器中的 BOOTCOMPLETE 位由硬件设置。其他CorePac,一旦完成 引导过程并且就在它退出该过程之前,RBL 会为每个 CorePac 设置位。 2.2.2 硬复位或者软复位

(1)硬复位和软复位由复位引脚启动。默认情况下为硬复位。

如果复位配置为硬复位,它将复位(除测试逻辑、仿真逻辑和复位隔离模块之外的)所有内部模块。如果复位配置为软复位,则(除了未通过硬复位复位的模块外)保留一些 MMR 和内存。

(2)当复位有效时,RBL 首先检查电源状态控制寄存器中是否启用了休眠。

如果启用了休眠,则引导过程将执行休眠序列。如果未启用休眠,RBL 将初始化过程,然后是引导特定过程。

(3)与上电复位触发的启动过程相比,此启动过程,不会采样启动配置引脚(用于更新设备状态寄存器)。 (4)此外,电源状态控制器不会复位任何在器件中被复位隔离的外设。

2.2.3 初始化中的休眠

(1)为了降低功耗,可以使用休眠来关闭未使用的 CorePacs 和外围设备。RBL 在休眠过程中的参与很少。 (2)在关闭 CoresPacs 之前,用户需要设置休眠使能位和模式位以及 CorePac0 将跳转到的分支地址偏移量,以执行电源状态控制寄存器中的唤醒代码序列。 (3)硬复位或软复位后,引导加载程序对电源状态控制寄存器进行采样,以验证是否启用了休眠。如果启用了休眠,则引导加载程序会重置一组外设,并根据设置的休眠模式避免对其他外设进行重置。 (4)在 KeyStone 设备中,有两种休眠模式:休眠 1 和休眠 2。(此处略)

2.3 启动模式

由于 ROM 引导加载程序 (RBL) 支持多种引导模式,因此使用一组通用引脚来选择特定引导模式,并为特定引导模式提供最小配置。当 CorePac 退出复位时,这些引脚上的值随后被锁存到引导配置空间中称为设备状态寄存器 (DEVSTAT) 的寄存器中。 在这里插入图片描述

2.3.1 启动过程

(1)影响引导过程的一个因素是引导镜像(boot image)的位置。根据引导镜像的位置,启动过程分为三类:

RBL从辅助存储(内存引导)加载映像。镜像是从(知道引导设备的内存映射的)主机加载的。镜像是从(不知道引导设备内存映射的)主机加载的。

(2)引导过程的三个部分:

初始化过程,其中 RBL 根据选择的引导模式执行特定的初始化例程。镜像加载过程,其中将映像加载到设备中由用于特定启动模式的外围协议引导。移交过程,其中 RBL 处理引导过程的完成并开始执行引导映像。

(3)内存引导模式下的引导过程

在内存引导模式下,RBL 控制引导设备的映像下载过程。引导映像应转换为 RBL 可以理解的格式。在内存引导模式的情况下,引导映像被转换为引导表。引导表由 RBL 从辅助存储中读取,并放置在设备内的适当内存位置。一旦 RBL 完成映像下载过程,它会将程序计数器移动到引导表中捕获的 c_int00 地址并开始执行引导映像。

(4)主机引导模式下的引导过程(已知引导设备的内存映射)

在主机引导模式下,ROM 引导加载程序 (RBL) 等待主机加载映像。对于主机知道引导设备的内存映射的引导模式,主内核(CorePac0)处于空闲等待模式,主机将映像传输到设备的不同内存位置。主机完成图像加载过程后,需要将 c_int00 地址提供给 RBL 以启动镜像执行。一旦主机更新了引导魔术地址,它就会通过唤醒 CorePac0 将控制权交给 RBL。

(5)主机引导模式下的引导过程(在不了解内存映射的情况下) 在主机不知道引导设备的内存映射的情况下,(将映像加载到设备中)取决于(RBL对主机发送的数据)进行解码的能力。

2.3.2 启动配置格式

RBL 使用一组表来执行引导过程。在考虑单独的引导模式之前,有必要了解这些不同类型的表。RBL 使用三种类型的表:

启动参数表启动表启动配置表

在这里插入图片描述

(1)启动参数表 Boot Parameter Table

启动参数表是 RBL 用来确定引导流程的最常用格式。启动参数表中的前几个参数在所有引导模式中都是通用的,而表格式的其余部分取决于所选的引导模式。RBL 将每个引导模式的默认引导参数表复制到 CorePac0 的保留 L2 部分,并根据通过boot引脚选择的引导配置,修改默认值。

(2)启动表 Boot Table

将要加载到设备中的image转换为 RBL 可识别的格式。这种格式称为启动表。

代码和数据部分由(十六进制转换实用程序)自动插入到启动表中。

(十六进制转换实用程序)使用(链接器在应用程序文件中)嵌入的信息来确定每个部分的目标地址和长度,并且将应用程序中所有已初始化的部分添加到启动表中。

每个部分都以相同的格式添加到启动表中。第一个条目是一个 32 位计数,表示节的长度(以字节为单位)。下一个条目是一个 32 位目标地址,其中复制了该部分的第一个字节。

RBL 继续读取和复制这些节,直到遇到字节数为 0 的节。这表示引导表的结束。然后,引导加载程序跳转到入口点地址(在引导表的开头指定)并开始执行应用程序。

启动表的格式如下: • 32 位标头记录,指示引导加载程序在完成数据复制后应跳转到的位置 • 对于每个初始化部分: 32 位段字节数 + 32 位段地址(副本的目标地址)+ 要复制的数据 • 32 位终止记录 (0x00000000)

(3)启动配置表 Boot Configuration Table

如果某些外设在加载应用程序之前必须使用(与其复位值不同的)值进行编程,则使用启动配置表。例如,如果需要将应用程序加载到 DDR 存储器中,则可以使用启动配置表对 DDR 寄存器进行编程并启用 DDR 外设,然后再将应用程序代码加载到 DDR 中。启动配置表中的每个表条目都包含三个元素: 要修改的地址 + 置位掩码 + 清零掩码(实际就是配置寄存器的操作)RBL 读取指定的地址,然后设置设置掩码元素中设置的任何位,并清除清除掩码元素中设置的任何位。(实际就是配置寄存器的操作)如果设置和清除掩码元素均为 0,则地址字段中的值通过标准调用进行分支,返回地址存储在寄存器 B3 中。当所有三个元素都为 0 时,启动配置表终止。

(4)用于生成不同表的实用程序 下面列出了用于生成不同表格格式的实用程序:

Hex6x 用于将应用程序代码转换为引导表格式。Romparse 用于将引导参数附加到引导表或引导配置表。Bootconvert6x 用于将源自小端应用程序代码的引导表转换为大端格式。 这是必需的,因为 RBL 假定所有图像都处于大端模式。B2i2c 用于将引导表转换为i2c/spi 格式表。 该表可以加载到通过 I2C 连接到设备的 EEPROM 中。Bootpacket 用于将引导表分解为可以从主机发送到以以太网引导模式引导的设备的数据包。Pcsendpkt 用于帮助主机将bootpacket 生成的数据包发送到引导设备。 2.3.3 EMIF16 bootloader 操作

(1)RBL初始化过程。 在这种模式下,RBL 在初始化过程中不会做太多事情。RBL 只是根据( EMIF16 启动模式的启动参数表中指定的)配置参数,配置 EMIF16 接口。

(2)RBL加载过程。 在此过程中,RBL 只是将(程序计数器PC)设置为(通过boot引脚指定的)EMIF 片选的基地址。 RBL 也不在 L2 中保留任何内存。 image将存储在闪存中,因此在此启动模式期间不会发生image传输。

(3)RBL移交过程。 对于这种引导模式,不会发生额外的切换过程。

2.3.8 SPI bootloader 操作

(1)RBL初始化过程。

在 SPI 启动模式下,RBL 仅初始化 SPI 外设。与 I2C 启动模式类似,在 SPI 启动模式下,不启用中断子系统和 EDMA。image从 NOR 闪存读取。RBL 还绕过 PLL 并以参考时钟频率运行 CorePacs。所连接的闪存被划分为 128 字节的块,用户可以通过 DEVSTAT 寄存器提供要读取的起始块。

(2)RBL加载过程。

SPI 引导加载过程,图像是从 NOR 闪存读取。

(3)RBL移交过程。 在这种引导模式下,当 RBL 完成从 NOR 闪存读取整个引导映像时,RBL 将程序计数器更改为 c_int00 地址并开始执行映像。

2.4 启动场景

本节详细介绍 KeyStone 设备中一些最常见的启动方案。

2.4.1 通过i2c启动一个简单的镜像文件

在这种情况下,假定要执行的应用程序完全驻留在( KeyStone 设备的)内部存储器中。 在这种情况下,用户将image加载到 EEPROM 闪存中,并且 KeyStone 设备将设置为以 I2C 主模式启动。 在 I2C 主引导期间,RBL 将设备配置为尽可能低的配置。 启动参数表和启动表都必须加载到 EEPROM 的相应块中:

启动参数表:包含 PLL 配置、总线速度、内核频率、要读取的下一个块的表类型以及下一个块开始的偏移量的信息。启动表:包含要在设备上执行的应用程序。

在启动过程中,RBL 对(锁存在 DEVSTAT 寄存器中的)引导配置设置进行解码,并开始读取启动参数表。 RBL 使用启动参数表将设备初始化为所需的操作条件。 RBL 标识要读取的下一个块以及该块的类型是引导表。 RBL 一次读取一个块,对表进行解码,以提取不同的内存部分,并适当地加载它们。 加载所有部分后,RBL 提取起始地址,并将 CorePac0 程序计数器跳转到该地址并开始运行应用程序。

2.4.2 通过i2c启动一个镜像,进入到外挂的DDR中(使用启动配置表)

在此引导场景中,假设引导应用程序在外部存储器中,有部分或全部部分。 RBL 不会初始化 DDR EMIF 控制器,因为它取决于所连接的 DDR RAM。但是,RBL 提供了几种(在加载应用程序之前)配置控制器的方法。 (1)一种方法是使用启动配置表来初始化控制器。 在这种情况下,一开始加载的启动参数表 将指向包含启动配置表的块。 启动参数表也会被修改,注意下一个表类型是启动配置表。 启动配置表将包含一组需要配置用于初始化 EMIF 控制器的寄存器。

在这种情况下,需要在配置控制器寄存器后继续启动引导过程。 在这种情况下,启动表和修改后的启动参数表可以按照与前一种情况相同的方式加载到 EEPROM 中。启动配置表应该手动组合到image中。

2.4.3 通过i2c启动一个镜像,进入到外挂的DDR中(使用DDR EMIF表)

(2)另一种初始化 DDR EMIF 控制器的方法是使用 RBL 提供的 DDR EMIF 表。 DDR EMIF 表位于 CorePac0 的 L2 中。用户应将此表嵌入到他们的应用程序中,并将位置 硬编码到 该特定设备的指定 L2 地址。 该表的结构包含一组魔术地址,在每次读取块后由 RBL 监视。如果这些魔术寄存器不为零,则 RBL 停止引导过程并使用指定地址中的结构值并配置 DDR EMIF 控制器。 完成配置后,RBL 继续其引导过程,将应用程序部分从 EEPROM 加载到不同的存储器位置。 加载完所有段后,RBL 会将 CorePac0 的程序计数器修改为起始地址并开始执行用户应用程序。

3. 重点研究EMIF和SPI启动多核DSP 3.1 SPI启动

DSP C6678,镜像文件放到NorFlash中,上电之后,RBL通过SPI接口将镜像加载到DSP中。 (0)首先必须要清楚,在生成dat文件的过程中:

b2i2c 将文件划分成128字节的块,是为了下载方便。b2ccs将文件转成一行一个ascii编码32位数字,是为了让CCS识别。字节翻转大小端,是为了让设备能够正确识别。

(1)硬件配置为SPI启动。根据前文章第5节启动引脚。

硬件引脚GPIO[3:1] 设置为0b110 = 6,用于指定为SPI接口。硬件引脚GPIO[7:4] 设置为0bxxxx ,用于选择需要加载的参数表索引(0~15)。硬件引脚GPIO[9:8] 设置为0bxx , 用于指定片选引脚(0~3)。硬件引脚GPIO10 设置为0或者1 , 用于指定SPI的地址位宽(0-16位地址,1-24位地址)。硬件引脚GPIO11 设置为0或者1 , 用于指定SPI的管脚模式(0-4引脚,1-5引脚)。硬件引脚GPIO[13:12]设置为0bxx , 用于指定SPI的工作模式(0~3)。

(2)RBL启动,通过SPI接口读取待加载的数据。首先读到的就是boot参数表。主要就是SPI接口的一些配置。

boot启动参数表,一共256x4字节(256行x32位数据)。启动参数表由通用部分和专用部分组成。针对SPI启动,启动参数表中的配置和基本上和(1)中硬件配置一致。

(3)RBL继续读取,从norflash中读取出boot启动表的数据。如下图所示。 在这里插入图片描述

在编写工程代码的时候,对多核代码以及数据进行地址划分。在编译之后,会形成一个一个数据段。RBL从启动表中读取数据段。每个数据段以长度和目标地址开始。RBL将指定长度的数据搬运到目标地址处。 3.2 EMIF16启动

(1)硬件引脚配置为EMIF启动

硬件引脚GPIO[3:1] 设置为0b000 = 0,用于指定为(no boot ,uart0,emif16,uart1)接口。硬件引脚GPIO[6:4] 设置为0b100 = 4,用于配置为EMIF16。硬件引脚GPIO[8:7] 设置为0bxx , 用于指定片选引脚(0~3)(CS2 ~ CS5)。硬件引脚GPIO9 设置为0或者1 , 用于指定位宽(0-8位,1-16位)。硬件引脚GPIO10 设置为0或者1 , 用于指定SPI的管脚模式(0-4引脚,1-5引脚)。硬件引脚GPIO11 设置为0或者1 , 0-禁用扩展等待,1-启用扩展等待。

(2)略。后续补充。

4. 搬运代码

略。后续补充。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有