痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(4)- OTP及其烧写方法

2023-12-21 11:18

本文主要是介绍痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(4)- OTP及其烧写方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的OTP

  在i.MXRTxxx启动系列第二篇文章 Boot配置(ISP Pin, OTP) 里痞子衡提到了OTP,部分Boot配置都存储在OTP memory里,但是对OTP的介绍仅仅浅尝辄止,没有深入,今天痞子衡就为大家再进一步介绍OTP。

  OTP是i.MXRTxxx里一块特殊的存储区域,用于存放全部芯片配置信息,其中有一部分配置信息和Boot相关。这块特殊存储区域并不在ARM的4G system address空间里,需要用特殊的方式去访问(读/写),如何访问OTP是本篇文章的重点。

一、OTP基本原理

1.1 OTP属性(OTP, Shadow Lock)

  OTP本质上就是i.MXRTxxx内嵌的一块One Time Programmable memory,仅可被烧写一次,但可以被多次读取。OTP memory的烧写大部分是按Word进行的(也有极少部分是按Bit进行的),初始状态下所有OTP bit均为0,通过特殊的烧写时序可以将bit从0改成1,一旦某bit被烧写成1后便再也无法被修改(可理解为硬件熔丝烧断了无法恢复)
  i.MXRT600的OTP memory总地址空间有2KB(word index范围为0x000 - 0x1FF),分为64个BANK,每个BANK含8个word(1word = 4bytes)。
  OTP memory空间除了OTP特性外,还有Shadow Lock控制特性,Shadow Lock控制是OTP memory的标配,Lock控制有二种:第一种是WP,即写保护,用于保护OTP区域对应的shadow register不能被改写;第二种是RP,即读保护,被保护的OTP区域对应的shadow register不能被读取。看到这里,你会发现i.MXRTyyyy的efuse里的LOCK控制是同时针对efuse本身和shadow register的;而i.MXRTxxx的OTP里的LOCK控制仅针对shadow register,那么对OTP本身的保护在哪里呢?先别急,后面会给你答案。
  Shadow Lock控制在OTP的BANK0_word4、BANK1_word8/9,如下是RT600具体Lock bit定义:

关于OTP空间所有bit定义详见Reference Manual里的otpmap Descriptions。

1.2 OCOTP控制器与Shadow Register

  i.MXRTxxx内部有一个硬件IP模块叫OCOTP_CTRL,即OCOTP控制器,对OTP memory的读写控制操作其实都是通过这个OCOTP控制器实现的,下图是OCOTP_CTRL模块图:

  OCOTP_CTRL模块寄存器一共分两类:一类是IP控制寄存器,用于实现对OTP memory的读写操作时序控制;一类是Shadow register,用于上电时自动从OTP memory获取数据并缓存,这样我们可以直接访问Shadow register而不用访问OTP memory也能获取OTP内容(注意:当芯片运行中烧写OTP,Shadow register的值并不会立刻更新,需要执行IP控制器的reload命令或者将芯片reset才能同步)。
  下图是RT600里的OCOTP_CTRL模块寄存器map,其中Shadow register寄存器偏移地址范围是0x000 - 0x7FF(注意并不是所有OTP Word都会被加载到Shadow register里,虽然Shadow register预留了全部的OTP位置。这点与i.MXRTyyyy efuse会全部加载到Shadow register不同,原因是i.MXRTxxx的OTP里会有很多Peripheral寄存器加载初值,如果这些OTP值目的是加载Peripheral,那就没有必要再加载到Shadow register里,而i.MXRTyyyy的efuse值没有加载Peripheral寄存器的用途)。IP控制寄存器偏移地址范围是0x800 - 0x82C:

  痞子衡写过关于i.MXRTyyyy的eFUSE烧写的文章 飞思卡尔i.MX RTyyyy系列MCU启动那些事(5)- 再聊eFUSE及其烧写方法 ,其实i.MXRTxxx的OCOTP控制器与i.MXRTyyyy里的OCOTP控制器非常相似,虽然两者在寄存器组织上有差异,但其共同点更多。不过提及差异,有一个地方痞子衡不得不提,那就是CTRL寄存器的bit15,在i.MXRTyyyy上这个bit是保留的,但是i.MXRTxxx上这个bit为WORDLOCK,顾名思义即提供对操作的OTP word区域进行保护(主要是写保护),下一节介绍的efuse-program-once命令第三个可选参数[nolock/lock]其实就是利用了这个bit

二、使用blhost烧写OTP

  OTP memory的烧写是通过OCOTP_CTRL模块来实现的,我们当然可以在Application中集成OCOTP_CTRL的驱动程序,然后在Application调用OCOTP_CTRL的驱动程序完成OTP的烧写,但这种方式并不是痞子衡要介绍的重点,痞子衡要介绍的是通过Serial ISP模式配套的blhost.exe上位机工具实现OTP的烧写。
  痞子衡在前面的文章里介绍过如何进入Serial ISP模式与BootROM通信,此处假设你已经使用blhost与BootROM建立了通信。让我们再来回顾一下blhost的命令help,可以得知efuse-program-once这个命令就是我们想要的命令。

PS D:\NXP-MCUBootUtility\tools\blhost2_3\win> .\blhost.exe
usage: D:\NXP-MCUBootUtility\tools\blhost2_3\win\blhost.exe[-p|--port <name>[,<speed>]][-u|--usb [[[<vid>,]<pid>]]]-- command <args...>Command:efuse-program-once <addr> <data> [nolock/lock]Program one word of OCOTP Field<addr> is ADDR of OTP word, not the shadowed memory address.<data> is hex digits without prefix '0x'efuse-read-once <addr>Read one word of OCOTP Field<addr> is ADDR of OTP word, not the shadowed memory address.

  让我们试一下efuse-program-once这个命令,开始试之前要解决2个问题:
  addr参数到底是什么地址?帮助里说是OTP word address,其实这个地址就是1.1节里介绍的word index,index范围为0x000 - 0x1FF,对应512个可读写操作的OTP Word。
  data参数到底是什么格式?帮助里说是hex digits without prefix '0x',但是似乎没有指明长度,我们知道每一个index对应的是4byte,那就应该是8位16进制数据(实测下来必须要填8位,如果是非8位会返回Error: invalid command or arguments)。
  弄清了问题,那我们做一个小测试:要求将OTP里的REVOKE_IMG_KEY word的最低byte烧写成0x5A。翻看OTP Memory Footprint表,找到REVOKE_IMG_KEY的index地址是0x66(对应Shadow register地址是0x40130198),命令搞起来:

PS D:\NXP-MCUBootUtility\tools\blhost2_3\win> .\blhost.exe -u -- efuse-program-once 0x66 0000005A

Inject command 'efuse-program-once'
Successful generic response to command 'efuse-program-once'
Response status = 0 (0x0) Success.

PS D:\NXP-MCUBootUtility\tools\blhost2_3\win> .\blhost.exe -u -- efuse-read-once 0x66

Inject command 'efuse-read-once'
Response status = 0 (0x0) Success.
Response word 1 = 4 (0x4)
Response word 2 = 90 (0x5a)

  看起来命令执行正常,如果此时你用J-Link去读取对应Shadow register的值,你会发现刚才烧写的OTP数据并没有自动同步更新到Shadow register里。与i.MXRTyyyy系列下Flashloader里efuse program操作有所不同的是,i.MXRTxxx Serial ISP模式下blhost里的efuse-program-once命令仅包含program命令,没有集成reload命令。因此想要刷新Shadow register,必须复位芯片

  至此,恩智浦i.MX RTxxx系列MCU的OTP痞子衡便介绍完毕了,掌声在哪里~~~

这篇关于痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(4)- OTP及其烧写方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/519769

相关文章

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时,我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗?希望大家帮帮我,非常感谢!” 在这个数字化飞速发展的时代,电脑早已成为我们日常生活和工作中不可或缺的一部分。然而,就像生活中的小插曲一样,有时我们可能会在不经意间犯下一些小错误,比如不小心删除了重要的文件。 当那份文件消失在眼前,仿佛被时间吞噬,我们不禁会心生焦虑。但别担心,就像每个问题

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt

邮件群发推送的方法技巧?有哪些注意事项?

邮件群发推送的策略如何实现?邮件推送怎么评估效果? 电子邮件营销是现代企业进行推广和沟通的重要工具。有效的邮件群发推送不仅能提高客户参与度,还能促进销售增长。AokSend将探讨一些关键的邮件群发推送方法和技巧,以帮助企业优化其邮件营销策略。 邮件群发推送:目标受众 了解他们的需求、兴趣和行为习惯有助于你设计出更具吸引力和相关性的邮件内容。通过收集和分析数据,创建详细的客户画像,可以更精

上采样(upsample)的方法

上采样(upsample)的方法   在神经网络中,扩大特征图的方法,即upsample/上采样的方法   1)unpooling:恢复max的位置,其余部分补零   2)deconvolution(反卷积):先对input补零,再conv   3)插值方法,双线性插值等;   4)扩张卷积,dilated conv;

Docker启动异常

报错信息: failed to start daemon: Error initializing network controller: error creating default "bridge" network: cannot create network b8fd8c684f0ba865d4a13d36e5282fd694bbd37b243c7ec6c9cd29416db98d4b (d

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级

青龙面板部署通用教程,含服务器、路由器、X86等部署方法

1. 拉取镜像/更新镜像 docker pull whyour/qinglong:latest 2. 删除镜像 docker rmi whyour/qinglong:latest 3. 启动容器 普通服务器 docker run -dit \-v $PWD/ql/config:/ql/config \-v $PWD/ql/log:/ql/log \-v $PWD/ql/db: