.. _ip_boot: 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) .. figure:: /assets/images/sdk/boot_flow_release.drawio.png :alt: boot flow :height: 720px :align: center 启动流程图 2.1 启动模式配置表 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 下表详细说明了T0芯片的不同启动模式配置及其对应的启动行为: Boot PIN可以让系统从不同的区域启动,T0 有四个Boot PIN,分别是 - **PAD_IOMUX_156** - **PAD_IOMUX_157** - **PAD_IOMUX_158** - **PAD_IOMUX_159** 四个Boot PIN各种配置,启动区域如下表所示。 .. list-table:: Boot PIN 配置 :widths: 15 15 15 15 20 15 :header-rows: 1 * - 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启动,包括但不限于:华邦、兆易创新等。 .. list-table:: Flash2关键引脚分配表 :widths: 20 20 20 :header-rows: 3 * - 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 .. list-table:: Flash0关键引脚分配表 :widths: 20 20 20 :header-rows: 1 * - 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卡启动引脚配置: .. list-table:: SDIO关键引脚分配表 :widths: 20 20 20 :header-rows: 1 * - flash0引脚名称 - 芯片引脚编号 - 功能 * - SDCLK - PAD_IOMUX_9 - O * - SDCMD - PAD_IOMUX_8 - I/O * - SDDATA0 - PAD_IOMUX_7 - I/O - HS_SDIO - eMMC启动引脚配置: .. list-table:: HS_SDIO关键引脚分配表 :widths: 20 20 20 :header-rows: 1 * - 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镜像头部结构布局: .. list-table:: 512字节头部结构详细布局 :widths: 20 20 20 40 :header-rows: 1 * - 偏移(字) - 偏移(字节) - 字段 - 描述/值 * - 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使用下面的引脚配置: .. list-table:: USART0引脚分配 :widths: 20 20 20 :header-rows: 1 * - UART引脚名称 - 芯片引脚编号 - 功能 * - TX - PAD_IOMUX_20 - O * - RX - PAD_IOMUX_19 - I