大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是SRC_SBMRx寄存器对于定位i.MXRT1xxx离线无法启动问题的意义。
最近有一位开源社区大佬在使能 RT1050 BEE 加密过程中遇到无法启动问题,折腾到一度崩溃,甚至想要弃坑。痞子衡哪能让这位“老乡”跑掉,连忙给予紧急支持,一番了解下来,其实这位大佬已经做好了大部分的工作,但是卡在了一个非常小的启动配置问题上面(他以为他配置好了 BOOT_CFG1[1] - EncryptedXIP,但其实配置并没有生效),这不禁让痞子衡思考,为什么大佬会卡在这里?于是便有了今天的文章,希望通过本篇文章,让所有的 RT 开发者再遇到无法启动问题时,养成第一时间检查 SRC_SBMR1/2 寄存器的意识。
Note: 本文适用全部的 RT10xx 以及 RT1160/1170。
一、从参考手册中的美丽误会说起
在进入正题之前,痞子衡先让大家看一段参考手册里的文字,这段文字存在于全部 RT10xx 的参考手册里(比如 RT1050 RM Rev.5 里)。这段文字讲得是当 SRC_GPR10[28] 位被置起来的时候,BootROM 用 SRC_GPR9 寄存器来替代 SRC_SBMR1 来决定启动设备以及相关配置。
- Note: SRC 模块的寄存器仅在 POR 复位时才会被置位,普通系统软复位不会改变其内容。
如果这段文字是真的,那我们就可以通过调试器直接改写 SRC_GPR9/10 的值再软复位从而切换启动设备,不再需要像往常那样重设 BOOT_CFG pins/fuse 再硬复位来做切换了。就像这样:
但是很遗憾,这段内容是个美丽的错误,它是从 i.MX6ULL 参考手册里直接复制过来的,我们知道 RT 就是脱胎于 6ULL 的架构,但是 RT 的 BootROM 里并没有真的实现这个功能。
二、SRC_SBMRx寄存器作用
如果你注意看,上面那个参考手册里的美丽误会其实告诉了我们一件事,那就是 BootROM 其实是通过 SRC_SBMR1 寄存器来获取启动设备以及相关配置(BOOT_CFG)的。既然如此,当我们配置了 BOOT_CFG pins/fuse 的时候,不妨通过 SRC_SBMR1 寄存器来检查一下配置是否真的生效。除此以外,BootROM 也是通过 SRC_SBMR2 来获取启动模式的,因此这两个寄存器 SRC_SBMR1/2 的值非常重要。
启动配置项 | 启动检查项 |
---|---|
启动模式 BOOT_MODE[1:0]引脚 |
SRC_SBMR2[BMOD] |
启动模式辅助项 Fuse BT_FUSE_SEL 位 |
SRC_SBMR2[BT_FUSE_SEL] |
启动设备选择 BT_CFG[7:0]引脚 / Fuse BOOT_CFG1[7:0] BT_CFG[11:8]引脚 / Fuse BOOT_CFG2[3:0] |
SRC_SBMR1[7:0] SRC_SBMR1[11:8] |
通过调试器获取这两个寄存器的值非常简单,如果是 J-LINK,只需要连上之后使用 mem32 命令读取即可(注意 RT10xx 上的 SRC_SBMR1/2 地址分别是 0x400F8004/0x400F801C,但是 RT1160/1170 上是 0x40C04008/0x40C0401C)。
知道了启动配置检查方法,现在痞子衡告诉你这么做的意义,主要有以下两点。其中第二点就是文章开头那位开源社区大佬掉进坑里的原因(关于 BT_FUSE_SEL 位的解释详见痞子衡旧文 《Boot配置(BOOT Pin/eFUSE)》 1.2 小节)。
- 意义一:有时候因为上电采样时序或者设定后仅软复位原因,BOOT_MODE[1:0] 以及 BT_CFG[11:0] 引脚设定并没有如期生效,所以需要通过 SRC_SBMR2 来确认。
- 意义二:Fuse BT_FUSE_SEL 位在不同 BOOT_MODE[1:0] 下作用不同,这会影响启动设备 BOOT_CFG 最终设定(有时候是 BT_CFG[11:0] 引脚生效,有时候是 Fuse BOOT_CFG1/2 值生效),所以需要通过 SRC_SBMR1 来确认。
至此,SRC_SBMRx寄存器对于定位i.MXRT1xxx离线无法启动问题的意义痞子衡便介绍完毕了,掌声在哪里~~~