痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MXRT1170的eFuse空间访问可靠性保护策略。
关于i.MXRT系列的eFuse/OTP,痞子衡之前在介绍Boot时写过两篇,分别是针对RT1050的《eFuse及其烧写方法》 和针对RT600的《OTP及其烧写方法》,今天要介绍的i.MXRT1170 eFuse其实是这两者的融合,在空间组织上(尤其是Shadow Register)更像RT1050,但是在访问可靠性保护策略上又接近RT600。关于访问可靠性保护策略,痞子衡之前没有提及,今天咱们就展开聊一聊。
一、eFuse基本情况
eFuse是i.MXRT1170内嵌的一块OTP(One Time Programmable) memory,仅可被烧写一次(这里指的是bit位从0到1不可逆),但可以被多次读取。eFuse memory的烧写情况根据可靠性保护策略不同而不同。如果被冗余方法保护,那么eFuse是按bit被烧写的;如果是被ECC方法保护的,那么eFuse是按word被烧写的。
i.MXRT1170的eFuse memory用户地址空间有8Kbit(地址范围为0x900 - 0x18F0,低4bit地址位无效),分为32个BANK,每个BANK含8个word(1word = 4bytes)。下图中0x00 - 0xFF是eFuse的用户bank word索引地址,其与eFuse空间地址对应关系是:
fuse_address = user_fuse_index * 0x10 + 0x900
此外i.MXRT1170的eFuse memory还有额外的0.5Kbit地址空间(范围为0x800 - 0x8F0,低4bit地址位无效),用于存放厂商(NXP)配置以及一些敏感配置,其与eFuse空间地址对应关系是:
fuse_address = supp_fuse_index * 0x10
不管是8Kbit用户空间还是额外的0.5Kbit敏感空间,我们都是可以访问的,其index其实是统一编址的,下面这个index才是真正用于blhost工具或者OCOTP API的地址参数:
fuse_address = fuse_index * 0x10 + 0x800
关于i.MXRT1170的eFuse一般特性(比如Lock属性、OCOTP控制器、Shadow Register)可参考痞子衡在文章开头给出的两篇文章,这里不予赘述。
二、eFuse烧写方法
有三种方法或工具可以帮助烧写eFuse,我们以烧写和回读eFuse地址0xA80(MAC1_ADDR)为例,将0x12345678烧写进MAC1_ADDR并回读。根据上面公式我们可以得出 fuse_index = (fuse_address - 0x800) / 0x10 = 0x28,这个fuse_index便是底下我们传给烧写工具的地址。
2.1 blhost工具
blhost是个上位机命令行工具,其能正常工作的前提是预先加载一个特殊flashloader程序(\SDK_x.x.x_MIMXRT1170-EVK\boards\evkmimxrt1170\bootloader_examples\flashloader)进MCU来实现eFuse烧写,flashloader中集成了OCOTP驱动。关于blhost使用方法,详见痞子衡Boot系列文章,这里仅列出两个命令:
\NXP-MCUBootUtility\tools\blhost2_3\win> .\blhost.exe -u -- efuse-program-once 0x28 12345678
\NXP-MCUBootUtility\tools\blhost2_3\win> .\blhost.exe -u -- efuse-read-once 0x28
2.2 OCOTP驱动
如果你觉得blhost工具这一套太复杂,可以直接借助SDK包里的ocotp例程(\SDK_x.x.x_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\ocotp),代码也是非常简单清晰:
#include "fsl_ocotp.h"
int main(void)
{
status_t status = kStatus_Success;
uint32_t fuseData = 0U;
/* 初始化OCOTP模块 */
OCOTP_Init(OCOTP, 0U);
/* 将word数据(0x12345678)写入fuse index为0x28的eFuse memory里 */
status = OCOTP_WriteFuseShadowRegister(OCOTP, 0x28, 0x12345678);
/* 从fuse index为0x28的eFuse memory处读出一个word*/
status = OCOTP_ReadFuseShadowRegisterExt(OCOTP, 0x28, &fuseData, 1);
}
2.3 MCUBootUtility工具
如果你觉得blhost使用不友好,OCOTP驱动又需要改代码和下载运行,那么还有一个工具可以帮到你,那就是痞子衡开发的MCUBootUtility图形界面工具,小白都能轻松上手烧写eFuse:
三、访问可靠性保护策略
eFuse的特性其实主要是OCOTP模块决定的,翻开i.MXRT1170参考手册的OCOTP章节的Features小节,可以看到其比RT1050 OCOTP多了如下这三行:
• Supports ECC mode programming and reading for MTR fuse words by SkyBlue IPS bus
• Supports ECC mode programming and reading for all the user fuse words
• Supports redundancy mode programming and reading for all the supplementary fuse words
简单地说就是eFuse空间被分成了两类,一类受ECC保护,一类受redundancy(冗余)保护,这是本文要介绍的重点。
3.1 冗余保护
redundancy(冗余)保护是比较简单的访问可靠性保护策略,这个策略基本设计思想就是冗余,将fuse word一分为二,低16bit是用户操作区,高16bit是系统冗余区。烧写时用户只需要管低16bit,高16bit则由系统自动完成复制烧写。回读时得到的结果则是低16bit与高16bit的或(OR)结果。这样的好处就是除非用户操作区(低16bit)和系统冗余区(高16bit)均发生错误才会导致访问不可靠。
redundancy(冗余)保护虽然一定程度上提高了访问可靠性,但代价是牺牲了一半存储空间,所谓鱼和熊掌不可兼得,这个也是可以理解的。下面这些eFuse区域是受redundancy(冗余)保护的,从功能上看这些区域是按bit定义的,功能比较分散,所以存在多次烧写的需求,适用redundancy(冗余)保护。
3.2 ECC保护
ECC保护是相对复杂的访问可靠性保护策略,ECC算法是采用经典的SEC-DED(纠正1bit,检查2bit),每个fuse word算出一个ECC校验值(7bit),这个校验值紧跟着存在efuse word后面(bit31:0是用户区,bit38:32是ECC区),ECC区无法被用户直接访问。如果在回读时发生ECC错误,可在HW_OCOTP_OUT_STATUS0寄存器(这是RT1170 OCOTP模块新增的寄存器)里如下bit找到信息。

ECC保护极大地提高了访问可靠性,但综合eFuse特点其代价就是整个fuse word仅可被烧写一次(即使你一次只改一个bit)。下面这些eFuse区域是受ECC保护的,不过从功能上看这些区域功能比较单一,一般都是一次性烧写,所以也适用ECC保护。
至此,恩智浦i.MXRT1170的eFuse空间访问可靠性保护策略痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:揭秘i.MXRT1170 eFuse空间访问可靠性的保护策略(冗余与ECC)的更多相关文章
- 痞子衡嵌入式:MCUXpresso IDE下在线调试时使用不同复位策略的现象总结
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是MCUXpresso IDE下在线调试时使用不同复位策略的现象总结. 本篇实际上是<IAR在线调试时设不同复位类型可能会导致i.M ...
- 痞子衡嵌入式:揭秘i.MXRT1170上用J-Link连接复位后PC总是停在0x223104的原因
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上安全调试策略实现对JLink调试的影响. 痞子衡之前写过一篇旧文 <i.MXRT600的ISP模式下用J-L ...
- 痞子衡嵌入式:揭秘i.MXRT1170上串行NOR Flash双程序可交替启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1170上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1060/1010上串行NOR F ...
- 痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 Raw NAND启动时间. 关于i.MXRT1170这颗划时代的MCU,痞子衡去年10月在其刚发布的时候, ...
- 痞子衡嵌入式:简析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.MX RT系列MCU启动那些事(5)- 再聊eFUSE及其烧写方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的eFUSE. 在i.MXRT启动系列第二篇文章 Boot配置(BOOT Pin, eFUSE) 里痞子 ...
随机推荐
- 201771010108-韩腊梅 实验一 软件工程准备—<对软件工程的初步了解>
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/nwnu2020SE 这个作业要求链接 https://www.cnblogs.com/nwnu- ...
- es elasticsearch 6/7 设置内存方法
es节点的默认的heap内存大小是 1G 大小,在实际生产中,很容易导致内存溢出而导致进程被kill掉.所以我们一般会自己配置自己的,2.x的版本可以通过export ES_HEAP_SIZE=10g ...
- java编写规范
编码规范 转载于:https://www.cnblogs.com/ftl1012/p/javaCode.html 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的 ...
- json的fromjson的方法使用。可以在volley中进行使用
Gson提供了fromJson()方法来实现从Json相关对象到Java实体的方法. 在日常应用中,我们一般都会碰到两种情况,转成单一实体对象和转换成对象列表或者其他结构. 先来看第一种: 比如jso ...
- gdb调试工具常用命令 && kdb
编译程序时需要加上-g,之后才能用gdb进行调试:gcc -g main.c -o main gdb中命令: 回车键:重复上一命令 (gdb)help:查看命令帮助,具体命令查询在gdb中输入help ...
- shell http请求&处理返回值获取其中某个字段的值
并且第一个接口的返回值中部分参数得作为第二个接口的入参,所以做了如下shell验证 第一个接口返回的response body串: { "bizCode": "1&quo ...
- 两个div在同一行显示
栅格系统需要引用bootstrap插件 <script src="~/Scripts/BootStrap/bootstrap.js"> </script> ...
- Jmeter常用元件
1.测试计划:测试元件的容器,相当于一个项目名称 线程组: 2.监听器:负责收集测试结果,同时也被告知了结果显示的方式 (1)查看结果树:看具体某个请求——请求响应,结果明细 (2)聚合报告:汇总报 ...
- php-fpm 进程数的设定
近日,服务器出现异常,网站不能正常访问.经排查是php的问题. 在重启php-fpm时,恢复正常.1分钟之后又出现故障.查看php日志文件 /usr/local/php/var/log 后提示 WAR ...
- 在Sping的配置文件中,关于dataSource的配置,就我们常用的方法大致可以有三种:
在Sping的配置文件中,关于dataSource的配置,就我们常用的方法大致可以有三种: 1.一般的配置方法,直接在配置中指定其值.具体的例子我们参照Mysql的配置如下: <bean id= ...