在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    575

    瀏覽量

    86002
  • API
    API
    +關注

    關注

    2

    文章

    1512

    瀏覽量

    62415
收藏 人收藏

    評論

    相關推薦

    api驅動的云服務是什么意思?

    API驅動的云服務是指利用API技術來驅動和提供云服務的模式。在這種模式下,云服務提供商會公開一系列API接口,允許開發者或應用程序通過調用這些A
    的頭像 發表于 11-14 10:06 ?252次閱讀

    ROM對計算機性能的影響

    只讀存儲器(ROM)是計算機硬件中的一個重要組成部分,它負責存儲計算機啟動時必需的固件和基本輸入輸出系統(BIOS)。ROM的性能和質量對計算機的整體性能有著深遠的影響。 ROM的基本概念 R
    的頭像 發表于 11-04 10:31 ?512次閱讀

    ROM數據丟失的常見原因

    ROM(Read-Only Memory,只讀存儲器)是一種非易失性存儲器,用于存儲固件或系統軟件,這些數據在斷電后仍然可以保留。ROM數據丟失可能會導致設備無法啟動或功能異常。 ROM數據丟失
    的頭像 發表于 11-04 10:29 ?1155次閱讀

    了解ROM與固態硬盤的關系

    在計算機存儲領域,ROM(Read-Only Memory,只讀存儲器)和固態硬盤(Solid State Drive,簡稱SSD)是兩種不同類型的存儲技術。它們在功能、用途和性能上有著明顯的區別
    的頭像 發表于 11-04 10:24 ?1011次閱讀

    手機中的ROM與內存的區別

    1. ROM(只讀存儲器) 定義: ROM是一種非易失性存儲器,這意味著即使在斷電的情況下,存儲在ROM中的數據也不會丟失。在智能手機中,ROM主要用于存儲固件和操作系統,以及一些預裝
    的頭像 發表于 11-04 10:23 ?1389次閱讀

    ROM在嵌入式系統中的應用

    ROM(Read-Only Memory,只讀存儲器)是一種非易失性存儲器,即使在斷電的情況下也能保持存儲的數據。在嵌入式系統中,ROM扮演著至關重要的角色,它用于存儲固件、操作系統、配置數據和啟動
    的頭像 發表于 11-04 10:06 ?517次閱讀

    如何選擇適合的ROM類型

    在現代電子設備和計算機系統中,ROM扮演著至關重要的角色。它用于存儲固件、操作系統、啟動代碼以及其他重要的系統信息。隨著技術的發展,ROM的種類和特性也在不斷變化。 1. ROM的基本概念 R
    的頭像 發表于 11-04 10:04 ?646次閱讀

    固態ROM的工作原理

    在計算機和電子設備的發展歷程中,存儲技術扮演了至關重要的角色。其中,固態ROM作為一種可靠的非易失性存儲解決方案,被廣泛應用于各種設備中。 ROM的基本結構 ROM的基本結構由存儲單元、地址解碼器
    的頭像 發表于 11-04 10:03 ?802次閱讀

    什么是ROM存儲器的定義

    一、ROM存儲器的定義 ROM存儲器是一種在計算機和電子設備中用于存儲固定數據的存儲器。與RAM(隨機存取存儲器)不同,ROM存儲器中的數據在斷電后不會丟失,因此它被廣泛用于存儲不經常改變的系統軟件
    的頭像 發表于 11-04 09:59 ?1362次閱讀

    請問TAS5754m在使用ROM flow時,I2S可以支持到96KHz嗎?

    請問TAS5754m在使用ROM flow時,I2S可以支持到96KHz嗎?
    發表于 10-22 08:28

    什么是RAM和ROM

    RAM(Random Access Memory,隨機存取存儲器)和ROM(Read-Only Memory,只讀存儲器)是計算機存儲系統中的兩種重要組成部分,它們在計算機的性能和功能上扮演著不同的角色。下面將分別詳細解釋RAM和ROM的定義、特點、工作原理、類型及其在計
    的頭像 發表于 08-30 11:38 ?4915次閱讀

    不同J-Link版本對于i.MXRT1170連接復位后處理行為

    大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是不同J-Link版本對于i.MXRT1170連接復位后處理行為。
    的頭像 發表于 08-08 15:29 ?512次閱讀
    不同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 ?579次閱讀
    華為云發布 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 ?835次閱讀
    在<b class='flag-5'>i.MXRT</b>1xxx<b class='flag-5'>系列</b>上用NAND型啟動設備時可用兩級設計縮短啟動時間
    主站蜘蛛池模板: 99成人| 精品你懂的 | 天天视频黄 | 午夜在线观看福利 | 最近国语剧情视频在线观看 | 韩国韩宝贝2020vip福利视频 | www.色亚洲 | 久久精品免看国产 | 色淫阁色九九 | 中文字幕一区二区三区乱码aⅴ | 人人看人人澡 | 插菊综合网| 欧美三级欧美一级 | 一级a爱片久久毛片 | 欧美性色欧美a在线播放 | 五月婷婷狠狠 | 免费在线播放毛片 | 性欧美黑人xxxx | 精品视频一区二区三区四区五区 | 久久99精品久久久久久久不卡 | 色四虎 | 午夜黄色大片 | 黄色在线观看视频 | 国产在线视频你懂得 | 婷婷六| 天天做天天爽天天谢 | 四虎新网站 | www.丁香.com | 精品一区亚洲 | 亚洲天堂视频在线观看免费 | 亚洲 欧美 中文字幕 | 99久久国产免费中文无字幕 | www淫| 无人码一区二区三区视频 | 五月激情婷婷网 | sss华人在线play | 日本国产中文字幕 | 手机看片福利在线 | 婷婷激情五月 | 日本在线一级 | 日本免费不卡视频一区二区三区 |