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

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

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

系統(tǒng)時(shí)鐘配置不當(dāng)導(dǎo)致OTFAD加密啟動(dòng)失敗的解決方案

西西 ? 來(lái)源:與非網(wǎng) ? 作者:痞子衡 ? 2021-03-07 13:00 ? 次閱讀

今天痞子衡給大家分享的是系統(tǒng)時(shí)鐘配置不當(dāng)會(huì)導(dǎo)致i.MXRT1xxx系列下OTFAD加密啟動(dòng)失敗問(wèn)題。

我們知道,i.MXRT1xxx家族早期型號(hào)(RT1050/RT0160/RT1020)的硬件解密外設(shè)名字叫BEE,這個(gè)外設(shè)主要是配合FlexSPI外設(shè)去實(shí)現(xiàn)外接串行NOR Flash在線(xiàn)解密XIP執(zhí)行用的。而到了最近的i.MXRT1xxx新型號(hào)(RT1010/RT1170)上,BEE外設(shè)被替換成了OTFAD外設(shè),功能不變,解密效率得到了很大提升,但客戶(hù)在使能OTFAD加密啟動(dòng)時(shí)常常遇到App無(wú)法正常運(yùn)行問(wèn)題,這其實(shí)跟OTFAD自身的一個(gè)時(shí)鐘小限制有關(guān)(這個(gè)限制在BEE上不存在),今天痞子衡就來(lái)好好聊一聊OTFAD的這個(gè)小限制:

一、問(wèn)題描述

我們以i.MXRT1010為例,從恩智浦官網(wǎng)下載一個(gè)SDK包(痞子衡下的是v2.9.1),隨便選擇其中一個(gè)例程,就以最簡(jiǎn)單的 \SDK\boards\evkmimxrt1010\demo_apps\led_blinky 為例吧。編譯這個(gè) led_blinky 工程(選擇 flexspi_nor_debug build,即XIP工程),得到可執(zhí)行文件(實(shí)際bin文件大小為10KB左右),使用 NXP-MCUBootUtility 工具將可執(zhí)行文件(led_blinky.out)下載進(jìn)MIMXRT1010-EVK開(kāi)發(fā)板中(下載時(shí)啟動(dòng)模式為2'b01,啟動(dòng)時(shí)切換到2'b10),可以看到板載綠色LED小燈(D25)會(huì)閃,例程是可以正常工作的。

現(xiàn)在讓我們嘗試使能OTFAD加密,回到芯片下載模式依然借助 NXP-MCUBootUtility 工具,將工具 Secure boot type 選項(xiàng)切換為 OTFAD Encrypted Image Boot,其他設(shè)置均默認(rèn)(此時(shí)加密范圍是 0x60001000 - 0x60001fff,僅加密IVT等啟動(dòng)頭,不含app),再次下載可執(zhí)行文件(led_blinky.out),換到芯片啟動(dòng)模式復(fù)位板子,例程依舊是正常工作的,看起來(lái)OTFAD加密啟動(dòng)似乎沒(méi)有問(wèn)題。

讓我們?cè)龠M(jìn)一步,將加密范圍設(shè)置為0x60002000 - 0x60004fff,這時(shí)加密區(qū)域覆蓋到了整個(gè)app,重新按上述流程操作一遍,發(fā)現(xiàn)例程沒(méi)能正常工作,這時(shí)候OTFAD加密啟動(dòng)出了問(wèn)題,難道app區(qū)域不能被加密?那OTFAD加密還有啥意義?

app區(qū)域當(dāng)然可以被加密,跟著痞子衡再做一次實(shí)驗(yàn),在 led_blinky.c 文件的 main() 函數(shù)中,我們將時(shí)鐘配置函數(shù) BOARD_BootClockRUN() 直接注釋掉或者在鏈接文件里將其全部搞成 __ramfunc(即在芯片內(nèi)部RAM里執(zhí)行這部分時(shí)鐘配置代碼),這個(gè)例程僅是利用SysTick定時(shí)翻轉(zhuǎn)GPIO,因此時(shí)鐘配置代碼去掉不影響正常運(yùn)行,重新編譯工程再按上面流程操作一遍,這時(shí)候例程又能正常工作了,說(shuō)明加密后的app是能被OTFAD正常解密執(zhí)行的。

現(xiàn)在的問(wèn)題變成了為何OTFAD加密啟動(dòng)時(shí),BOARD_BootClockRUN() 函數(shù)不能在Flash里執(zhí)行,這就是問(wèn)題所在。

二、原因分析

關(guān)于上述問(wèn)題的原因,痞子衡先直接給答案,這是OTFAD外設(shè)本身的時(shí)鐘小限制,當(dāng)OTFAD被使能時(shí),如果被加密的app代碼是XIP執(zhí)行,app里做系統(tǒng)時(shí)鐘配置時(shí)要始終保證Core時(shí)鐘高于FlexSPI外設(shè)時(shí)鐘。如果Core時(shí)鐘低于FlexSPI時(shí)鐘,此時(shí)Core去訪(fǎng)問(wèn)加密Flash區(qū)域,OTFAD無(wú)法正常解密,會(huì)導(dǎo)致指令錯(cuò)亂,發(fā)生系統(tǒng)故障。

我們配合上面的i.MXRT1010系統(tǒng)時(shí)鐘樹(shù)來(lái)認(rèn)真分析下OTFAD這個(gè)時(shí)鐘限制問(wèn)題。芯片上電總是從BootROM執(zhí)行,BootROM會(huì)先將Core配置到396MHz,將FlexSPI時(shí)鐘根據(jù)用戶(hù)放置在Flash偏移0x400處的FDCB里的設(shè)定配到30MHz - 200MHz不等,再讀取Flash偏移0地址處OTFAD DEK KeyBlob數(shù)據(jù)使能OTFAD,然后讀取IVT等頭信息去跳轉(zhuǎn)到App。很顯然只加密IVT部分根本不受OTFAD限制的影響,這部分解析是在BootROM里完成的,BootROM里時(shí)鐘配置符合OTFAD時(shí)鐘限制要求。

// BootROM里對(duì)Core時(shí)鐘配置
CCM_ANALOG->PFD_528[PFD3_FRAC] = 24,   PLL2 PFD3輸出 (528MHz * 18) / 24 = 396MHz
CCM->CBCMR[PRE_PERIPH_CLK_SEL] = 2,    時(shí)鐘來(lái)自PLL2 PFD3
CCM->CBCDR[PERIPH_CLK_SEL]     = 0,   內(nèi)核時(shí)鐘來(lái)自CCM->CBCMR[PRE_PERIPH_CLK_SEL]
CCM->CBCDR[AHB_PODF]           = 0,   內(nèi)核時(shí)鐘不分頻

// BootROM里對(duì)FlexSPI時(shí)鐘配置
CCM_ANALOG->PFD_480[PFD0_FRAC] = x,    PLL3 PFD0輸出 (480MHz * 18) / x
CCM->CSCMR1[FLEXSPI_CLK_SEL]   = 3,    時(shí)鐘來(lái)自PLL3 PFD0
CCM->CSCMR1[FLEXSPI_CLK_SRC]   = 0,   FlexSPI時(shí)鐘來(lái)自CCM->CSCMR1[FLEXSPI_CLK_SEL]
CCM->CSCMR1[FLEXSPI_PODF]      = y,   FlexSPI時(shí)鐘做(y+1)分頻

當(dāng)BootROM跳轉(zhuǎn)到了App之后,我們?cè)賮?lái)看看App里對(duì)時(shí)鐘是怎么配置的,就是BOARD_BootClockRUN()函數(shù),可以看到這個(gè)函數(shù)里將內(nèi)核頻率從BootROM設(shè)置的396MHz切換到外部OSC 24MHz。無(wú)論此時(shí)用戶(hù)FDCB里對(duì)FlexSPI時(shí)鐘是多少配置,至少也會(huì)大于30MHz,那么此時(shí)24MHz內(nèi)核頻率一定會(huì)低于FlexSPI時(shí)鐘頻率,此時(shí)只要發(fā)生內(nèi)核對(duì)Flash加密區(qū)域的訪(fǎng)問(wèn)(時(shí)鐘配置代碼就在Flash里執(zhí)行),就觸發(fā)了OTFAD時(shí)鐘限制問(wèn)題,App就會(huì)跑飛。

三、解決方案

知道了原因,解決方案就簡(jiǎn)單了,在A(yíng)pp時(shí)鐘配置里,不要按照尋常套路去先將內(nèi)核時(shí)鐘源切換到外部OSC再切到PLL,而是直接切到PLL上。比如i.MXRT1010內(nèi)部有個(gè)PLL6(也叫Audio PLL),固定500MHz,正好是App要的最終內(nèi)核頻率,我們?cè)贐OARD_BootClockRUN()里將Audio(Enet) PLL初始化設(shè)置代碼提到前面,刪掉原來(lái)的切換OSC設(shè)置代碼即可。

voidBOARD_BootClockRUN(void)
{
//此處略去...
/*SetOscillatorreadycountervalue.*/
CCM->CCR=(CCM->CCR&(~CCM_CCR_OSCNT_MASK))|CCM_CCR_OSCNT(127);
-/*SettingPeriphClk2MuxandPeriphMuxtoprovidestableclockbeforePLLsareinitialed*/
-CLOCK_SetMux(kCLOCK_PeriphClk2Mux,1);/*SetPERIPH_CLK2MUXtoOSC*/
-CLOCK_SetMux(kCLOCK_PeriphMux,1);/*SetPERIPH_CLKMUXtoPERIPH_CLK2*/

//此處略去...
/*SetIPG_PODF.*/
CLOCK_SetDiv(kCLOCK_IpgDiv,3);
+/*InitEnetPLL.*/
+CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);
+/*Setpreperiphclocksource.*/
+CLOCK_SetMux(kCLOCK_PrePeriphMux,3);

//此處略去...
/*EnableAudioPLLoutput.*/
CCM_ANALOG->PLL_AUDIO|=CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;
-/*InitEnetPLL.*/
-CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);
-/*Setpreperiphclocksource.*/
-CLOCK_SetMux(kCLOCK_PrePeriphMux,3);

//此處略去...
/*SetSystemCoreClockvariable.*/
SystemCoreClock=BOARD_BOOTCLOCKRUN_CORE_CLOCK;
}

最后再提一下,這個(gè)OTFAD時(shí)鐘限制問(wèn)題在i.MXRT1170上同樣存在,解決思路與上面類(lèi)似,痞子衡就不再贅述了。

至此,系統(tǒng)時(shí)鐘配置不當(dāng)會(huì)導(dǎo)致i.MXRT1xxx系列下OTFAD加密啟動(dòng)失敗問(wèn)題便介紹完畢了
編輯:hfy

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

    關(guān)注

    10

    文章

    1703

    瀏覽量

    131195
  • 時(shí)鐘配置
    +關(guān)注

    關(guān)注

    1

    文章

    14

    瀏覽量

    8604
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C2000 F28004x系列MCU PLL鎖相失敗問(wèn)題解決方案

    電子發(fā)燒友網(wǎng)站提供《C2000 F28004x系列MCU PLL鎖相失敗問(wèn)題解決方案.pdf》資料免費(fèi)下載
    發(fā)表于 09-27 11:24 ?0次下載
    C2000 F28004x系列MCU PLL鎖相<b class='flag-5'>失敗</b>問(wèn)題<b class='flag-5'>解決方案</b>

    ensp啟動(dòng)失敗,錯(cuò)誤代碼40怎么回事

    ENSP(Enterprise Network Simulation Platform)啟動(dòng)失敗并顯示錯(cuò)誤代碼40,通常是由多種原因引起的。以下是一些可能的原因及相應(yīng)的解決方法: 一、可能的原因
    的頭像 發(fā)表于 08-30 14:29 ?5517次閱讀

    晶閘管逆變失敗的原因和解決方案

    晶閘管逆變失敗是電力電子領(lǐng)域中的一個(gè)常見(jiàn)問(wèn)題,它可能由多種因素引起,并可能對(duì)系統(tǒng)造成嚴(yán)重的損害。以下是對(duì)晶閘管逆變失敗原因及解決方法的詳細(xì)探討,旨在提供全面且深入的理解。
    的頭像 發(fā)表于 08-27 16:26 ?535次閱讀

    esp32-c3開(kāi)啟安全啟動(dòng)和flash加密概率不啟動(dòng)是什么原因導(dǎo)致的?

    esp32-c3開(kāi)啟安全啟動(dòng)和flash加密概率不啟動(dòng),重新上電就好了,啟動(dòng)時(shí)候簽名校驗(yàn)錯(cuò)誤,硬件sha256 返回全0,懷疑是燒efuse影響了硬件sha,把硬件sha替換為軟件sh
    發(fā)表于 06-19 06:42

    瑞薩電子推出全新超低25fs-rms時(shí)鐘解決方案

    全球半導(dǎo)體解決方案領(lǐng)域的佼佼者瑞薩電子今日重磅推出FemtoClock? 3,一款專(zhuān)為有線(xiàn)基礎(chǔ)設(shè)施、數(shù)據(jù)中心和工業(yè)應(yīng)用打造的超低25fs-rms時(shí)鐘解決方案。這一創(chuàng)新產(chǎn)品不僅擴(kuò)展了瑞薩電子的時(shí)
    的頭像 發(fā)表于 05-10 11:12 ?492次閱讀

    鴻蒙OpenHarmony開(kāi)發(fā)板:【產(chǎn)品配置規(guī)則】

    產(chǎn)品解決方案為基于開(kāi)發(fā)板的完整產(chǎn)品,主要包含產(chǎn)品對(duì)OS的適配、部件拼裝配置啟動(dòng)配置和文件系統(tǒng)配置等。產(chǎn)品
    的頭像 發(fā)表于 05-09 10:32 ?945次閱讀
    鴻蒙OpenHarmony開(kāi)發(fā)板:【產(chǎn)品<b class='flag-5'>配置</b>規(guī)則】

    STM32 foc2.0無(wú)感啟動(dòng)電流過(guò)大導(dǎo)致啟動(dòng)失敗怎么解決?

    STM32 foc2.0無(wú)感啟動(dòng)電流過(guò)大導(dǎo)致啟動(dòng)失敗
    發(fā)表于 04-22 06:26

    高性?xún)r(jià)比的時(shí)鐘解決方案——SC6301,兼容LMK04828

    高性?xún)r(jià)比的時(shí)鐘解決方案——SC6301,兼容LMK04828
    的頭像 發(fā)表于 04-12 10:06 ?477次閱讀
    高性?xún)r(jià)比的<b class='flag-5'>時(shí)鐘</b><b class='flag-5'>解決方案</b>——SC6301,兼容LMK04828

    STM32L552系統(tǒng)時(shí)鐘或外設(shè)時(shí)鐘配置錯(cuò)誤導(dǎo)致系統(tǒng)不穩(wěn)定的原因?怎么解決?

    系統(tǒng)時(shí)鐘或外設(shè)時(shí)鐘配置錯(cuò)誤導(dǎo)致系統(tǒng)不穩(wěn)定
    發(fā)表于 03-20 07:59

    BLDC電機(jī)啟動(dòng)失敗的原因?

    我在學(xué)習(xí)FanMotor的CY8C4146AZI-S433的demo, 接上電機(jī),運(yùn)行IAR,給啟動(dòng)速度參數(shù)初始值,電機(jī)啟動(dòng)失敗,無(wú)任何反應(yīng)。通過(guò)參數(shù)接口可以看到提示ErrorType4, 軟過(guò)流報(bào)錯(cuò),有哪些因素會(huì)
    發(fā)表于 02-02 07:35

    使用CYB06445LQI-S3D42設(shè)備配置系統(tǒng)時(shí)鐘,BSP在時(shí)鐘初始化時(shí)失敗怎么解決?

    我們正在使用 CYB06445LQI-S3D42 設(shè)備。 從默認(rèn)時(shí)鐘配置開(kāi)始效果很好。 當(dāng)我們嘗試根據(jù)電路板設(shè)計(jì)配置系統(tǒng)時(shí)鐘(我們有 ECO
    發(fā)表于 01-19 06:12

    應(yīng)用方案:實(shí)時(shí)數(shù)據(jù)加密

    圖像數(shù)據(jù)進(jìn)行了簡(jiǎn)單的CRC加密。如需對(duì)數(shù)據(jù)進(jìn)行加密,也可以利用CPLD實(shí)現(xiàn)對(duì)數(shù)據(jù)的AES算法加密操作,原理大體相同。 方案特點(diǎn):1、AG32具備最高248MHz
    發(fā)表于 01-15 08:57

    時(shí)鐘域的解決方案

    在很久之前便陸續(xù)談過(guò)亞穩(wěn)態(tài),F(xiàn)IFO,復(fù)位的設(shè)計(jì)。本次亦安做一個(gè)簡(jiǎn)單的總結(jié),從宏觀(guān)上給大家展示跨時(shí)鐘域的解決方案。
    的頭像 發(fā)表于 01-08 09:42 ?806次閱讀
    跨<b class='flag-5'>時(shí)鐘</b>域的<b class='flag-5'>解決方案</b>

    mysql配置失敗怎么辦

    MySQL是一款廣泛使用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),但在配置過(guò)程中可能會(huì)出現(xiàn)各種問(wèn)題,導(dǎo)致配置失敗。本文將詳細(xì)介紹MySQL
    的頭像 發(fā)表于 12-06 11:03 ?3153次閱讀

    恒流負(fù)載導(dǎo)致啟動(dòng)故障

    恒流負(fù)載導(dǎo)致啟動(dòng)故障
    的頭像 發(fā)表于 12-04 15:46 ?344次閱讀
    恒流負(fù)載<b class='flag-5'>導(dǎo)致</b>的<b class='flag-5'>啟動(dòng)</b>故障