那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

i.MXRT系列的ROM API設(shè)計(jì)

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-10-30 10:52 ? 次閱讀

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 i.MXRTxxx 系列 ROM API 設(shè)計(jì)細(xì)節(jié)。

痞子衡之前寫過(guò)兩篇文章 《利用 i.MXRT1xxx 系列 ROM 提供的 FlexSPI driver API 可輕松 IAP》、《其實(shí) i.MXRT1050,1020,1015 系列 ROM 也提供了 FlexSPI driver API》 基本把 i.MXRT1xxx 全系列的 ROM API 及其 FlexSPI NOR 驅(qū)動(dòng)設(shè)計(jì)都講清楚了,其實(shí) i.MXRTxxx 系列的 ROM API 設(shè)計(jì)跟 i.MXRT1xxx 系列的設(shè)計(jì)思路差不多(其實(shí)本就是同一個(gè)恩智浦研發(fā)小組負(fù)責(zé)的),僅有一些微小區(qū)別,本文痞子衡主要就是點(diǎn)出那些區(qū)別。

一、ROM 基址差異

ROM API 代碼首先是在 BootROM 里,BootROM 代碼是出廠前固化在 ROM 區(qū)域的。因?yàn)榧軜?gòu)設(shè)計(jì)的關(guān)系,i.MXRTxxx 系列和 i.MXRT1xxx 系列的 ROM 區(qū)域在系統(tǒng)內(nèi)存里的映射地址不同。

下表是 i.MXRTxxx 系列代表型號(hào) i.MXRT500 的部分系統(tǒng)內(nèi)存映射,可以看到 ROM 區(qū)域起始地址是 0x03000000(非安全域)。目前 i.MXRTxxx 都是 Cortex-M33 內(nèi)核,支持 TrustZone 特性,所以 0x13000000 也是 ROM 起始地址(安全域),為了通用性,我們認(rèn) 0x03000000 就可以了,這個(gè)地址在安全狀態(tài)和非安全狀態(tài)下都能被訪問(wèn)。


下表是 i.MXRT1xxx 系列代表型號(hào) i.MXRT1060 的部分系統(tǒng)內(nèi)存映射,可以看到 ROM 區(qū)域起始地址是 0x00200000。i.MXRT1xxx 系列都是 Cortex-M7 內(nèi)核,沒(méi)有 TrustZone 特性,不存在 i.MXRTxxx 上那樣的兩種狀態(tài)域下的地址。


二、API 基址備份位置差異

在 i.MXRT1xxx 系列 ROM API 介紹的文章里,痞子衡介紹過(guò) g_bootloaderTree 地址值被復(fù)制了一份放在了 BootROM 中斷向量表第 8 個(gè)向量的位置處(該向量為 ARMv7-M 架構(gòu)下未定義的系統(tǒng)向量),因此讀取 0x0020001c 處開始的 4bytes 便能找到 i.MXRT1xxx 系列的 g_bootloaderTree。

但是由于 i.MXRTxxx 是 Cortex-M33 內(nèi)核,屬于 ARMv8-M 架構(gòu),從下圖中可以看出 ARMv8-M 架構(gòu)下中斷向量表第 8 個(gè)向量是 SecureFault,已經(jīng)被定義了,因此 BootROM 把 g_bootloaderTree 地址值放到了第 9 個(gè)向量的位置處(該向量為 ARMv8-M 架構(gòu)下未定義的系統(tǒng)向量),故讀取 0x03000020 處開始的 4bytes 才能找到 i.MXRTxxx 系列的 g_bootloaderTree(這種方式在實(shí)際 API 調(diào)用中并不可取,至于原因嘛,先賣個(gè)關(guān)子)。

下面是 i.MXRT500 BootROM 工程的 startup 文件(IAR 版),g_bootloaderTree 確實(shí)在第 9 個(gè)向量處:

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 原型定義及其實(shí)例(適用 i.MXRT500/600),基本形式跟 i.MXRT1xxx 差不多,但是 API 功能更豐富,除了 FlexSPI NOR 驅(qū)動(dòng),還有 iap api、USB low-level driver、otp driver 等(我們知道,i.MXRTxxx 與 LPC 系列同根同源,LPC 系列 ROM 里一般都會(huì)集成很多經(jīng)典 SDK 驅(qū)動(dòng),比如內(nèi)部 flash、low power 驅(qū)動(dòng),有了這些穩(wěn)定的驅(qū)動(dòng) API,LPC 系列的用戶手冊(cè)里甚至都會(huì)省去這些 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 實(shí)例鏈接差異

i.MXRT1xxx 系列 ROM API 實(shí)例 g_bootloaderTree 都是讓鏈接器自由鏈接的,因此每個(gè)具體型號(hào)的實(shí)際 ROM API 鏈接地址沒(méi)有一致的規(guī)律可循(這也是為什么要在中斷向量表里固定位置統(tǒng)一保存一份),而這點(diǎn)在 i.MXRTxxx 上有了改進(jìn),i.MXRTxxx 里將 g_bootloaderTree 放到了 .rom_api_tree_section 段里,在鏈接文件里將該段固定鏈接在 ROM 區(qū)域最后 4KB 處(BootROM 代碼沒(méi)有把全部 ROM 空間用盡)。

下面是 i.MXRTxxx BootROM 源文件中 g_bootloaderTree 的定義,加了段修飾。此外還有額外的 k_romcrc,標(biāo)示 API 實(shí)例區(qū)域的結(jié)束。

__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 型號(hào)示例,ROM 空間是 192KB)。你可能好奇為啥 ROM_API_TREE_xx 等值是放在 0x13000000 開始的安全域 ROM 空間映射,BootROM 屬于上電啟動(dòng)第一級(jí),負(fù)責(zé)芯片系統(tǒng)的安全和啟動(dòng),當(dāng)然是工作在安全狀態(tài)下,可以訪問(wèn)安全域地址空間。

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 };

基于上面的設(shè)計(jì),你才會(huì)在 i.MXRT500 參考手冊(cè)里 Non-Secure Boot ROM 章節(jié)看到如下 ROM API 地址及結(jié)構(gòu)信息圖(圖中僅標(biāo)了常用的 API 功能函數(shù)),實(shí)際 ROM API 調(diào)用時(shí),App 的執(zhí)行其實(shí)都是經(jīng)過(guò) ROM 引導(dǎo)和認(rèn)證的,App 中既可以訪問(wèn)安全域地址(0x1302f000)來(lái)調(diào)用 API,也可以訪問(wèn)非安全域地址(0x0302f000)來(lái)調(diào)用 API。


最后再來(lái)回答前面賣的關(guān)子,為什么 i.MXRTxxx 系列通過(guò) BootROM 中斷向量表第 9 個(gè)向量值來(lái)訪問(wèn) ROM API 這種方式并不可取?其實(shí)從 BootROM 煞費(fèi)苦心地將 g_bootloaderTree 固定鏈接在 ROM 區(qū)域最后 4KB 處,你就能看出其用意。如果你掛上調(diào)試器直接訪問(wèn) i.MXRTxxx 的 ROM 區(qū)域前 20KB 的空間,你會(huì)發(fā)現(xiàn)無(wú)法訪問(wèn),在 App 里 AHB 方式讀這個(gè)區(qū)域,也會(huì)直接產(chǎn)生 HardFault,因?yàn)?BootROM 里做了特殊設(shè)計(jì)故意隱藏了前 20KB 空間,這個(gè)空間里存放了 BootROM 想要保護(hù)的數(shù)據(jù)和代碼,至于內(nèi)容是啥,純屬機(jī)密,恕不奉告,哈哈。

至此,i.MXRTxxx 系列 ROM API 設(shè)計(jì)細(xì)節(jié)痞子衡便介紹完畢了,掌聲在哪里~~~

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ROM
    ROM
    +關(guān)注

    關(guān)注

    4

    文章

    575

    瀏覽量

    85991
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1510

    瀏覽量

    62395
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    api驅(qū)動(dòng)的云服務(wù)是什么意思?

    API驅(qū)動(dòng)的云服務(wù)是指利用API技術(shù)來(lái)驅(qū)動(dòng)和提供云服務(wù)的模式。在這種模式下,云服務(wù)提供商會(huì)公開一系列API接口,允許開發(fā)者或應(yīng)用程序通過(guò)調(diào)用這些A
    的頭像 發(fā)表于 11-14 10:06 ?246次閱讀

    ROM對(duì)計(jì)算機(jī)性能的影響

    只讀存儲(chǔ)器(ROM)是計(jì)算機(jī)硬件中的一個(gè)重要組成部分,它負(fù)責(zé)存儲(chǔ)計(jì)算機(jī)啟動(dòng)時(shí)必需的固件和基本輸入輸出系統(tǒng)(BIOS)。ROM的性能和質(zhì)量對(duì)計(jì)算機(jī)的整體性能有著深遠(yuǎn)的影響。 ROM的基本概念 R
    的頭像 發(fā)表于 11-04 10:31 ?507次閱讀

    ROM數(shù)據(jù)丟失的常見原因

    ROM(Read-Only Memory,只讀存儲(chǔ)器)是一種非易失性存儲(chǔ)器,用于存儲(chǔ)固件或系統(tǒng)軟件,這些數(shù)據(jù)在斷電后仍然可以保留。ROM數(shù)據(jù)丟失可能會(huì)導(dǎo)致設(shè)備無(wú)法啟動(dòng)或功能異常。 ROM數(shù)據(jù)丟失
    的頭像 發(fā)表于 11-04 10:29 ?1133次閱讀

    了解ROM與固態(tài)硬盤的關(guān)系

    在計(jì)算機(jī)存儲(chǔ)領(lǐng)域,ROM(Read-Only Memory,只讀存儲(chǔ)器)和固態(tài)硬盤(Solid State Drive,簡(jiǎn)稱SSD)是兩種不同類型的存儲(chǔ)技術(shù)。它們?cè)诠δ堋⒂猛竞托阅苌嫌兄黠@的區(qū)別
    的頭像 發(fā)表于 11-04 10:24 ?989次閱讀

    手機(jī)中的ROM與內(nèi)存的區(qū)別

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

    ROM在嵌入式系統(tǒng)中的應(yīng)用

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

    如何選擇適合的ROM類型

    在現(xiàn)代電子設(shè)備和計(jì)算機(jī)系統(tǒng)中,ROM扮演著至關(guān)重要的角色。它用于存儲(chǔ)固件、操作系統(tǒng)、啟動(dòng)代碼以及其他重要的系統(tǒng)信息。隨著技術(shù)的發(fā)展,ROM的種類和特性也在不斷變化。 1. ROM的基本概念 R
    的頭像 發(fā)表于 11-04 10:04 ?636次閱讀

    固態(tài)ROM的工作原理

    在計(jì)算機(jī)和電子設(shè)備的發(fā)展歷程中,存儲(chǔ)技術(shù)扮演了至關(guān)重要的角色。其中,固態(tài)ROM作為一種可靠的非易失性存儲(chǔ)解決方案,被廣泛應(yīng)用于各種設(shè)備中。 ROM的基本結(jié)構(gòu) ROM的基本結(jié)構(gòu)由存儲(chǔ)單元、地址解碼器
    的頭像 發(fā)表于 11-04 10:03 ?785次閱讀

    什么是ROM存儲(chǔ)器的定義

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

    請(qǐng)問(wèn)TAS5754m在使用ROM flow時(shí),I2S可以支持到96KHz嗎?

    請(qǐng)問(wèn)TAS5754m在使用ROM flow時(shí),I2S可以支持到96KHz嗎?
    發(fā)表于 10-22 08:28

    什么是RAM和ROM

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

    不同J-Link版本對(duì)于i.MXRT1170連接復(fù)位后處理行為

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是不同J-Link版本對(duì)于i.MXRT1170連接復(fù)位后處理行為。
    的頭像 發(fā)表于 08-08 15:29 ?507次閱讀
    不同J-Link版本對(duì)于<b class='flag-5'>i.MXRT</b>1170連接復(fù)位后處理行為

    改變ROM版本后,利用API獲取到的ROM版本還是最后一次升級(jí)的版本,無(wú)法檢測(cè)最新版,為什么?

    你好: 在網(wǎng)頁(yè)端設(shè)置ROM版本后 version.png (1.12 KiB) Viewed 19671 times ,利用列出用戶的所有設(shè)備 API(GET /v1/user/devices/)列出的設(shè)備版本還是未改變,請(qǐng)問(wèn)是哪里設(shè)置不正確嗎?
    發(fā)表于 07-15 06:38

    華為云發(fā)布 CodeArts API,為 API 護(hù)航

    4 月 10 日,華為云正式發(fā)布 API 全生命周期管理一體化協(xié)作平臺(tái) CodeArts API,支持開發(fā)者高效實(shí)現(xiàn) API 設(shè)計(jì)、開發(fā)、測(cè)試、托管、運(yùn)維、變現(xiàn)的一站式體驗(yàn)。以 API
    的頭像 發(fā)表于 05-09 23:17 ?579次閱讀
    華為云發(fā)布 CodeArts <b class='flag-5'>API</b>,為 <b class='flag-5'>API</b> 護(hù)航

    i.MXRT1xxx系列上用NAND型啟動(dòng)設(shè)備時(shí)可用兩級(jí)設(shè)計(jì)縮短啟動(dòng)時(shí)間

    去年痞子衡寫過(guò)一篇騷操作文章 《借助i.MXRT10xx系列INIT_VTOR功能可以縮短程序熱重啟時(shí)間》,這對(duì)于 NAND 型啟動(dòng)設(shè)備上程序熱重啟時(shí)間的縮短非常有幫助。我們知道隨著項(xiàng)目進(jìn)程的推進(jìn)
    的頭像 發(fā)表于 05-01 09:19 ?830次閱讀
    在<b class='flag-5'>i.MXRT</b>1xxx<b class='flag-5'>系列</b>上用NAND型啟動(dòng)設(shè)備時(shí)可用兩級(jí)設(shè)計(jì)縮短啟動(dòng)時(shí)間
    优博百家乐官网yobo88| 百家乐官网庄闲和收益| 榆次百家乐的玩法技巧和规则| 百家乐官网赌博机玩法| 棋牌网站| 赌场百家乐投注公式| 澳门百家乐官网玩法| 百乐门娱乐城注册| 百家乐游戏厅| 至尊百家乐官网娱乐场开户注册 | 大发888九州娱乐城| 百家乐的视频百家乐| 百家乐官网破解版| 东辽县| 大发888娱乐城登陆| 百家乐龙虎玩| 百家乐百家乐视频| 东莞百家乐官网的玩法技巧和规则| 10BET娱乐城| 大发888在线赌场网站| 顶尖百家乐官网学习| 香港六合彩开奖现场直播| 大发888 894| 百家乐真人游戏娱乐平台| 百家乐太阳城线上| 百利宫百家乐官网的玩法技巧和规则| 玩百家乐官网保时捷娱乐城| 阳信县| 水果机赌博| 明升 | 怎样打百家乐的玩法技巧和规则| 百家乐游戏机出千| 百家乐官网棋牌游戏开发| 百家乐官网英皇娱乐场开户注册| 百家乐官网赌场走势图| 金臂百家乐官网注册送彩金| 信誉博彩网| 丰禾娱乐城开户| a8娱乐城开户| 大赢家博彩网| 皇冠备用投注网|