查看: 1285|回复: 2

[分享] OTFAD加密启动失败?再去检查FlexSPI复位方式

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32003
    最后登录
    2024-4-9
    发表于 2021-3-4 15:02:05 | 显示全部楼层 |阅读模式

    OTFAD加密启动失败?再去检查FlexSPI复位方式



    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败问题。


    本篇是《系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败》 的后续篇,我们为i.MXRT1010解决了OTFAD时钟配置限制问题后,加密的App就一定能正常跑了吗?其实并不一定,如果你的App跟IAP有关(即会调用FlexSPI驱动去擦写Flash),免不了会在FlexSPI驱动里操作FlexSPI外设寄存器的软复位位,软复位操作方式使用不当可能会导致App无法正常运行,今天痞子衡就来好好聊一聊这个FlexSPI复位小限制:


    Note1: 虽然i.MXRT1170也包含OTFAD,但是本文中的FlexSPI复位限制问题在i.MXRT1170上并不存在。
    Note2: 三位数系列i.MXRT600同样包含OTFAD,且也受本文中的FlexSPI复位限制影响。
    一、问题描述
    从恩智浦官网下载一个SDK包(痞子衡下的是v2.9.1),选择其中 flexspi 例程 \SDK\boards\evkmimxrt1010\driver_examples\flexspi\nor\polling_transfer\ 。编译这个 flexspi_nor_polling_transfer 工程(选择 flexspi_nor_debug build,即XIP工程),得到可执行文件,将其下载到 MIMXRT1010-EVK 板载Flash中离线启动(正常模式,不加密),打开串口调试助手看到如下结果:
    21.png
    这个结果是例程预期结果,你可能会对这个XIP build也能擦写Flash感到奇怪,按说板载Flash没有RWW功能,擦写Flash操作不能在Flash里原地执行,但是例程的链接文件里已经将涉及Flash擦写代码的源文件直接放在RAM里了,因此例程是可以正常执行的。
    22.png
    现在让我们根据《系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败》 文中操作使能OTFAD加密,将整个App空间都加密,记得要修复系统时钟配置限制问题,这时候再离线启动,看到串口调试助手没有任何输出,说明例程执行失败了。查看工程源代码,main()函数里第一句打印前调用了 flexspi_nor_flash_init(EXAMPLE_FLEXSPI);, 看起来OTFAD加密后这个Flash初始化函数执行不太正常。


    为了定位问题方便,我们回到不加密模式,给 flexspi_nor_polling_transfer 工程加上一些辅助调试的打印信息,主要是FlexSPI相关API函数调用前加上打印信息。注意:需要将如下三个源文件也放到RAM中才能看到控制台完整输出。
    1. initialize by copy {
    2.   object fsl_debug_console.o,
    3.   object fsl_adapter_lpuart.o,
    4.   object fsl_lpuart.o,
    5. };
    复制代码
    23.png
    有了辅助打印信息,我们现在再回到OTFAD加密模式,可以看到代码停在 FLEXSPI_UpdateLUT() 函数就没有继续执行下去了。本文不是为了讲述如何一步步找到问题的方法,痞子衡其实知道就是 FLEXSPI_SoftwareReset() 函数惹的祸(没有停在这个函数,是由于系统buffer的缘故),至于是什么原因,详见下节。
    24.png
    1. static inline void FLEXSPI_SoftwareReset(FLEXSPI_Type *base)
    2. {
    3.     base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;
    4.     while (0U != (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK))
    5.     {
    6.     }
    7. }
    复制代码
    二、原因分析
    老规矩,痞子衡直接给答案,这是OTFAD对FlexSPI外设复位的小限制,当OTFAD被使能时,如果被加密的app代码是XIP执行,app里利用FlexSPI->MCR0[SWRESET]位做复位时,这个swreset复位功能会同时清掉FlexSPI->INTR[KEYDONE]位,而FlexSPI的运行依赖OTFAD解析KeyBlob的结果,当FlexSPI->INTR[KEYDONE]位是0时,对Flash的AHB访问会被禁掉,故而发生CPU lockup,代码无法继续执行。
    1. KEYDONE位为1 - 表明OTFAD解析KeyBlob已正常完成;
    2. KEYDONE位为0 - 表明OTFAD正在解析KeyBlob过程中;
    复制代码
    25.png
    FlexSPI->MCR0[SWRESET]位存在于任何一款i.MXRT芯片型号中,其功能是复位FlexSPI外设,在下面几个场景都可以去做一次FlexSPI外设复位,不用担心,这个外设复位并不影响FlexSPI配置寄存器里的值。不过比较遗憾的是在此时的OTFAD加密启动使能情形下,不能再用MCR0[SWRESET]位去做复位了 。
    1. 场景一:初始化FlexSPI,打开MCR0[MDIS]位使能模块时
    2. 场景二:更新了FlexSPI的LUT表后
    3. 场景三:切换了FlexSPI的工作模式后(比如使能Flash四线)
    4. 场景四:完成了FlexSPI的擦、写命令后
    复制代码
    26.png
    三、解决方案
    很多时候FlexSPI->MCR0[SWRESET]位更多是被用来清除AHB TX/RX Buffer(尤其是在Flash擦写之后),在i.MXRT1010 FlexSPI外设的AHBCR寄存器里其实新增了单独的CLRAHBTXBUF和CLRAHBRXBUF控制位,用以实现AHB TX/RX Buffer的清除。因此我们为了避免影响OTFAD加密启动,可以使用AHBCR[CLRAHBTXBUF/CLRAHBRXBUF]位来代替MCR0[SWRESET]位去做复位。
    27.png
    因此在 flexspi_nor_polling_transfer 工程里,将FLEXSPI_SoftwareReset()函数调用全部改成如下的FLEXSPI_ClearAhbBuffer()函数调用就可以保证工程正常运行了。
    1. static inline void FLEXSPI_ClearAhbBuffer(FLEXSPI_Type *base)
    2. {
    3. #if defined(FSL_FEATURE_SOC_OTFAD_COUNT) && defined(FLEXSPI_AHBCR_CLRAHBRXBUF_MASK)
    4.     base->AHBCR |= FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK;
    5.     base->AHBCR &= ~(FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK);
    6. #endif
    7. }
    复制代码






    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 17:13
  • 签到天数: 1015 天

    [LV.10]以坛为家III

    2

    主题

    2514

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5061
    最后登录
    2024-4-19
    发表于 2021-3-8 11:29:35 | 显示全部楼层
    感谢楼主整理分享!
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-5-28 05:36
  • 签到天数: 1 天

    [LV.1]初来乍到

    2

    主题

    36

    帖子

    0

    注册会员

    Rank: 2

    积分
    132
    最后登录
    2024-2-23
    发表于 2024-2-20 00:11:09 | 显示全部楼层
    真的好使呀,得谢谢管管和痞子,辛苦辛苦。
    干不完的事
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-20 01:41 , Processed in 0.124709 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表