嵌入式处理器基于SPI引导的RAM 自检论文

时间:2021-08-31

  0 引言

嵌入式处理器基于SPI引导的RAM 自检论文

  随着全球网络进一步扩展到新终端设备和以前未连接的行业中,网络安全对消费者、企业和其他机构变得越来越重要。人们越来越需要性能安全、价格便宜的装置设备。为了降低成本, 往往需要简化电路设计。例如,采用SPI 方式引导硬件,使用SPI Flash 作为存储媒介,减少总线的布线,是简化硬件电路的较好的方法。但采用SPI 方式引导硬件,需要将程序引导到DDR 内存中,同时又需要对DDR 内存进行检查,这就出现了矛盾。

  1 基于SPI 的硬件引导

  本文以一个实例,对嵌入式处理器基于SPI 引导硬件时如何进行RAM 检查进行详细的介绍。是嵌入式处理器使用SPI 引导的硬件框图。硬件引导程序和系统程序放在SPI Flash 中,在上电引导后,系统程序会被搬移到DDR 空间,在D DR 空间运行起来。现在以U-Boot 硬件引导程序为例, 介绍以SPI 引导模式引导系统硬件的情况。U-Boot 是德国DENX 小组的开发用于多种嵌入式CPU 的Bootloader 程序, 可以支持多种嵌入操作系统和多种处理器。编译的U-Boot 程序, 往往是运行在NOR Flash 或DDR 中的。但在基于SPI 引导时, 需要先从SPI Flash 往片内RAM 里运行一段程序, 将DDR 内存检查一遍, 然后再将U-Boot 引导到DDR 内存中去运行。

  2 SPI 引导采用的数据格式

  在TI 公司的DSP 及ARM 处理器,飞思卡尔公司POWERPC 及ARM 处理器, 都支持基于SPI 的引导模式。在这些处理器的片内ROM 都包含基本的SPI 引导驱动程序。本文以飞思卡尔公司的QorIQ P1010 处理器为例介绍其引导过程。P1010 片内的SPI 驱动程序能够把SPI 接口Flash 中的程序拷贝到DDR 内存或片内RAM 中。不过,在拷贝之前,需要先对DDR 控制器或片内RAM 进行配置。这就需要定义一个特定的数据结构,完成引导程序所需要的环境配置。对于不同的处理器,生产厂家定义的引导数据结构是不同的。在P1010 处理器完成复位序列后,通过选择使用处理器片内ROM 的SPI 引导配置程序,而后处理器内核开始运行该片内ROM 程序, 配置SPI 控制器,并与外部的SPI Flash 通信,将程序拷贝出来并跳到指定的位置运行时配置数据写入此地址。当最低位为1 时,配置地址域高30 bit 代表的是指令,此时配置数据写入此地址。这样的结构让用户可以方便地配置4 B 对齐的内存,完成控制指令操作,或定义程序配置阶段的结束

  当CNT ( 最低位)=0 时, 则高30 bit 用作要写入数据的地址,配置数据包含要写入的数据。

  当CNT=1 时, 则高30 bit 用作控制指令。

  当EC=1 时, 代表配置阶段结束指令。

  当DLY=1 时, 代表延时一定时间指令。

  当CF=1 时, 代表更改SPI 频率的指令。

  CNT 表示地址模式与指令模式的切换。

  当处理器内核开始拷贝程序时, 先判断0X40 位置的标志是否正确, 如果正确, 先根据配置的地址/数据对的个数N 来配置一些外围寄存器,然后从0X50 处指示的Flash 地址搬移用户代码数据到0X58 指示的地址。搬移完成后,从0X60 指示的地址开始运行。将片内运行的这一段程序叫TPL 程序。

  3 片内RAM 运行的TPL 程序

  P1010 包含256 KB 的L2CACHE, 也可以当片内RAM 使用。要检查DDR 内存, 要先在片内RAM 里运行一小段TPL 程序。这一段程序是对基于DDR 引导程序U-Boot 的一个裁剪, 主要完成内核的配置,初始化串口终端, 初始化DDR 内存控制器, 然后检查DDR 内存。在这里不需要设置U-Boot 的环境变量,不需要配置以太网等其他的外围器件。编译后的TPL 目标文件为uboot-tpl.bin 。TPL 程序的编译按RAM 引导的方式处理。程序的开始地址设为:0xc0030000~0xc0038800 。现在需要对编译后的uboot-tpl.bin 进行格式处理, 在其前面加上SPI 引导的可以识别的数据表头,是按照(SPI 引导模式的数据结构) 和( 配置地址域的数据格式) 完成的一个SPI 引导配置实例。在这个实例中, 将L2CACHE 设为片内RAM, 开始地址设为0xc0000000 。这一部分空间在处理器内核引导时已经通过TLB 映射, 可以直接使用。

  4 结论

  嵌入式处理器在使用SPI 引导硬件时,先通过片内RAM 运行一段程序,对DDR 内存进行自检,而后再将U-Boot 程序及环境变量引导到DDR 空间,把硬件系统引导起来。通过实例化的应用,证明这在高性价比的嵌入式应用中是一个不错的选择,不仅能提高系统的可靠性,而且简单易行。