BootROM

本章详细介绍了BootROM 相关的特性及应用。

1 概述

BootROM 为该芯片上电后执行的第一段程序, 它支持如下功能:

  • 从Serial NOR FLASH 启动
    • 支持代码在FLASH 上原地执行代码

  • 从SD卡/eMMC 启动
    • 从SD卡/eMMC设备启动,加载程序到内部RAM 执行

  • 设备固件更新(DFU)
    • 支持UART0自动波特率检测

    • 支持对连接在SPI0和SPI2上的Serial NOR FLASH 编程

    • 支持对连接在SDIO0/HS_SDIO 上的SD卡/eMMC编程

    • 支持对片上eFuse编程

    • 支持加载程序到内部RAM执行

  • 安全启动
    • 支持ED25519+SHA256的算法组合模式

    • 支持ED25519+AES-CBC+SHA256的算法组合模式

    • 支持SM3+SM2的算法组合模式

    • 支持SM3+SM4-CBC+SM2的算法组合模式

    • 支持RSA2048+SHA256的算法组合模式

    • 支持RSA2048+AES-CBC+SHA384的算法组合模式

    • 支持RSA4096+SHA384的算法组合模式

    • 支持RSA4096+AES-CBC+SHA384的算法组合模式

    • 支持ED25519+SHA256+FRTDEC的算法组合模式

    • 支持RSA2048+SHA256+FRTDEC的算法组合模式

    • 支持RSA4096+SHA384+FRTDEC的算法组合模式

    • 支持SM2+SM3+FRTDEC的算法组合模式

2 启动流程

本章介绍BootROM 启动相关的流程。 BootROM 支持如下启动模式:

  • SPI NOR FLASH启动模式

  • eMMC/SD卡 启动模式

  • 设备固件更新(DFU)

boot flow

启动流程图

2.1 启动模式配置表

下表详细说明了T0芯片的不同启动模式配置及其对应的启动行为:

Boot PIN可以让系统从不同的区域启动,T0 有四个Boot PIN,分别是
  • PAD_IOMUX_156

  • PAD_IOMUX_157

  • PAD_IOMUX_158

  • PAD_IOMUX_159

四个Boot PIN各种配置,启动区域如下表所示。

Boot PIN 配置

PAD_IOMUX_156

PAD_IOMUX_157

PAD_IOMUX_158

PAD_IOMUX_159

启动模式

BOOT PIN

0

0

0

0

DFU

0

0

0

0

1

ILM

1

0

0

1

0

FLASH0

2

0

0

1

1

FLASH2

3

0

1

0

0

SDIO-SD

4

0

1

0

1

SDIO-eMMC

5

0

1

1

0

HS SDIO-SD

6

0

1

1

1

HS SDIO-eMMC

7

1

x

x

x

RESERVED

RESERVED

系统上电后,会根据默认引脚的电平来选择从不同的介质来启动,用户可以根据自己的需求对不同的存储器进行重新编程, 系统复位或者掉电复位后导致 BOOT 引脚被重新锁存。

启动选择不同,程序就有不同的访问地址:

  • 从 dfu 启动时,则会选择从串口烧写 BootLoader或者应用程序

  • 从 ILM 启动时,则会选择从 CORE0 的 ILM 地址 0x8800000 访问

  • 从 FLASH0 启动时,系统通过 QSPI_XIP0 访问外部 FLASH0 ,从地址 0xfa0000000 访问

  • 从 FLASH2 启动时,系统通过 QSPI_XIP2 访问外部 FLASH2 ,从地址 0xfb8000000 访问

  • 从 SDIO-SD 启动时,系统通过 sdio0 访问外部 sd卡 ,将SD卡中的固件搬运到指定sram运行

  • 从 SDIO-eMMC 启动时,系统通过 sdio0 访问外部 eMMC ,将eMMC中的固件搬运到指定sram运行

  • 从 HS SDIO-SD 启动时,系统通过 hs_sdio0 访问外部 sd卡 ,将sd卡中的固件搬运到指定sram运行

  • 从 HS SDIO-eMMC 启动时,系统通过 hs_sdio0 访问外部 eMMC ,将eMMC中的固件搬运到指定sram运行

2.2 QSPI XIP Nor FLASH 启动模式

BootROM 支持从主流的Serial NOR FLASH XIP启动,包括但不限于:华邦、兆易创新等。

Flash2关键引脚分配表

Flash2引脚名称

芯片引脚编号

功能

CLK

PAD_IOMUX_150

O

NCS

PAD_IOMUX_137

O

DI/IO0

PAD_IOMUX_148

I/O

DO/IO1

PAD_IOMUX_136

I/O

WP/IO2

PAD_IOMUX_135

I/O

HOLD/IO3

PAD_IOMUX_149

I/O

Flash0关键引脚分配表

Flash0引脚名称

芯片引脚编号

功能

CLK

PAD_IOMUX_4

O

NCS

PAD_IOMUX_0

O

DI/IO0

PAD_IOMUX_5

I/O

DO/IO1

PAD_IOMUX_1

I/O

WP/IO2

PAD_IOMUX_2

I/O

HOLD/IO3

PAD_IOMUX_3

I/O

2.3 SD/eMMC 启动模式

BootROM支持从SD/eMMC 设备加载启动镜像到片内SRAM中。BootROM默认只使用单线模式.使用下面的引脚配置:

  • SDIO - SD卡启动引脚配置:

    SDIO关键引脚分配表

    flash0引脚名称

    芯片引脚编号

    功能

    SDCLK

    PAD_IOMUX_9

    O

    SDCMD

    PAD_IOMUX_8

    I/O

    SDDATA0

    PAD_IOMUX_7

    I/O

  • HS_SDIO - eMMC启动引脚配置:

    HS_SDIO关键引脚分配表

    eMMC引脚名称

    芯片引脚编号

    功能

    SDCLK

    PAD_IOMUX_129

    O

    SDCMD

    PAD_IOMUX_134

    I/O

    SDDATA0

    PAD_IOMUX_138

    I/O

Note

BootROM支持启动两个版本的 FSBL(第一级引导加载程序) 。BootROM会尝试加载并启动第一个启动镜像,如果失败,再尝试加载第二个启动镜像。 BootROM首先查找 GPT(全局定位表) :

  • 如果找到 GPT : 通过查找名称为 fsbl1 和 fsbl2 的两个GPT条目来定位两个FSBL ,首选检测 fsbl1 ,检测到并且校验成功会执行 fsbl1 ,否则继续检测 fsbl2 。

  • 如果找不到 GPT : 首先在偏移 LBA128 处检测 fsbl1 的启动头,检测到并且校验成功会执行 fsbl1 ,否则就会在偏移 LBA640 处检测 fsbl2。

如果全部失败,ROM会进入死循环,等待调试连接或者系统复位。

2.4 SD/eMMC启动镜像

SD/eMMC启动模式下,需要给程序增加一个启动头,并且打包成一个启动镜像,才能被BootROM正常识别并启动,SD/eMMC镜像头部结构布局:

512字节头部结构详细布局

偏移(字)

偏移(字节)

字段

描述/值

0

0x00-0x3C

RESERVED

0x00

1

0x40

固定魔数

0x4A4B4C58

2

0x44

固件大小

固件大小(byte)

3

0x48

入口地址低32位

enter_point

4

0x4C

入口地址高32位

enter_point_h

5

0x70

镜像CRC

根据固件文件生成

6

0x74-0x1F8

RESERVED

0x00

7

0x1FC

镜像CRC

计算镜像0到0x1F8偏移的CRC值

3 设备固件更新(DFU)

BootROM 在DFU模式下,支持如下功能:

  • 支持写存储设备,flash0和flash2

  • 支持读存储设备,flash0和flash2

  • 支持擦除存储设备(erase),flash0和flash2

  • 支持读写eFuse

  • 支持读写寄存器

  • 支持加载程序到内部RAM执行

在DFU模式下,支持如下通信接口:

  • USART0

3.1 USART0 DFU

BootROM默认配置USART0为自动检测波特率,其它配置为8-N-1。需要使用Nuclei提供芯片配套的上位机,可以直接连上芯片。BootROM中USART0使用下面的引脚配置:

USART0引脚分配

UART引脚名称

芯片引脚编号

功能

TX

PAD_IOMUX_20

O

RX

PAD_IOMUX_19

I