首页 > 编程知识 正文

嵌入式厨房设计,轩宇空间科技嵌入式软件软件

时间:2023-05-06 19:04:05 阅读:226622 作者:4960

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦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-EVKboardsevkmimxrt1170bootloader_examplesflashloader)进MCU来实现eFuse烧写,flashloader中集成了OCOTP驱动。关于blhost使用方法,详见痞子衡Boot系列文章,这里仅列出两个命令:

NXP-MCUBootUtilitytoolsblhost2_3win> .blhost.exe -u -- efuse-program-once 0x28 12345678NXP-MCUBootUtilitytoolsblhost2_3win> .blhost.exe -u -- efuse-read-once 0x28 2.2 OCOTP驱动

  如果你觉得blhost工具这一套太复杂,可以直接借助SDK包里的ocotp例程(SDK_x.x.x_MIMXRT1170-EVKboardsevkmimxrt1170driver_examplesocotp),代码也是非常简单清晰:

#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图形界面工具,phdcb都能轻松上手烧写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主页、微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。