介绍一下i.MXRT1170上用于保护片内OCRAM1,2的MECC64功能

今天痞子衡给大家分享的是i.mxrt1170 mecc64功能特点及其保护片内ocram1,2之道。
ecc是 “error correcting code” 的简写,ecc 能够实现错误检查和纠正,含有 ecc 功能的内存一般称为 ecc 内存,使用了 ecc 内存的系统在稳定性和可靠性上得到很大提升。相比前几代不带 ecc 的 i.mxrt10xx 型号,新一代 i.mxrt1170 在ecc上做了全面武装,从 efuse 到 flexram,从 ocram 到外部存储空间全都加上了 ecc 功能。如下表所示,不同类型的存储由不同的 ecc 控制器来守护:
今天痞子衡给大家简单介绍一下 i.mxrt1170 上用于保护片内 ocram1,2 的 mecc64 功能:
一、mecc64功能简介
1.1 mecc64特点
从用户角度来说,其实 mecc64 的设计特别简单,当 mecc64 使能后,任何对受保护的 ocram1/2 发起的 axi 访问都会被 mecc64 模块接管,mecc64 组件负责根据用户写入的数据产生 ecc 校验值并将其存放于专用 ocram1/2_ecc 里,读访问时根据用户读取的地址从相应 ocram1/2_ecc 地址处获取 ecc 检验值并做检验处理后再返回数据。
从模块框图里看一个 mecc64 里有四个 ecc 校验流程(也对应四个 ram bank 控制器),这其实是跟单个 512kb ocram 由四个 128kb bank 组成一一对应的,这样便于转化 axi64 接口到 ram 接口。
1. ocram 四个 bank 挂载在 axi64 系统总线上,axi[1:0] 决定了访问得是 bank0-3,这样的设计可以支持对不同 bank 的读、写操作同时进行。2. ecc 计算单元是 64bits,这 64bits 数据必须在同一 bank 里,这个设计对 ecc 初始化操作影响较大,因此避免用 memset 函数去做初始化(str指令是 byte access)。  
mecc64 模块一共有两个,分别是 mecc1、mecc2,分别对应保护 ocram1、ocram2。此外还有两个专用 ocram1_ecc、 ocram2_ecc 存放 ecc 校验值(当 mecc64 没使能时,ocram1/2_ecc 也可当作普通 ocram 使用)。
mecc1 base address: 4001_4000hmecc2 base address: 4001_8000h  
1.2 关于mecc64设计细节
关于 mecc64 基本概念,参看《简析i.mxrt1170 cortex-m7 flexram ecc功能特点、开启步骤、性能影响》 的 1.2节,这里不予赘述。
1.2.1 mecc64检验能力
mecc64 中每 64bits 数据就会计算出一个 ecc 校验值(8bits),ecc 算法用得是经典的 hsiao hamming。
存储类型 ecc校验数据块大小 ecc校验值长度 ecc校验能力
raw nand 512 bytes 4 bytes 5-bit检错,4-bit纠错
mecc64 64bits 8bits 2-bit检错,1-bit纠错
1.2.2 ecc错误触发处理
ecc 错误分两种,分别是 1-bit 错误和 2-bit 错误(针对 64bits 数据而言)。从软件层面来看,1-bit 错误可以不用管,mecc64 模块会自动纠错。我们主要处理 2-bit 错误,由于 2-bit 错误仅能检错,无法纠错,所以发生了这个错误,就意味着读取的数据不可靠了。对于 1/2 bit错误,mecc64 均提供了中断响应(meccx_int_irqn / meccx_fatal_int_irqn)。
这里还需要特别提醒一下,当读访问是 64bits 时,发生 ecc 错误仅产生一次 ecc 中断,但是如果是 32/16/8bits 读访问则会连续产生两次 ecc 中断,因为 ecc 校验总是以 64bits 为基本数据单元。
二、开启mecc64的步骤
2.1 激活mecc64特性
芯片出厂,默认是没有激活 mecc64 特性的,如果需要开启 mecc64,需要烧写 efuse,fusemap 中 0x840[2] 对应的是 mecc_enable bit,我们需要将这个 bit 烧写成 1,才能激活 mecc64 特性。
2.2 sdk驱动初始化mecc64
然后可以直接利用 sdk 里的 fsl_mecc 驱动对 mecc64 模块进行初始化,代码非常简单,如下示例代码就是初始化 mecc1,使能 ocram1 区域的读写 ecc 功能:
#include fsl_mecc.hvoid init_mecc(void){    mecc_config_t config;    mecc_getdefaultconfig(&config);    // 使能 mecc64,并且指明受保护的 ocram 空间    config.enablemecc         = true;    config.ocram1startaddress = 0x20240000;    config.ocram1endaddress   = 0x202bffff;    // 初始化 mecc64 模块,并且初始化 ocram 区域为全 0    mecc_init(mecc1, &config);}  
进 mecc_init() 函数内部可以看到其对 ocram 区域的初始化用得是 64bits 赋值,这样可以保证正确生成首次 ecc 校验值,等 ocram 区域全部初始化过后,底下就可以对 ocram 进行任意数据长度的访问了。
2.3 axi方式读写ocram区域
现在我们直接调试 sdk_2_14_0_mimxrt1170-evkboardsevkbmimxrt1170driver_examplesmeccmecc_single_errorcm7iar 工程,跑到 mecc 初始化结束后,打开 memory 窗口,可以看到 ocram1 区域(0x20240000 - 0x202bffff) 已经是全 0,ocram1_ecc 区域(0x20340000 - 0x2034ffff)也是全 0。但是往 0x20240020 处写入 8 字节测试数据后,并没有看到 ocram1_ecc 区域有数据上的变化,说明 ecc 校验码数据是受保护的,仅能被 mecc64 模块访问,对用户不可见。
三、激活mecc64特性后的影响
前面讲到 fusemap 中 0x840[2] 对应的是 mecc_enable bit,这个 bit 被烧录为 1 后,我们还需要初始化 mecc64 模块里(打开mecc->pipe_ecc_en[ecc_en])才能真正开启 ocram ecc 功能,但是别忘了芯片参考手册里 mecc64 章节有一个提醒:
是的,bootrom 上电运行,第一件事就是检查 fuse mecc_enable bit 位,如果已经置 1,那就立刻开启 mecc1 和 mecc2 模块的 pipe_ecc_en[ecc_en],即启用 ocram ecc,但是 bootrom 并没有初始化全部 ocram1 和 ocram2 区域,仅仅初始化了 ocram1 前 48kb,这部分是 bootrom 程序的 rw 区。
痞子衡找了两块 rt1170 板卡做了对比测试(芯片设为 serial downloader模式,挂上 jlink 读取内存),未激活 mecc64 特性的芯片 ocram 区域读取出来全是随机值,而激活了 mecc64 特性的芯片仅 rom rw 区被初始化了以及 ocramx_ecc 不可访问外,其余区域全是随机值(这里的读取其实不太可靠,毕竟使能了 ecc 后首次访问必须是写,然后才能正常被读写)。
对于激活了 mecc64 特性之后的芯片,无论是设计下载算法还是 ide 里的初始化脚本,或者 app 应用里的变量访问,如果涉及到 rom rw 区之外的 ocram1,ocram2 区域,建议一律做先写后读处理,否则可能会出现奇怪的错误。
至此,i.mxrt1170 mecc64功能特点及其保护片内ocram1,2之道痞子衡便介绍完毕了,掌声在哪里~~~


美国开发自动还原马赛克的AI开源算法
iphone8什么时候上市,iphone8最新消息:拍照就能测体温、心跳、呼吸、血压喜欢吗?
无线游戏耳机哪个牌子好?最新无线游戏耳机榜单
降低企业数字化门槛,华为云助力企业转型成效明显!
全栈创新为NVIDIA最高MLPerf推断2.1结果提供燃料
介绍一下i.MXRT1170上用于保护片内OCRAM1,2的MECC64功能
关于2018年私有和混合云市场的5个预测
手机大厂扎堆智能电视领域,短期预测智能电视入口价值或被高估
数字音视频技术有什么特点?
Raspberry Pi Pico所用的RP2040芯片
无线充电还可以这样玩?苹果申请新专利MacBook和iPhone可无线共享电量
智能手机可用近场通信(NFC)帮您控制重要数据
电流表到底是不是用电器呢
剑桥大学利用VR技术模拟了癌细胞病变的过程
人工智能能做什么
近场RCS检测技术在隐身材料测试中的应用
中兴通讯TD-SCDMA传输解决方案
Realme GT智能手机系列是“双平台双旗舰”战略的一部分
中芯国际董事长周子学指出 任何国家和地区都不可能实现100%纯本土化制造
无线时代的RF半导体工艺你知道多少?