0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

i.MXRT系列的ROM API设计

电子设计 来源:电子设计 作者:电子设计 2020-10-30 10:52 次阅读

大家好,我是痞子衡,是正经搞威廉希尔官方网站 的痞子。今天痞子衡给大家介绍的是 i.MXRTxxx 系列 ROM API 设计细节。

痞子衡之前写过两篇文章 《利用 i.MXRT1xxx 系列 ROM 提供的 FlexSPI driver API 可轻松 IAP》、《其实 i.MXRT1050,1020,1015 系列 ROM 也提供了 FlexSPI driver API》 基本把 i.MXRT1xxx 全系列的 ROM API 及其 FlexSPI NOR 驱动设计都讲清楚了,其实 i.MXRTxxx 系列的 ROM API 设计跟 i.MXRT1xxx 系列的设计思路差不多(其实本就是同一个恩智浦研发小组负责的),仅有一些微小区别,本文痞子衡主要就是点出那些区别。

一、ROM 基址差异

ROM API 代码首先是在 BootROM 里,BootROM 代码是出厂前固化在 ROM 区域的。因为架构设计的关系,i.MXRTxxx 系列和 i.MXRT1xxx 系列的 ROM 区域在系统内存里的映射地址不同。

下表是 i.MXRTxxx 系列代表型号 i.MXRT500 的部分系统内存映射,可以看到 ROM 区域起始地址是 0x03000000(非安全域)。目前 i.MXRTxxx 都是 Cortex-M33 内核,支持 TrustZone 特性,所以 0x13000000 也是 ROM 起始地址(安全域),为了通用性,我们认 0x03000000 就可以了,这个地址在安全状态和非安全状态下都能被访问。


下表是 i.MXRT1xxx 系列代表型号 i.MXRT1060 的部分系统内存映射,可以看到 ROM 区域起始地址是 0x00200000。i.MXRT1xxx 系列都是 Cortex-M7 内核,没有 TrustZone 特性,不存在 i.MXRTxxx 上那样的两种状态域下的地址。


二、API 基址备份位置差异

在 i.MXRT1xxx 系列 ROM API 介绍的文章里,痞子衡介绍过 g_bootloaderTree 地址值被复制了一份放在了 BootROM 中断向量表第 8 个向量的位置处(该向量为 ARMv7-M 架构下未定义的系统向量),因此读取 0x0020001c 处开始的 4bytes 便能找到 i.MXRT1xxx 系列的 g_bootloaderTree。

但是由于 i.MXRTxxx 是 Cortex-M33 内核,属于 ARMv8-M 架构,从下图中可以看出 ARMv8-M 架构下中断向量表第 8 个向量是 SecureFault,已经被定义了,因此 BootROM 把 g_bootloaderTree 地址值放到了第 9 个向量的位置处(该向量为 ARMv8-M 架构下未定义的系统向量),故读取 0x03000020 处开始的 4bytes 才能找到 i.MXRTxxx 系列的 g_bootloaderTree(这种方式在实际 API 调用中并不可取,至于原因嘛,先卖个关子)。

下面是 i.MXRT500 BootROM 工程的 startup 文件(IAR 版),g_bootloaderTree 确实在第 9 个向量处:

MODULE ?cstartup

;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)

EXTERN __iar_program_start
EXTERN g_bootloaderTree
PUBLIC __vector_table
PUBLIC __vector_table_0x1c

DATA

__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler
DCD DefaultISR
DCD HardFault_Handler
DCD DefaultISR
DCD DefaultISR
DCD UsageFault_Handler
__vector_table_0x1c
DCD SecureFault_Handler
DCD g_bootloaderTree
DCD 0
DCD 0
DCD SVC_Handler
DCD DefaultISR
DCD 0
DCD DefaultISR
DCD SysTick_Handler
;; ...

三、API 原型定义差异

下面是 i.MXRTxxx 系列 ROM API 原型定义及其实例(适用 i.MXRT500/600),基本形式跟 i.MXRT1xxx 差不多,但是 API 功能更丰富,除了 FlexSPI NOR 驱动,还有 iap api、USB low-level driver、otp driver 等(我们知道,i.MXRTxxx 与 LPC 系列同根同源,LPC 系列 ROM 里一般都会集成很多经典 SDK 驱动,比如内部 flash、low power 驱动,有了这些稳定的驱动 API,LPC 系列的用户手册里甚至都会省去这些 IP 的寄存器介绍,直接就是 API 的介绍)。

typedef struct
{
void (*runBootloader)(void *arg);
uint32_t version;
const char *copyright;
const bootloader_context_t *runtimeContext;
const kb_interface_t *kbApi;
const usb_driver_interface_t *usbDriver;
const USBD_API_T *lpcUsbDriver;
const flexspi_nor_flash_driver_t *flexspiNorDriver;
const ocotp_driver_t *otpDriver;
const skboot_authenticate_interface_t *skbootAuthenticate;
} bootloader_api_entry_t;

//! @brief Static API tree.
__root const bootloader_api_entry_t g_bootloaderTree @".rom_api_tree_section" = {
.runBootloader = bootloader_user_entry,
.version = MAKE_VERSION('K', 3, 0, 0),
.copyright = "Copyright 2019 NXP.",
.runtimeContext = &g_bootloaderContext,
.kbApi = &g_romApiInterface,
.usbDriver = &g_usbDriverInterface,
.flexspiNorDriver = &g_flexspiNorFlashDriverInterface,
.otpDriver = &g_otpDriverInterface,
.skbootAuthenticate = &g_skbootAuthenticateInterface,
};

四、API 实例链接差异

i.MXRT1xxx 系列 ROM API 实例 g_bootloaderTree 都是让链接器自由链接的,因此每个具体型号的实际 ROM API 链接地址没有一致的规律可循(这也是为什么要在中断向量表里固定位置统一保存一份),而这点在 i.MXRTxxx 上有了改进,i.MXRTxxx 里将 g_bootloaderTree 放到了 .rom_api_tree_section 段里,在链接文件里将该段固定链接在 ROM 区域最后 4KB 处(BootROM 代码没有把全部 ROM 空间用尽)。

下面是 i.MXRTxxx BootROM 源文件中 g_bootloaderTree 的定义,加了段修饰。此外还有额外的 k_romcrc,标示 API 实例区域的结束。

__root const bootloader_api_entry_t g_bootloaderTree @".rom_api_tree_section" = {
.runBootloader = bootloader_user_entry,
.version = MAKE_VERSION('K', 3, 0, 0),
.copyright = "Copyright 2019 NXP.",
.runtimeContext = &g_bootloaderContext,
// ...
};

__root const uint32_t k_romcrc @".romcrc" = 0xdeadbeef;

下面是 i.MXRTxxx 链接文件(IAR 工程)中 .rom_api_tree_section 段的处理(i.MXRT500 型号示例,ROM 空间是 192KB)。你可能好奇为啥 ROM_API_TREE_xx 等值是放在 0x13000000 开始的安全域 ROM 空间映射,BootROM 属于上电启动第一级,负责芯片系统的安全和启动,当然是工作在安全状态下,可以访问安全域地址空间。

define symbol __ICFEDIT_region_ROM_API_TREE_start__ = 0x1302f000;
define symbol __ICFEDIT_region_ROM_API_TREE_end__ = 0x1302f0ff;
define symbol __ICFEDIT_region_ROM_CRC_CHECKSUM_start__ = 0x1302fffc;
define symbol __ICFEDIT_region_ROM_CRC_CHECKSUM_end__ = 0x1302ffff;

define region ROM_API_TREE_region = mem:[from __ICFEDIT_region_ROM_API_TREE_start__ to __ICFEDIT_region_ROM_API_TREE_end__];
define region ROM_CRC_CHECKSUM = mem:[from __ICFEDIT_region_ROM_CRC_CHECKSUM_start__ to __ICFEDIT_region_ROM_CRC_CHECKSUM_end__];

place in ROM_API_TREE_region { section .rom_api_tree_section };
place in ROM_CRC_CHECKSUM { section .romcrc };

基于上面的设计,你才会在 i.MXRT500 参考手册里 Non-Secure Boot ROM 章节看到如下 ROM API 地址及结构信息图(图中仅标了常用的 API 功能函数),实际 ROM API 调用时,App 的执行其实都是经过 ROM 引导和认证的,App 中既可以访问安全域地址(0x1302f000)来调用 API,也可以访问非安全域地址(0x0302f000)来调用 API。


最后再来回答前面卖的关子,为什么 i.MXRTxxx 系列通过 BootROM 中断向量表第 9 个向量值来访问 ROM API 这种方式并不可取?其实从 BootROM 煞费苦心地将 g_bootloaderTree 固定链接在 ROM 区域最后 4KB 处,你就能看出其用意。如果你挂上调试器直接访问 i.MXRTxxx 的 ROM 区域前 20KB 的空间,你会发现无法访问,在 App 里 AHB 方式读这个区域,也会直接产生 HardFault,因为 BootROM 里做了特殊设计故意隐藏了前 20KB 空间,这个空间里存放了 BootROM 想要保护的数据和代码,至于内容是啥,纯属机密,恕不奉告,哈哈。

至此,i.MXRTxxx 系列 ROM API 设计细节痞子衡便介绍完毕了,掌声在哪里~~~

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ROM
    ROM
    +关注

    关注

    4

    文章

    574

    浏览量

    85807
  • API
    API
    +关注

    关注

    2

    文章

    1502

    浏览量

    62117
收藏 人收藏

    评论

    相关推荐

    api驱动的云服务是什么意思?

    API驱动的云服务是指利用API威廉希尔官方网站 来驱动和提供云服务的模式。在这种模式下,云服务提供商会公开一系列API接口,允许开发者或应用程序通过调用这些A
    的头像 发表于 11-14 10:06 208次阅读

    ROM对计算机性能的影响

    只读存储器(ROM)是计算机硬件中的一个重要组成部分,它负责存储计算机启动时必需的固件和基本输入输出系统(BIOS)。ROM的性能和质量对计算机的整体性能有着深远的影响。 ROM的基本概念 R
    的头像 发表于 11-04 10:31 369次阅读

    ROM数据丢失的常见原因

    ROM(Read-Only Memory,只读存储器)是一种非易失性存储器,用于存储固件或系统软件,这些数据在断电后仍然可以保留。ROM数据丢失可能会导致设备无法启动或功能异常。 ROM数据丢失
    的头像 发表于 11-04 10:29 808次阅读

    了解ROM与固态硬盘的关系

    在计算机存储领域,ROM(Read-Only Memory,只读存储器)和固态硬盘(Solid State Drive,简称SSD)是两种不同类型的存储威廉希尔官方网站 。它们在功能、用途和性能上有着明显的区别
    的头像 发表于 11-04 10:24 687次阅读

    手机中的ROM与内存的区别

    1. ROM(只读存储器) 定义: ROM是一种非易失性存储器,这意味着即使在断电的情况下,存储在ROM中的数据也不会丢失。在智能手机中,ROM主要用于存储固件和操作系统,以及一些预装
    的头像 发表于 11-04 10:23 1133次阅读

    ROM在嵌入式系统中的应用

    ROM(Read-Only Memory,只读存储器)是一种非易失性存储器,即使在断电的情况下也能保持存储的数据。在嵌入式系统中,ROM扮演着至关重要的角色,它用于存储固件、操作系统、配置数据和启动
    的头像 发表于 11-04 10:06 397次阅读

    如何选择适合的ROM类型

    在现代电子设备和计算机系统中,ROM扮演着至关重要的角色。它用于存储固件、操作系统、启动代码以及其他重要的系统信息。随着威廉希尔官方网站 的发展,ROM的种类和特性也在不断变化。 1. ROM的基本概念 R
    的头像 发表于 11-04 10:04 415次阅读

    固态ROM的工作原理

    在计算机和电子设备的发展历程中,存储威廉希尔官方网站 扮演了至关重要的角色。其中,固态ROM作为一种可靠的非易失性存储解决方案,被广泛应用于各种设备中。 ROM的基本结构 ROM的基本结构由存储单元、地址解码器
    的头像 发表于 11-04 10:03 528次阅读

    什么是ROM存储器的定义

    一、ROM存储器的定义 ROM存储器是一种在计算机和电子设备中用于存储固定数据的存储器。与RAM(随机存取存储器)不同,ROM存储器中的数据在断电后不会丢失,因此它被广泛用于存储不经常改变的系统软件
    的头像 发表于 11-04 09:59 748次阅读

    什么是RAM和ROM

    RAM(Random Access Memory,随机存取存储器)和ROM(Read-Only Memory,只读存储器)是计算机存储系统中的两种重要组成部分,它们在计算机的性能和功能上扮演着不同的角色。下面将分别详细解释RAM和ROM的定义、特点、工作原理、类型及其在计
    的头像 发表于 08-30 11:38 4213次阅读

    不同J-Link版本对于i.MXRT1170连接复位后处理行为

    大家好,我是痞子衡,是正经搞威廉希尔官方网站 的痞子。今天痞子衡给大家介绍的是不同J-Link版本对于i.MXRT1170连接复位后处理行为。
    的头像 发表于 08-08 15:29 448次阅读
    不同J-Link版本对于<b class='flag-5'>i.MXRT</b>1170连接复位后处理行为

    改变ROM版本后,利用API获取到的ROM版本还是最后一次升级的版本,无法检测最新版,为什么?

    你好: 在网页端设置ROM版本后 version.png (1.12 KiB) Viewed 19671 times ,利用列出用户的所有设备 API(GET /v1/user/devices/)列出的设备版本还是未改变,请问是哪里设置不正确吗?
    发表于 07-15 06:38

    华为云发布 CodeArts API,为 API 护航

    4 月 10 日,华为云正式发布 API 全生命周期管理一体化协作平台 CodeArts API,支持开发者高效实现 API 设计、开发、测试、托管、运维、变现的一站式体验。以 API
    的头像 发表于 05-09 23:17 540次阅读
    华为云发布 CodeArts <b class='flag-5'>API</b>,为 <b class='flag-5'>API</b> 护航

    i.MXRT1xxx系列上用NAND型启动设备时可用两级设计缩短启动时间

    去年痞子衡写过一篇骚操作文章 《借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间》,这对于 NAND 型启动设备上程序热重启时间的缩短非常有帮助。我们知道随着项目进程的推进
    的头像 发表于 05-01 09:19 776次阅读
    在<b class='flag-5'>i.MXRT</b>1xxx<b class='flag-5'>系列</b>上用NAND型启动设备时可用两级设计缩短启动时间

    Kubernetes Gateway API攻略教程

    Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程。这其中包括一套更标准、更强大的 API资源,用于管理已暴露的服务。在这篇文章中,我将介绍 Gateway
    的头像 发表于 01-12 11:32 902次阅读
    Kubernetes Gateway <b class='flag-5'>API</b>攻略教程