痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1170 Raw NAND启动时间。
关于i.MXRT1170这颗划时代的MCU,痞子衡去年10月在其刚发布的时候,专门写过一篇文章介绍过其特点(详见 《终于可以放开聊一聊i.MXRT1170这颗划时代MCU了》),眼看着其上市日期越来越近了,恩智浦软硬件技术支持团队也正在紧锣密鼓地开发SDK以及参考设计。因为官方首次在i.MXRT1170 EVK板上(Rev.B)放了一片旺宏的Raw NAND芯片,而i.MXRT当然是支持从Raw NAND启动的,因此痞子衡打算为大家测一测Raw NAND的启动时间(这里指在ITCM执行,暂不考虑在SDRAM执行)。
一、准备工作
1.1 知识储备
在开始测试之前,你需要认真读一下痞子衡的旧文 《恩智浦i.MX RT1xxx系列MCU启动那些事(8)- 从Raw NAND启动》,对i.MXRT从Raw NAND启动的原理有一个充分认识。
Raw NAND启动不同于你最熟悉的Serial NOR启动,由于NAND访问的特殊性(仅能按Page读,且允许坏块),因此其仅支持Non-XIP Application(即需要把Application image从NAND中全部拷贝出来,放到RAM中执行),无法原地执行。这个拷贝工作就由芯片内部的BootROM来完成,为了让BootROM顺利完成拷贝工作,我们需要在NAND中放一些特殊数据(即下面的FCB, DBBT, IVT)。
FCB永远放在NAND的第一个block里的固定位置,BootROM首先从NAND中读取FCB(此时是利用eFuse 0x940和0xC80里的简化时序配置选项),FCB中含有三类信息:用户设置的完整时序配置数据(可选的)、DBBT位置,IVT位置。BootROM首先会检查是否存在完整时序配置数据,如果有,则使用这个数据重新配置NAND访问时序。然后BootROM会继续获取DBBT数据,获知当前NAND的坏块信息,接下来便是根据IVT信息获取Application数据完成拷贝(拷贝过程中需要避开坏块)。
1.2 时间界定
说到启动时间的界定,其实无非是找到时间起点以及时间终点。
时间起点很好办,根据i.MXRT1170芯片POR信号变化即可(下图中的RST_TGTMCU_B的上升沿),也就是芯片开始上电为起点。
时间终点稍微有点难办,如果监测Raw NAND信号(比如CE#最后一个上沿)有点难抓,也不够精准,毕竟BootROM拷贝完所有Application image数据后是否还会做一些校验工作才会跳转不得而知,所以还是以执行到Application为准。到了Application的执行就简单了,在Application里加个GPIO翻转(比如点灯)即可,我们只需抓取这个GPIO的信号变化(抓下图中R1855的上升沿)。
1.3 制作应用程序
现在我们开始制作测试用的Non-XIP Application,以\SDK_xxx_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\led_blinky\cm7\下的工程为基础,但需要做一些修改。
痞子衡以IAR工程示例,首先需要选中debug build(release也行),这个build即是在ITCM中执行的Non-XIP版本,而且其链接文件里的m_interrupts_start也需要从0x00000000修改为0x00002000(这里如果不明白的话,继续回去看痞子衡写的Raw NAND启动文章)。
这个工程里的led_blinky.c里已经有GPIO翻转代码了,但是位置在main()函数里,为了得到尽量准确的启动时间,我们应该把GPIO翻转的代码提前,下面是程序Reset_Handler代码,原则上我们应该要在这里加汇编,但是为了简单起见,我们也可以在SystemInit()函数里加C代码(痞子衡认为在data/bss段初始化之前就可以了)。
PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
CPSID I ; Mask interrupts
LDR R0, =0xE000ED08
LDR R1, =__vector_table
STR R1, [R0]
LDR R2, [R1]
MSR MSP, R2
LDR R0, =SystemInit
BLX R0
CPSIE I ; Unmask interrupts
LDR R0, =__iar_program_start
BX R0
编译后可以得到一个17732 bytes的Application(可以生成.srec格式,方便后面下载),但是我们知道Raw NAND启动时间跟Application长度是成正比的(主要耗时就是在拷贝上),所以我们还需要再制作一个稍微大一些的Application,可以直接在代码里加上如下const数组定义,并且在IAR的Option/Linker/Input里的Keep symbols里加上s_dummyBuffer,防止这个数组被优化掉。
const uint8_t s_dummyBuffer[1024*230] = {0};
1.4 下载应用程序
应用程序的下载需借助痞子衡开发的NXP-MCUBootUtility工具(v2.2版本及以上),将i.MXRT启动模式设到SDP模式(EVK上SW1拨码开关设为4'b0001),然后给板子上电。软件的使用不予赘述,NAND具体配置如下即可,后面的测试我们只需要更改ONFI Timing Mode这一个参数。
Note: 这个工具会自动生成FCB(包含完整NAND时序配置), DBBT, IVT并将其和Application一起下载进Raw NAND中
程序下载完成后,将i.MXRT启动模式设到Internal Boot模式(EVK上SW1拨码开关设为4'b0010),并且将启动设备设为Raw NAND(EVK上SW2拨码开关设为10'b0000010000),断电重启你应该就可以看到LED灯会亮,这代表Raw NAND启动成功了。
1.5 示波器抓取信号
一切准备就绪,可以用示波器抓Raw NAND启动时间了。除了通道一监测POR信号,通道三监测LED GPIO信号,为了更直观地看启动过程,痞子衡特地加了通道二来监测NAND_CE#信号,这样可以看到Application拷贝过程。
二、开始测试
2.1 影响因素
2.1.1 App长度
App的长度是影响启动时间的第一因素。痞子衡在前面 1.3节 制作应用程序里,已经制作了两个不同长度的App用于测试。
2.1.2 NAND访问模式
NAND访问模式是影响启动时间的第二因素。SEMC支持的NAND访问模式一共两种,分别是IPG CMD模式和AXI CMD模式,前者是应用程序手动发命令去一次读取4byte数据到SEMC数据寄存器,然后再从寄存器中取数据;后者是应用程序访问指定的AXI空间(假定也是取4byte),由SEMC自动发命令读取4byte并放到对应AXI映射空间里。
NXP-MCUBootUtility工具里所依赖的flashloader固定使用IPG CMD模式,因此想切换到AXI CMD模式,需要从SDK/middleware/mcu-boot中获取flashloader源码,修改源码(在semc_nand_mem_config()函数中做如下修改)后重新编译使用。
使用修改后的flashloader程序下载完成Application之后,需要在回读的image数据中偏移0x109的地址查看数据(0x01代表AXI,0x00代表IPG)。
痞子衡继续使用示波器抓取NAND_RE#信号如下:
这是IPG CMD模式下的时序(ONFI timing mode5):
这是AXI CMD模式下的时序(ONFI timing mode5):
从上述时序上看,AXI CMD模式读取数据明显比IPG CMD模式更高效,每4byte访问之后的间隔时间大大缩短。
2.1.3 ONFI Timing Mode
ONFI Timing Mode是影响启动时间的第三因素。NXP-MCUBootUtility工具中支持更改ONFI Timing Mode(主要是将设置写进FCB),痞子衡查了下EVK板上这颗NAND芯片,能支持mode0 - mode5一共6种模式,我们就先来看看最慢的mode0和最快的mode5是否设置生效。在程序下载完成之后,需要在回读的image数据中偏移0x153的地址查看数据(0x01代表mode0,0x06代表mode5)。
Raw NAND访问是通过SEMC模块实现的,SEMC一次会从NAND读取4byte放到内部32bit数据寄存器中,痞子衡使用示波器抓取NAND_RE#信号如下:
这是ONFI Timing Mode0下的时序:
这是ONFI Timing Mode5下的时序:
从上述时序上看,ONFI Timing Mode设置是生效的,mode5耗时确实比mode0短一些,与ONFI 1.0手册里规定的数值基本是吻合的。
2.2 测试结果
前面分析完了影响因素,现在到了公布结果的时候了,痞子衡基于前面的影响因子组合一共做了8个测试,结果如下表所示。总之一句话,想要最快的启动时间,设为AXI访问模式以及ONFI Timing Mode5即可,另外如果对启动时间敏感(比如Auto应用),不妨做两级启动(Boot+App),Boot尽量小,App可以很大,Boot起来之后去做一些启动任务(响应CAN,点亮LCD屏),然后由Boot再去慢慢加载App。
NAND访问模式 | ONFI时序模式 | Application长度 | 启动时间 |
---|---|---|---|
IPG CMD | mode 0 - 10MHz | 17732 bytes | 40.58ms |
IPG CMD | mode 5 - 50MHz | 17732 bytes | 38.90ms |
IPG CMD | mode 0 - 10MHz | 253252 bytes | 172.3ms |
IPG CMD | mode 5 - 50MHz | 253252 bytes | 164.3ms |
AXI CMD | mode 0 - 10MHz | 17732 bytes | 32.8ms |
AXI CMD | mode 5 - 50MHz | 17732 bytes | 32.6ms |
AXI CMD | mode 0 - 10MHz | 253252 bytes | 104.9ms |
AXI CMD | mode 5 - 50MHz | 253252 bytes | 78.86ms |
测试结果波形图较多,痞子衡且放一张(AXI, mode0, 17732bytes)给大家看看吧。
至此,恩智浦i.MX RT1170 Raw NAND启动时间痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。
痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)的更多相关文章
- 痞子衡嵌入式:再测i.MXRT1060,1170上的普通GPIO与高速GPIO极限翻转频率
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060/1170上的普通GPIO与高速GPIO极限翻转频率. 按照上一篇文章 <实测i.MXRT1010上的普通GP ...
- 痞子衡嵌入式:简析i.MXRT1170 Cortex-M7 FlexRAM ECC功能特点、开启步骤、性能影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7内核的FlexRAM ECC功能. ECC是"Error Correcting ...
- 痞子衡嵌入式:简析i.MXRT1170 Cortex-M4 L-MEM ECC功能特点、开启步骤、性能影响
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M4内核的L-MEM ECC功能. 本篇是 <简析i.MXRT1170 Cortex-M ...
- 痞子衡嵌入式:大话双核i.MXRT1170之Cortex-M7与Cortex-M4互相激活之道
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是恩智浦i.MXRT1170上Cortex-M7与Cortex-M4内核互相激活的方法. 痞子衡最近在深耕i.MXRT1170这颗划时代的 ...
- 痞子衡嵌入式:简析i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170 XECC功能特点及其保护串行NOR Flash和SDRAM之道. ECC 是 "Error Correc ...
- 痞子衡嵌入式:大话双核i.MXRT1170之单独在线调试从核工程的方法(IAR篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下单独在线调试从核工程的方法(基于IAR). 两年前痞子衡写过一篇<双核i.MXRT1170之Cortex-M ...
- 痞子衡嵌入式:大话双核i.MXRT1170之在线联合调试双核工程的三种方法(IAR篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170下在线联合调试双核工程的方法(基于IAR). 前段时间痞子衡写过一篇<双核i.MXRT1170之单独在线调试从 ...
- 痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1170的eFuse空间访问可靠性保护策略. 关于i.MXRT系列的eFuse/OTP,痞子衡之前在介绍Boot时写过 ...
- 痞子衡嵌入式:降低刷新率是定位LCD花屏显示问题的第一大法(i.MXRT1170, 1280x480 LVDS)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170上LCD花屏显示问题的分析解决经验. 痞子衡最近这段时间在参与一个基于i.MXRT1170的大项目(先保个密),需要 ...
随机推荐
- figure设置坐标轴
import matplotlib.pyplot as plt import numpy as np x=np.linspace(-3,3,50) y1=x*2+1 y2=x**2 plt.plot( ...
- 手机视频APP将关闭 生态梦成空的三星如何自救?
生态梦成空的三星如何自救?"> 三星如今的处境,只能用"屋漏偏逢连夜雨"来形容.继营收.利润.智能手机销量等大幅下滑之后,裁员也接踵而来,股价的下跌也自然在情理之中 ...
- Swizzling的使用
在oc的runtime机制内有一类方法是可以用来实现类间的方法替换.解决了我们实际开发中诸多常规手段所无法解决的问题.关于Method Swizzling,这里有一篇介绍基本用法的文章 场景 最近出于 ...
- SecureCRT语法高亮设置
因为默认情况下,SecureCRT不能显示语法高亮特性,整个界面颜色单一,看起来不爽,也没有效率,所有通过设置一下语法高亮还是很有必要的, 默认字体也看着不是很清晰,还是更改为我比较喜欢的Courie ...
- GLPI 0.85.5 上传漏洞分析
在exp-db上面看到的漏洞,这是原文链接:https://www.exploit-db.com/exploits/38407/ 但是POC给的很简单,这是原来的描述: " The appl ...
- 记录R的一些黑魔法
通路富集结果可视化 12345678 pathway<-read.table("PTC+_transcript_pep_supp_KEGG.txt",header=T,sep ...
- cssy元素居中的方法有哪些?
css的元素居中 各位小伙伴们在努力写网页的时候有没有遇到过这样的一个问题呢? 在写的时候发现他不居中,可是要分分钟逼死强迫症的啊! 别急,我来啦 哈哈哈 今天就带来三种css的元素居中的方法 第一种 ...
- python django 之 django自带的分页
1. 例1: 基础的分页 1). vim app01/views.py def users(request): from django.core.pagina ...
- Swift --闭包表达式与闭包(汇编分析)
在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数! 一.闭包表达式 概念 闭包表达式与定义函数的语法相对比,有区别如下: 去除了func 去除函数名 返回值类型添加了关键 ...
- 第二篇:如何安装Linux,虚拟机安装Linux
安装Linux的方法挺多,但是这里咱们只说一种:如何在虚拟机里安装运行Linux. 想必看此类文章的都是小白,所以下面我就写的通俗易懂点. 第一步:下载虚拟机软件.(虚拟机软件是啥?它 ...