痞子衡嵌入式:FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是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中离线启动(正常模式,不加密),打开串口调试助手看到如下结果:
这个结果是例程预期结果,你可能会对这个XIP build也能擦写Flash感到奇怪,按说板载Flash没有RWW功能,擦写Flash操作不能在Flash里原地执行,但是例程的链接文件里已经将涉及Flash擦写代码的源文件直接放在RAM里了,因此例程是可以正常执行的。
现在让我们根据《系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败》 文中操作使能OTFAD加密,将整个App空间都加密,记得要修复系统时钟配置限制问题,这时候再离线启动,看到串口调试助手没有任何输出,说明例程执行失败了。查看工程源代码,main()函数里第一句打印前调用了 flexspi_nor_flash_init(EXAMPLE_FLEXSPI);, 看起来OTFAD加密后这个Flash初始化函数执行不太正常。
为了定位问题方便,我们回到不加密模式,给 flexspi_nor_polling_transfer 工程加上一些辅助调试的打印信息,主要是FlexSPI相关API函数调用前加上打印信息。注意:需要将如下三个源文件也放到RAM中才能看到控制台完整输出。
initialize by copy {
object fsl_debug_console.o,
object fsl_adapter_lpuart.o,
object fsl_lpuart.o,
};
有了辅助打印信息,我们现在再回到OTFAD加密模式,可以看到代码停在 FLEXSPI_UpdateLUT() 函数就没有继续执行下去了。本文不是为了讲述如何一步步找到问题的方法,痞子衡其实知道就是 FLEXSPI_SoftwareReset() 函数惹的祸(没有停在这个函数,是由于系统buffer的缘故),至于是什么原因,详见下节。
static inline void FLEXSPI_SoftwareReset(FLEXSPI_Type *base)
{
base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;
while (0U != (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK))
{
}
}
二、原因分析
老规矩,痞子衡直接给答案,这是OTFAD对FlexSPI外设复位的小限制,当OTFAD被使能时,如果被加密的app代码是XIP执行,app里利用FlexSPI->MCR0[SWRESET]位做复位时,这个swreset复位功能会同时清掉FlexSPI->INTR[KEYDONE]位,而FlexSPI的运行依赖OTFAD解析KeyBlob的结果,当FlexSPI->INTR[KEYDONE]位是0时,对Flash的AHB访问会被禁掉,故而发生CPU lockup,代码无法继续执行。
KEYDONE位为1 - 表明OTFAD解析KeyBlob已正常完成;
KEYDONE位为0 - 表明OTFAD正在解析KeyBlob过程中;
FlexSPI->MCR0[SWRESET]位存在于任何一款i.MXRT芯片型号中,其功能是复位FlexSPI外设,在下面几个场景都可以去做一次FlexSPI外设复位,不用担心,这个外设复位并不影响FlexSPI配置寄存器里的值。不过比较遗憾的是在此时的OTFAD加密启动使能情形下,不能再用MCR0[SWRESET]位去做复位了 。
场景一:初始化FlexSPI,打开MCR0[MDIS]位使能模块时
场景二:更新了FlexSPI的LUT表后
场景三:切换了FlexSPI的工作模式后(比如使能Flash四线)
场景四:完成了FlexSPI的擦、写命令后
三、解决方案
很多时候FlexSPI->MCR0[SWRESET]位更多是被用来清除AHB TX/RX Buffer(尤其是在Flash擦写之后),在i.MXRT1010 FlexSPI外设的AHBCR寄存器里其实新增了单独的CLRAHBTXBUF和CLRAHBRXBUF控制位,用以实现AHB TX/RX Buffer的清除。因此我们为了避免影响OTFAD加密启动,可以使用AHBCR[CLRAHBTXBUF/CLRAHBRXBUF]位来代替MCR0[SWRESET]位去做复位。
因此在 flexspi_nor_polling_transfer 工程里,将FLEXSPI_SoftwareReset()函数调用全部改成如下的FLEXSPI_ClearAhbBuffer()函数调用就可以保证工程正常运行了。
static inline void FLEXSPI_ClearAhbBuffer(FLEXSPI_Type *base)
{
#if defined(FSL_FEATURE_SOC_OTFAD_COUNT) && defined(FLEXSPI_AHBCR_CLRAHBRXBUF_MASK)
base->AHBCR |= FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK;
base->AHBCR &= ~(FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK);
#endif
}
至此,FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败问题痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。
痞子衡嵌入式:FlexSPI复位方式不当会导致i.MXRT系列下OTFAD加密启动失败的更多相关文章
- 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...
- 痞子衡嵌入式:借助Serial Plot软件测量i.MXRT系列FlexSPI驱动Flash页编程执行时间
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT系列FlexSPI驱动Flash页编程执行时间. 痞子衡之前写过一篇文章 <串行NOR Flash的页编程模式对于量产 ...
- 痞子衡嵌入式:串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之RESET#
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动问题的解决经验. 前一篇文章 <在i ...
- 痞子衡嵌入式:揭秘i.MXRT1060,1010上串行NOR Flash冗余程序启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060,1010上串行NOR Flash冗余程序启动设计. 工业产品设计里经常会有冗余程序/备份程序设计的需求,因为在工业 ...
- 痞子衡嵌入式:RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计
大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的开源项目 RT-UFL. 痞子衡在近两年多的i.MXRT客户项目支持过程中,遇到的一个相当高频的问题就是制作i.MXRT下载算法.我们 ...
- 痞子衡嵌入式:RT-MFB - 一种灵活的i.MXRT下多串行NOR Flash型号选择的量产方案
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是一种灵活的i.MXRT下多串行NOR Flash型号选择的量产方案. 对于以 i.MXRT 这类没有内部 NVM (Non-Volati ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1010的FlexSPI NOR启动的连接方式. 在写完 <FlexSPI NOR启动连接方式(RT1015/ ...
- 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.1)- FlexSPI NOR连接方式大全(RT600)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT600的FlexSPI NOR启动的连接方式. 痞子衡前段时间一鼓作气写完了三篇关于i.MXRT1xxx系列Flex ...
- 痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...
随机推荐
- Codeforces Round #628 (Div. 2) A. EhAb AnD gCd(LCM & GCD)
题意: GCD(a,b) + LCM(a,b) = n,已知 n ,求 a,b. 思路: 设 gcd(a, b) = k, a = xk, b = yk , k + ab / k = n xy = n ...
- Educational Codeforces Round 87 (Rated for Div. 2) D树状数组加二分删除的值
Sample Input 5 4 1 2 3 4 5 -5 -1 -3 -1 Sample Output 3 思路,首先发现a[i]的值的范围是在1~n之间,每次插入我们可以直接把cnt[a[i]]+ ...
- 2017, X Samara Regional Intercollegiate Programming Contest E. Bonuses and Teleports (思维,模拟)
题意:在\(x\)轴上有很多传送点和钻石,当位于传送点上时,可以传送到其他任意传送点(不记操作数),位于钻石上时可以吃掉它,每次可以移动一个单位,问最少多少次可以吃掉所有的钻石. 题解:对于某个位置上 ...
- GYM101810 ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018) M. Greedy Pirate (LCA)
题意:有\(n\)个点,\(n-1\)条边,每条边正向和反向有两个权值,且每条边最多只能走两次,有\(m\)次询问,问你从\(u\)走到\(v\)的最大权值是多少. 题解:可以先在纸上画一画,不难发现 ...
- 1、Django框架目录介绍
1.windows上安装django pip install django==1.10.3 安装完成后:django-admin.exe 默认存放路径:C:\Users\licl11092\AppDa ...
- 快速搞懂.NET 5/.NET Core应用程序的发布部署
.NET Framework时代,.NET 应用程序大多直接部署运行在Windows服务器上,当然也可以通过Mono部署运行在Linux上.无论部署exe,还是IIS站点.或是Windows Serv ...
- npm config set registry
npm config set registry $ npm config set registry $ npm config set registry https://registry.your-re ...
- CSS 检测 IE 浏览器
CSS 检测 IE 浏览器 <!--[if IE]> <link href="ie.css" rel="stylesheet"> < ...
- js 深入原理讲解系列-currying function
js 深入原理讲解系列-currying function 能看懂这一题你就掌握了 js 科里函数的核心原理 不要专业的术语,说人话,讲明白! Q: 实现 sum 函数使得以下表达式的值正确 cons ...
- RESTful 架构 && RESTful API
RESTful 架构 && RESTful API REpresentational State Transfer (REST) 具象状态传输https://en.wikipedia. ...