0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

系统时钟配置不当导致OTFAD加密启动失败的解决方案

西西 来源:与非网 作者:痞子衡 2021-03-07 13:00 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题。

我们知道,i.MXRT1xxx家族早期型号(RT1050/RT0160/RT1020)的硬件解密外设名字叫BEE,这个外设主要是配合FlexSPI外设去实现外接串行NOR Flash在线解密XIP执行用的。而到了最近的i.MXRT1xxx新型号(RT1010/RT1170)上,BEE外设被替换成了OTFAD外设,功能不变,解密效率得到了很大提升,但客户在使能OTFAD加密启动时常常遇到App无法正常运行问题,这其实跟OTFAD自身的一个时钟小限制有关(这个限制在BEE上不存在),今天痞子衡就来好好聊一聊OTFAD的这个小限制:

一、问题描述

我们以i.MXRT1010为例,从恩智浦官网下载一个SDK包(痞子衡下的是v2.9.1),随便选择其中一个例程,就以最简单的 \SDK\boards\evkmimxrt1010\demo_apps\led_blinky 为例吧。编译这个 led_blinky 工程(选择 flexspi_nor_debug build,即XIP工程),得到可执行文件(实际bin文件大小为10KB左右),使用 NXP-MCUBootUtility 工具将可执行文件(led_blinky.out)下载进MIMXRT1010-EVK开发板中(下载时启动模式为2'b01,启动时切换到2'b10),可以看到板载绿色LED小灯(D25)会闪,例程是可以正常工作的。

现在让我们尝试使能OTFAD加密,回到芯片下载模式依然借助 NXP-MCUBootUtility 工具,将工具 Secure boot type 选项切换为 OTFAD Encrypted Image Boot,其他设置均默认(此时加密范围是 0x60001000 - 0x60001fff,仅加密IVT等启动头,不含app),再次下载可执行文件(led_blinky.out),换到芯片启动模式复位板子,例程依旧是正常工作的,看起来OTFAD加密启动似乎没有问题。

让我们再进一步,将加密范围设置为0x60002000 - 0x60004fff,这时加密区域覆盖到了整个app,重新按上述流程操作一遍,发现例程没能正常工作,这时候OTFAD加密启动出了问题,难道app区域不能被加密?那OTFAD加密还有啥意义?

app区域当然可以被加密,跟着痞子衡再做一次实验,在 led_blinky.c 文件的 main() 函数中,我们将时钟配置函数 BOARD_BootClockRUN() 直接注释掉或者在链接文件里将其全部搞成 __ramfunc(即在芯片内部RAM里执行这部分时钟配置代码),这个例程仅是利用SysTick定时翻转GPIO,因此时钟配置代码去掉不影响正常运行,重新编译工程再按上面流程操作一遍,这时候例程又能正常工作了,说明加密后的app是能被OTFAD正常解密执行的。

现在的问题变成了为何OTFAD加密启动时,BOARD_BootClockRUN() 函数不能在Flash里执行,这就是问题所在。

二、原因分析

关于上述问题的原因,痞子衡先直接给答案,这是OTFAD外设本身的时钟小限制,当OTFAD被使能时,如果被加密的app代码是XIP执行,app里做系统时钟配置时要始终保证Core时钟高于FlexSPI外设时钟。如果Core时钟低于FlexSPI时钟,此时Core去访问加密Flash区域,OTFAD无法正常解密,会导致指令错乱,发生系统故障。

我们配合上面的i.MXRT1010系统时钟树来认真分析下OTFAD这个时钟限制问题。芯片上电总是从BootROM执行,BootROM会先将Core配置到396MHz,将FlexSPI时钟根据用户放置在Flash偏移0x400处的FDCB里的设定配到30MHz - 200MHz不等,再读取Flash偏移0地址处OTFAD DEK KeyBlob数据使能OTFAD,然后读取IVT等头信息去跳转到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,   内核时钟来自CCM->CBCMR[PRE_PERIPH_CLK_SEL]
CCM->CBCDR[AHB_PODF]           = 0,   内核时钟不分频

// 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)分频

当BootROM跳转到了App之后,我们再来看看App里对时钟是怎么配置的,就是BOARD_BootClockRUN()函数,可以看到这个函数里将内核频率从BootROM设置的396MHz切换到外部OSC 24MHz。无论此时用户FDCB里对FlexSPI时钟是多少配置,至少也会大于30MHz,那么此时24MHz内核频率一定会低于FlexSPI时钟频率,此时只要发生内核对Flash加密区域的访问(时钟配置代码就在Flash里执行),就触发了OTFAD时钟限制问题,App就会跑飞。

三、解决方案

知道了原因,解决方案就简单了,在App时钟配置里,不要按照寻常套路去先将内核时钟源切换到外部OSC再切到PLL,而是直接切到PLL上。比如i.MXRT1010内部有个PLL6(也叫Audio PLL),固定500MHz,正好是App要的最终内核频率,我们在BOARD_BootClockRUN()里将Audio(Enet) PLL初始化设置代码提到前面,删掉原来的切换OSC设置代码即可。

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

最后再提一下,这个OTFAD时钟限制问题在i.MXRT1170上同样存在,解决思路与上面类似,痞子衡就不再赘述了。

至此,系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题便介绍完毕了
编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 时钟
    +关注

    关注

    11

    文章

    1953

    浏览量

    134542
  • 时钟配置
    +关注

    关注

    1

    文章

    14

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何解决MCU系统时钟频率改变导致的程序跑飞?

    如何解决MCU系统时钟频率改变导致的程序跑飞问题
    发表于 12-05 08:20

    系统从DeepSleep下唤醒时钟默认为原时钟,如果原时钟频率特别高,是否有存在启动不稳定问题?

    1.系统从DeepSleep下唤醒时钟默认为原时钟,如果原时钟频率特别高,是否有存在启动不稳定问题?这个地方目前有没有需要特别注意的地方?
    发表于 11-28 07:36

    CW32时钟启动过程

    SYSCTRL_HSE.STABLE 被置 1;如果在一定时间内未检测到 SYSCTRL_HSE.WAITCYCLE 个时钟信号则认为 HSE 振荡器起振失败。 其它时钟振荡器的时钟
    发表于 11-13 07:49

    当ICE_DAT和ICE_CLK引脚配置为应用编码中的备用功能时,是否会导致编程失败

    当ICE_DAT和ICE_CLK引脚配置为应用编码中的备用功能时,是否会导致编程失败
    发表于 08-21 06:30

    叉车限速解决方案

    叉车的动力系统,响应迅速,限速效果稳定可靠,且对叉车原有结构改动较小,适配性较强。 三、声光预警 声光预警功能是限速解决方案中的重要辅助部分。当叉车即将达到限速值或出现超速情况时,装置会立即启动声光
    发表于 08-20 14:00

    Intel® Ethernet E830 控制器:引领后量子加密时代的网络安全解决方案

    Intel® Ethernet 830 Controllers,其采用安全启动、安全固件升级和双硬件信任根等安全技术,通过符合 CNSA 1.0 和 FIPS 140-3 1 级的后量子加密 (PQC) 解决方案以应对未来的数据
    的头像 发表于 08-11 17:55 6988次阅读
    Intel® Ethernet E830 控制器:引领后量子<b class='flag-5'>加密</b>时代的网络安全<b class='flag-5'>解决方案</b>

    宽温启动失败?聚徽揭秘防爆显示屏-40℃低温启动的加热膜配置技术

    防爆显示屏的低温启动难题,解析加热膜配置的核心技术,为工业场景提供可靠解决方案。 一、低温启动失败的核心挑战 1. 液晶材料性能衰减 在-4
    的头像 发表于 06-18 16:17 560次阅读

    存储示波器触发电平设置不当导致什么后果?

    触发电平(Trigger Level)是存储示波器捕获稳定波形、定位关键事件的核心参数。若设置不当,会导致波形显示异常、触发不稳定、关键信号丢失等问题,甚至影响测试结果的准确性。以下为详细分析及应对
    发表于 05-29 14:13

    AS32X601驱动系列教程 SMU_系统时钟详解

    在现代嵌入式系统中,时钟与复位管理是确保系统稳定运行的关键。我们的SMU(系统管理单元)模块专注于此核心任务,通过精准的时钟
    的头像 发表于 05-23 16:01 579次阅读
    AS32X601驱动系列教程 SMU_<b class='flag-5'>系统</b><b class='flag-5'>时钟</b>详解

    爱普生SG2520HHN晶振数据中心服务器的理想解决方案

    系统宕机。爱普生SG2520HHN差分晶振凭借低抖动、宽频段、高兼容性卓越性能,成为数据中心服务器的理想时钟解决方案。SG2520HHN差分晶振特性与优势:1.超
    的头像 发表于 04-29 17:32 459次阅读
    爱普生SG2520HHN晶振数据中心服务器的理想<b class='flag-5'>解决方案</b>

    mxrt1176在为OTFAD编程保险丝后“半”变砖,怎么解决?

    在对一些保险丝进行编程后,我在 imxrt1176(在 EVK 上)上遇到了一个奇怪的“问题”,主要是为了检查此设备上的 OTFAD 加密和 XIP。 通过 flashloader 加载的加密图像
    发表于 04-09 07:36

    RT1052芯片启动失败的原因?怎么解决?

    最近遇到RT1052芯片启动失败问题,10次里有5次启动失败,但接上示波器观察RT1052电源时序波形后,启动
    发表于 03-27 07:00

    芯知识|WT588F02B语音芯片烧录失败的原因解析及解决方案

    、线路长度三大核心因素出发,深入分析烧录失败的原因并提供系统化的解决方案。一、检查下载器与芯片的物理连接问题表现烧录时提示"连接超时"或"设备未响应",或烧录进度条卡
    的头像 发表于 03-26 09:05 887次阅读
    芯知识|WT588F02B语音芯片烧录<b class='flag-5'>失败</b>的原因解析及<b class='flag-5'>解决方案</b>

    鸿蒙原生页面高性能解决方案上线OpenHarmony社区 助力打造高性能原生应用

    Nodepool、HMrouter和DataCache 三大解决方案,并上架OpenHarmony开源社区分,分别针对应用页面滑动、跳转、首页冷启动等关键性能场景提供高效易用的工具,助力伙伴和开发者打造
    发表于 01-02 18:00

    SSM开发中的常见问题及解决方案

    配置文件存在错误,如语法错误、路径错误或格式错误,导致软件系统无法正常运行。 解决方案 : 仔细检查配置文件的语法、路径和格式,确保其
    的头像 发表于 12-17 09:16 1855次阅读