大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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 属性。
芯片系列 | OTP Shadow寄存器起始地址 | Fuse BOOT_CFG对应Shadow寄存器地址 | 参考手册提及Shadow寄存器属性 |
---|---|---|---|
RT10xx | 0x401F4000 + 0x400 | 0x401F4450 (BOOT_CFG1&2&3&4) | RW |
RT1160/1170 | 0x40CAC000 + 0x800 | 0x40CAC940 (BOOT_CFG1&2) 0x40CAC950 (BOOT_CFG3&4) | 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 也是能操作的。
芯片系列 | OTP Shadow寄存器起始地址 | OTP BOOT_CFG对应Shadow寄存器地址 | 参考手册提及Shadow寄存器属性 |
---|---|---|---|
RT500/600 | 0x40130000/0x50130000 + 0x0 | 0x40130180 (BOOT_CFG[0]) 0x40130184 (BOOT_CFG[1]) 0x40130188 (BOOT_CFG[2]) 0x4013018C (BOOT_CFG[3]) | RW |
RT700 | 0x40018000/0x50018000 + 0x0 | 0x40018220 (BOOT_CFG0) 0x4001823C (LIFECYCLE) 0x40018240 (XSPI0_IPED_CTX0) | RW |
一样的方法用 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痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。