痞子衡嵌入式:揭秘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) 里痞子 ...
随机推荐
- XSS编码问题的个人总结
XSS也太太太难了,主要也是因为自己没花时间集中. 文章脉络:根据我粗浅的理解,从开始学习XSS到现在,从一开始的见框就插到现在去学构造.编码,首先需要的是能看懂一些payload,然后再去深入理解. ...
- 一个关于HttpClient的轮子
由于本文较长,需要耐住性子阅读,另外本文中涉及到的知识点较多,想要深入学习某知识点可以参考其他博客或官网资料.本文也非源码分析文章,示例中的源码大多是伪代码和剪辑过的代码示例,由于该轮子为公司内部使用 ...
- Linux学习,ACL权限管理
1.setfacl 得到指定文件的ACL权限 -m 表示后续有参数,不可与 -x参数配合使用 -x 删除后续的acl参数,不可与 -m 配合使用 -b 删除所 ...
- Linux 下普通用户切换root超级管理员用户的几种方法
1.在命令行下输入:sudo su ,之后会提示你输入密码 2.此时输入你之前设定的密码既可: 3.但有时会提示你该普通用户不在sudoers文件里 4.此时可以使用以下命令来切换root用户权限:s ...
- Mycat使用配置实践
本来写了好多,关于配置的解释和使用以及注意,但是发现有点啰嗦含金量也不高,所以直接把实际使用的一个例子放着吧,供参考. <!DOCTYPE mycat:schema SYSTEM "s ...
- JDK安装详细步骤
JDK的下载与安装 在java实际编程的道路上,迈出的第一步必定是JDK的安装,因为JDK是一切java的基础,这里给出在Windows10 x64版本下的JDK1.8的详细安装步骤,其他的Windo ...
- 解决xcode ***is missing from working copy
这是由于SVN置顶文件导致的,cd 至项目根目录 命令行 输入 find . -type d -name .svn | xargs rm -rf
- AJ学IOS(06)UI之iOS热门游戏_超级猜图
AJ分享,必须精品 先看效果图 思路 需求分析 1,搭建界面 1>上半部分,固定的,用Storyboard直接连线(OK) 2>下半部分,根据题目的变化,不断变化和调整,用代码方式实现比较 ...
- redis list 基本操作
写在前面的话 本篇笔记写在笔者刚工作时.如有问题,请指教. 简介 list是链表,redis list的应用场景很多,也是Redis 最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能 ...
- Ajax 简述与基础语法
目录 Ajax 1. 原生 JS 实现 Ajax 2. 使用 Ajax 实现异步通信 a. Ajax 的基础语法 b. 用 Ajax 传递数据 i. 传递字符串数据 ii. 传递 JSON 数据 3. ...