大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT下测试启动特性时可改写OTP Shadow寄存器而不烧OTP。
我们知道恩智浦 i.MXRT 系列除了 BOOT 相关引脚电平配置之外,主要通过片内 eFuse/OTP 存储器来进一步配置启动特性。如果我们想测试的启动特性仅能通过 eFuse/OTP 来配置,那么就需要烧写 eFuse/OTP,而 eFuse/OTP 仅能烧写一次,如果不小心值烧错了(或者写入的值未经验证),那这颗芯片就废了,所以面对这种情况,大家难免会焦虑。今天痞子衡就和大家聊聊消除这方面焦虑的一个替代方法,即用调试器直接改写 OTP Shadow 寄存器做测试。
在进入正文之前,有必要介绍一下,eFuse/OTP 存储中的 BOOT 相关的内容在芯片 POR 之后会自动被系统硬件加载到相应 eFuse/OTP Shadow 寄存器中,Shadow 寄存器的读取很简单,跟普通寄存器一样,而 ROM 代码执行时正是从这些 Shadow 寄存器中去获取得启动配置(并不是从 eFuse/OTP 存储中去直接读取),这是本文方法能生效的大前提。
Note:本文方法仅在 RT500/600/700/1180 上生效。
一、主流RT4digits上设计
首先来回顾下 RT10xx 以及 RT1160/1170 上 eFuse 配置设计。关于 eFuse 本身介绍可以参见痞子衡旧文?《eFUSE及其烧写方法》。痞子衡从芯片手册里找出了比较核心的 eFuse BOOT_CFG 配置对应的 Shadow 寄存器地址,此外 RT1060 系列参考手册(V3)里提及 Shadow 寄存器是 RW 属性,而 RT1160/1170 系列参考手册(V3)提及 Shadow 寄存器是 RO 属性。
原则上如果 Shadow 寄存器是 RO 属性,那我们就不用忙活了,通过调试器改写其值根本行不通。不管怎样,还是以板级实测为准,痞子衡用 J-Link Commander 实测如下,不管是 RT1060 还是 RT1170,其 Shadow 值都是可以改写成功的,但是一旦软复位后,其值会变成改写前的状态(这意味着任何一次软复位,系统硬件都会重新加载 eFuse 内容到相应 Shadow 寄存器里),这就是为什么此方法在主流 RT4digits 上行不通的原因。
但是好在主流 RT4digits 上 32bit BOOT_CFG 的前 12 bit 是可以映射到外部引脚(BT_CFG pin)上的,也算是一种安慰,关于这个设计,详见痞子衡旧文《如果i.MXRT1xxx离线无法启动,请先查看SRC_SBMRx寄存器》。不过如果需要配置 BOOT_CFG 的其他 bit 位或者其他 BOOT 相关的 eFuse 域,就只能通过烧写 eFuse 来实现了。
二、主流RT3digits上设计
再来看看 RT500/600 上 OTP 配置设计。关于 OTP 本身介绍可以参见痞子衡旧文?《OTP及其烧写方法》。同样从芯片手册里找出了比较核心的 OTP BOOT_CFG 配置对应的 Shadow 寄存器地址,RT500/700 参考手册里有 OCOTP 模块寄存器介绍,而 RT600 用户手册里并没有(不用担心,在 SDK 里头文件里能找到)。
Note:由于目前 RT700 尚未 launch,痞子衡手头参考手册里显示 OTP Shadow PARTx0-47, PARTx144-511 是可操作状态,其余是 reserved 状态(包括 SDK_25_09 里头文件也是如此),但是在 lifecycle 为 0x3 的情况下, 我们比较关心跟 boot 相关的 Shadow PARTx136-143 也是能操作的。
一样的方法用 J-Link Commander 实测如下,Shadow 值可以改写成功,并且软复位后,其值会保持住(这意味着主流 RT3digits 上系统硬件只在 POR 时重新加载 OTP 内容到相应 Shadow 寄存器里),所以本方法在主流 RT3digits 上可行,我们完全不用烧写任何 OTP 就能进行想要的测试。实际上痞子衡之前用这个方法解决过一个问题,详见《快速定位i.MXRT600板级设计ISP[2:0]启动模式引脚上电时序问题的方法》。
Note:RT700 测试是在 ISP 模式下,如果是 Boot 模式,需保证软复位后 App 能正常运行,否则会进入 Activate debugger(Debug Mailbox)环节。
至此,i.MXRT下测试启动特性时可改写OTP Shadow寄存器而不烧OTP痞子衡便介绍完毕了,掌声在哪里~~~
519