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

    文章

    578

    浏览量

    88547
  • API
    API
    +关注

    关注

    2

    文章

    2153

    浏览量

    66241
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    淘宝京东拼多多API:电商供应链优化的关键钥匙

    = sqrt{frac{sum_{i=1}^n (d_i - bar{d})^2}{n}} $$ 二、三大平台API能力解析 淘宝API :   # 商品库存实时同步示例import
    的头像 发表于 12-01 14:43 90次阅读
    淘宝京东拼多多<b class='flag-5'>API</b>:电商供应链优化的关键钥匙

    如何通过API获取1688平台商品详情

    获取商品详情,包括API概述、访问方法、请求示例和代码实现。 1. API概述 1688平台提供了一系列开放API接口,允许开发者获取商品信息、订单数据等。其中,获取商品详情的
    的头像 发表于 11-11 14:00 306次阅读
    如何通过<b class='flag-5'>API</b>获取1688平台商品详情

    教你如何使用API

    一、了解API API(Application Programming Interface)即应用程序编程接口,是一种使不同的应用程序能共享数据和功能的软件工具。API可以通过网络、软件或硬件实现
    的头像 发表于 11-09 17:48 1036次阅读

    恩智浦i.MXRT1180的FlexSPI NOR启动连接方式

    最近属于i.MXRT11xx阵营的第二代旗舰i.MXRT1180正式发布了,今天咱们就来介绍它的FlexSPI NOR启动连接方式,在阅读本文前最好把FlexSPI NOR启动连接方式(RT1060)先看完,对i.MXRT1xx
    的头像 发表于 11-08 10:20 5684次阅读
    恩智浦<b class='flag-5'>i.MXRT</b>1180的FlexSPI NOR启动连接方式

    Python调用API教程

    随着互联网技术的发展,API(Application Programming Interface)的应用越来越广泛。API是指一系列预先定义好的接口,用于以标准化的形式、规范的方式、安全高效地完成
    的头像 发表于 11-03 09:15 327次阅读

    教你如何使用API接口获取数据!

    一、了解API API(Application Programming Interface)即应用程序编程接口,是一种使不同的应用程序能共享数据和功能的软件工具。API可以通过网络、软件或硬件实现
    的头像 发表于 11-03 09:14 338次阅读

    亚马逊商品评论API接口技术指南

    ​ 一、API接口概述 亚马逊商品评论API(Product Reviews API)允许开发者通过程序化方式获取指定商品的用户评价数据。该接口返回结构化数据,包括: 评论内容及评分(1-5星
    的头像 发表于 10-21 15:40 286次阅读
    亚马逊商品评论<b class='flag-5'>API</b>接口技术指南

    RESTful API设计原则: 构建易用、可扩展的API接口

    在当今微服务架构和分布式系统盛行的时代,RESTful API已成为系统间通信的核心桥梁。优秀的API设计不仅能提升开发效率,还能显著降低系统维护成本。本文将深入探讨如何遵循REST
    的头像 发表于 10-20 13:45 336次阅读

    Vue3组合式API最佳实践:从Options API到Composition API

    简介 在Vue.js中,Options API一直是主流的开发方式。不过随着Vue3的推出,Composition API作为一种全新的开发方式引起了广泛关注。本文将从Options API
    的头像 发表于 10-20 13:36 166次阅读

    代购系统 API 介绍

    1. 用户相关 API 用户注册 POST /api/users/register 参数:username, email, password, phone 返回:user_id, token 用户
    的头像 发表于 10-08 09:21 151次阅读

    多个i.MXRT共享一颗Flash启动的方法与实践(下)

    在 《多个i.MXRT共享一颗Flash启动的方法与实践(上)》 一文里痞子衡给大家从理论上介绍一种多 i.MXRT 共享 Flash 启动的方法,但是理论虽好,如果没有经过实践验证切实可行,不过是纸上谈兵,所以今天痞子衡就找了两个 i
    的头像 发表于 06-05 10:04 1033次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗Flash启动的方法与实践(下)

    多个i.MXRT共享一颗Flash启动的方法与实践(上)

    有些客户应用会采用多颗 i.MXRT 芯片设计一主多从的硬件架构(目的不一,或仿多核 MCU 系统、或拓展 GPIO 数量),因为 i.MXRT 片内无非易失性存储器,这时候为整个系统配置合适的启动设备保证每个 i.MXRT
    的头像 发表于 06-05 10:01 1004次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗Flash启动的方法与实践(上)

    如何获取 OpenAI API Key?API 获取与代码调用示例 (详解教程)

    OpenAI API Key 获取与使用详解:从入门到精通 OpenAI 正以其 GPT 和 DALL-E 等先进模型引领全球人工智能创新。其 API 为开发者和企业提供了强大的 AI 能力集成途径
    的头像 发表于 05-04 11:42 1.2w次阅读
    如何获取 OpenAI <b class='flag-5'>API</b> Key?<b class='flag-5'>API</b> 获取与代码调用示例 (详解教程)

    主从系统中i.MXRT系列MCU从主处理器接收App数据包超时机制

    i.MXRT内置ROM程序配套的与主机交互方法,有如下三种。其中方法一是比较常用的,把PC当作主机,因为UART/USB接口可以直接从PC引出,这种方式一般集成在上位机GUI工具里(比如恩智浦官方
    的头像 发表于 04-17 10:54 1567次阅读
    主从系统中<b class='flag-5'>i.MXRT</b><b class='flag-5'>系列</b>MCU从主处理器接收App数据包超时机制

    如何使用MCX N ROM API进行内部闪存擦除/编程?

    使用 MCX N ROM API 进行内部闪存擦除/编程
    发表于 03-27 07:04