<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      痞子衡嵌入式:系統(tǒng)時鐘配置不當(dāng)會導(dǎo)致i.MXRT1xxx系列下OTFAD加密啟動失敗


        大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家分享的是系統(tǒng)時鐘配置不當(dāng)會導(dǎo)致i.MXRT1xxx系列下OTFAD加密啟動失敗問題。

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

      一、問題描述

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

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

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

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

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

      二、原因分析

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

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

      // BootROM里對Core時鐘配置
      CCM_ANALOG->PFD_528[PFD3_FRAC] = 24,   PLL2 PFD3輸出 (528MHz * 18) / 24 = 396MHz
      CCM->CBCMR[PRE_PERIPH_CLK_SEL] = 2,    時鐘來自PLL2 PFD3
      CCM->CBCDR[PERIPH_CLK_SEL]     = 0,   內(nèi)核時鐘來自CCM->CBCMR[PRE_PERIPH_CLK_SEL]
      CCM->CBCDR[AHB_PODF]           = 0,   內(nèi)核時鐘不分頻
      
      // BootROM里對FlexSPI時鐘配置
      CCM_ANALOG->PFD_480[PFD0_FRAC] = x,    PLL3 PFD0輸出 (480MHz * 18) / x
      CCM->CSCMR1[FLEXSPI_CLK_SEL]   = 3,    時鐘來自PLL3 PFD0
      CCM->CSCMR1[FLEXSPI_CLK_SRC]   = 0,   FlexSPI時鐘來自CCM->CSCMR1[FLEXSPI_CLK_SEL]
      CCM->CSCMR1[FLEXSPI_PODF]      = y,   FlexSPI時鐘做(y+1)分頻
      

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

      三、解決方案

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

      void BOARD_BootClockRUN(void)
      {
          // 此處略去...
          /* Set Oscillator ready counter value. */
          CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);
      -    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */
      -    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */
      -    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */
      
          // 此處略去...
          /* Set IPG_PODF. */
          CLOCK_SetDiv(kCLOCK_IpgDiv, 3);
      +     /* Init Enet PLL. */
      +    CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);
      +    /* Set preperiph clock source. */
      +    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);
      
          // 此處略去...
          /* Enable Audio PLL output. */
          CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;
      -    /* Init Enet PLL. */
      -    CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);
      -    /* Set preperiph clock source. */
      -    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);
      
          // 此處略去...
          /* Set SystemCoreClock variable. */
          SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
      }
      

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

        至此,系統(tǒng)時鐘配置不當(dāng)會導(dǎo)致i.MXRT1xxx系列下OTFAD加密啟動失敗問題痞子衡便介紹完畢了,掌聲在哪里~~~

      歡迎訂閱

      文章會同時發(fā)布到我的 博客園主頁、CSDN主頁知乎主頁、微信公眾號 平臺上。

      微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機(jī)上第一時間看了哦。

      posted @ 2021-02-25 11:59  痞子衡  閱讀(1100)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 免费观看全黄做爰大片| 777米奇色狠狠888俺也去乱| 日本精品成人一区二区三区视频| 丰满少妇人妻久久久久久| 国产成人午夜精品影院| 秀山| 综合区一区二区三区狠狠| 里番全彩爆乳女教师| 亚洲自拍偷拍福利小视频| 国产乱理伦片在线观看| 麻豆国产成人AV在线播放| 国产成人精品午夜在线观看| 激情 小说 亚洲 图片 伦| 精品午夜福利在线视在亚洲| 欧美熟妇乱子伦XX视频| 国产成人精品日本亚洲| 夜夜影院未满十八勿进| 一本一道av中文字幕无码| 亚洲日韩一区精品射精| 综合成人亚洲网友偷自拍| 一区二区三区精品视频免费播放| 国产乱国产乱老熟300部视频| 91精品国产自产在线蜜臀| 无码福利写真片视频在线播放| 亚洲精品一区二区动漫| 精品国产一区二区三区国产区| 成人免费无码视频在线网站 | 国产情侣激情在线对白| 亚洲av成人网人人蜜臀| 忘忧草在线社区www中国中文| 亚洲AV永久无码嘿嘿嘿嘿| 亚洲高清成人av在线| h动态图男女啪啪27报gif| 国产精品国产三级国快看| 大色综合色综合网站| b站永久免费看片大全| 日韩精品 在线一区二区| 国产精品久久久久久妇女| 男人和女人做爽爽免费视频| 九九久久精品国产免费看小说 | 亚洲成a∨人片在线观看不卡|