【TC3xx芯片】TC3xx芯片的Endinit功能详解

news2024/12/25 9:14:30

目录

前言

正文

1.功能概述

2. WDTxCON0 的密码访问(Password Access to WDTxCON0)

2.1 Static Password

2.2 Automatic Password Sequencing

2.3 Time-Independent Pasword

2.4 Time Check Password

3. WDTxCON0的检查访问(Check Access to WDTxCON0)

4. WDTxCON0的修改访问(Modify Access to WDTxCON0)

5. 访问受Endinit保护的寄存器 

5.1 通过WDT访问Endinit保护的寄存器

5.2 不通过WDT访问Endinit保护的寄存器

6. Endinit实际应用

6.1 Endinit需求及场景介绍

6.2 Endinit解锁

6.3 Endinit上锁

7. 总结


前言

为了提供系统的安全性能,TC3xx上一些重要的寄存器都受Endinit保护不能直接修改。如果想要修改这些重要寄存器,就需要先按特定步骤解锁Endinit,然后才能修改这些重要的寄存器的值,最后还要上锁Endinit。那什么是Endinit功能了? -- 本文就来详细解锁TC3xx芯片的Endinit机制

Note: 第1到5章节都是关于Endinit的概念介绍,如果感觉比较枯燥可以先从第6章节的实际应用开始阅读。

缩略词

简写

全称

Endinit

End of initialization

WDTCPUyCON0

CPUy WDT Control Register 0

WDTSSR

Safety WDT Status Register

正文

1.功能概述

在系统或应用程序的初始化过程中,通常只对一些寄存器进行一次编程(programmed only once)。 在正常应用程序运行期间修改此类寄存器可能会严重影响模块或整个系统的整体运行。

虽然 Supervisor Mode 和 Access Protection 方案提供了一定级别的保护,防止意外修改,但它们可能不足以防止对系统关键注册器的所有意外访问。

为这类寄存器提供了额外的保护,称为 Endinit (“End off initialization”)。 Endinit 是一种写保护方案,它只允许在特定时间进行写入,并使受此功能保护的寄存器的意外修改几乎不可能实现。

Endinit 功能由每个 WDT 控制寄存器中包含的 ENDINIT 位组成。 通过 Endinit 保护的寄存器决定是否启用写入。 只有当相应的 ENDINIT =0 且主管模式处于活动状态时,才会启用写入。 如果这种情况不正确,则写入尝试将被放弃,在这种情况下,寄存器内容将不会被修改。

为了获得最高的稳定性,写入 ENDINIT 位将受到 WDT 中实施的高度安全的访问保护方案的保护。 这是一个复杂的过程,几乎不可能无意中修改 ENDINIT  bits。 此外,每次软件通过清除相应的 ENDINIT 位来打开对关键寄存器的访问时,每个 WDT 都会启动超时序列来监视 ENDINIT 位的修改。 如果超时时间在相应的 ENDINIT 位再次设置之前结束,则假定软件出现故障,并生成看门狗故障响应。

以下各节介绍了 WDT 的访问保护方案和 Endinit 超时操作。 在每个模块 (包括 SCU 本身) 的寄存器概览表中,通过每个 Endinit 类型保护的寄存器在描述写入访问的列中标识,如下所示:

. “ CEy ” - CPU 关键寄存器。 仅当 CPUy WDT ENDINIT=0 (y=CPU number) 时可写。也就是,只有把要要访问这个寄存器的CPU的ENDINIT设为0后,这个寄存器才能被这个CPU写访问(也就是解锁WDTCPUyCON0.ENDINIT)。

. “ E ” - 系统关键寄存器 - 任何 (一个或多个) CPUy 看门狗计时器 ENDINIT=0 或 EICON0.ENDINIT=0 时可写。也就是,任意一个CPU的ENDINIT设为0后,所有CPU都可以对这个寄存器进行写访问。

. “ SE ” - 安全关键寄存器 - 仅当安全监控计时器 ENDINIT=0 或 SEICON0.ENDINIT=0 时才可写入。也就是,Safety Watchdog的ENDINIT设为0后,Safety EndInit的保护就解除了,所有CPU都可以对这个寄存器进行写访问(也就是解锁WDTSCON0.ENDINIT)。

. 以上都不是 - 随时都可以访问

图 1 显示了解锁各种 ENDINIT 写保护模式的选项。

Figure 1: ENDINIT Control Registers

Note: ENDINIT 位的清除需要一些时间。 在清除 ENDINIT 位后访问受 Endinit 保护的寄存器必须仅在 ENDINIT 位真正被清除时进行。 作为一种解决方案, ENDINIT 位应在 ENDINIT位 清除后第一次访问受 Endinit 保护的寄存器之前被读回一次。

2. WDTxCON0 的密码访问(Password Access to WDTxCON0)

为了解锁WDTxCON0(x=CPUy and y=CPU number, or S)寄存器并修改WDTxCON0寄存器,必须往WDTxCON0寄存器中写入正确的密码(password)。软件必须事先知道正确的密码,或者在运行时计算密码。 每个监视程序计时器(Watch)的密码 (x=CPUy 和 y=CPU 编号,或 S) 可以不同,以便提供独立的监视程序功能程序流,以具有独立的监视程序功能。

安全监视器密码寄存器(Safety Watchdog password register) WDTSCON0 受通用 SCU 保护,该保护方案只允许配置的masters具有写入访问权限。

特定于 CPU 的监视程序密码寄存器(CPU-specific Watchdog password) WDTCPUyCON0 单独受到保护,因此它们只能由相应的 CPUy 写入。

在安全应用程序中可以使用看门狗来提供恢复时间,在此期间软件可能会尝试从安全警报警告中恢复。 为确保 CPU 故障不允许忽略故障,提供了一个选项,用于在安全管理单元 (SMU) 处于故障状态时防止看门狗解锁。 此选项可由位 WDTxCON1.UR 启用。

如果密码有效且 SMU 状态满足 WDTxSR.US 位的要求,则一旦密码访问完成, WDTxCON0 将被解锁。 解锁条件将由 WDTxCON0.LCK = 0 指示。 为了确保正确的服务顺序(servicing sequence),只有在访问之前设置了 WDTxCON0.LCK 位时才允许密码访问。

如果在密码访问期间向 WDTxCON0 写入了不正确的密码值,则存在看门狗访问错误情况。 位 WDTxSR.AE 已设置,并向安全管理单元 (SMU) 发送警报请求。 14 位用户可定义密码 WDTxCON0.PW 提供了其他选项,用于根据应用程序的需要调整密码要求。 例如,它可用于检测意外的软件循环,或监视例程的执行顺序。

下表 汇总了密码的要求。 有多种选择,下文将更详细地介绍这些选择

Table 1:Password Access Bit Pattern Requirements

2.1 Static Password

在静态密码模式 (WDTxSR.PAL=0) 中,密码只能通过有效的“修改访问”进行更改。 密码访问(Password Access)的设计使其不可能简单的读取寄存器并重写寄存器。 在重新写入之前,某些密码读取位必须反向 (切换)。 这可以防止简单的故障通过简单的读 / 写序列意外解锁 WDT。

2.2 Automatic Password Sequencing

如果启用了自动密码排序 (WDTxSR.PA=1) ,则每次检查密码后,密码会自动更改 (即 Password Access or Check Access)。 预期的下一个密码遵循基于具有特征多项式 x14+X13+x12+x2+1 的 14 位斐波那契(Fibonacci) LFSR (Linear Feedback Shift Register) 的pseudorandom sequence。 修改访问权限还可以提供初始密码 (或后续手动密码更新)。

Figure 2: Password Sequencing LFSR

2.3 Time-Independent Pasword

如果未启用时间检查 (WDTxSR.TCS=0) ,则 WDTxCON0 寄存器的 REL 字段必须在密码访问期间使用现有的重新加载值重新写入。

2.4 Time Check Password

如果启用时间检查 (WDTxSR.TCS=1) , WDTxCON0 寄存器的 REL 字段必须使用当前 WDT 计数值的反向 (位翻转) 估计值写入。 此估计的可接受误差幅度 (在 WDT 时钟周期内) 由 WDTxSR.TCT 的值指定。 如果写入的估计值超出 WDTxSR.TIM +/- WDTxSR.TCT 范围,则 SMU 回发出Alarm报警。 此机制可以检查自上次 WDT 重新启动以来已过的程序执行时间。 请注意,当 WDT 以超时模式运行 (访问受 ENDINIT 保护的寄存器后) 时,密码或检查访问仍需要时间检查比较。

3. WDTxCON0的检查访问(Check Access to WDTxCON0

Check Access 与 Password Access 相同,只不过锁位(lock bit)未被清除,因此不允许后续的“修改访问”。 如果满足写入数据要求,“检查访问”不会触发 SMU 警报请求。 只有在设置了 LCK 位时才能执行检查访问。

此类访问用于 WDT 服务之间的中间检查点。 这可以用于任务序列或执行时间监控 (例如,与时间戳计数检查功能或序列密码结合使用)。

Table 2: Check Access Bit Pattern Requirements

如果在检查访问期间向 WDTxCON0 写入了不正确的值 (x=CPUy and y=CPU number, or S) ,则存在看门狗访问错误情况。 位 WDTxSR.AE 已设置,并向安全管理单元 (SMU) 发送警报请求。

4. WDTxCON0的修改访问(Modify Access to WDTxCON0

如果密码访问(Password Access)成功解锁 WDTxCON0 (x=CPUy and y=CPU number, or S) ,则以接下来的WDTxCON0 的写入访问可以对其进行修改。 但是,这种访问也必须满足某些要求才能被接受并被视为有效。 表 3列出了所需的位模式(bit patterns)。 如果访问不遵循这些规则,则会检测到监视程序访问错误情况,设置位 WDTxSR.AE ,并向安全管理单元 (SMU) 发送警报请求。 修改访问完成后,将再次设置 WDTxCON0.LCK ,自动重新锁定 WDTxCON0。 在重新修改寄存器之前,必须再次执行有效的密码访问。

Table 3: Modify Access Bit Pattern Requirements

5. 访问受Endinit保护的寄存器 

如果在运行期间需要对受 Endinit 保护的寄存器进行写入访问,则可以在有限的时间内临时重新启用写入访问。 提供了两种选择:

. 通过 WDT 刷新重新启用对受 ENDINIT 保护的寄存器的访问

. 无需 WDT 刷新即可重新启用对 ENDINIT 保护的寄存器的访问

为了获得调试支持, Cerberus 模块可以覆盖所有 WDT 的所有 ENDINIT 控件,以简化调试流程。 如果设置了 CBS_OSTATE.ENIDIS位 ,则所有 ENDINIT 保护都将被禁用,而不管 WDT 配置的当前状态如何。 如果清除了 CBS_OSTATE.ENIDIS ,则完整的ENDINIT控制位于 WDT 内。

5.1 通过WDT访问Endinit保护的寄存器

要重新启用访问(修改受Endinit保护的寄存器),必须先使用有效的密码访问解锁 WDTxCON0。 在随后的有效修改访问中,可以清除 ENDINIT。解锁WDTxCON0且清除ENDINT后, 就能再次打开对受 Endinit 保护的寄存器的访问。 注意,当 WDTxCON0 解锁时, WDT 会自动切换到超时模式。 因此,访问窗口有时间限制。 超时模式仅在重新设置 ENDINIT 后终止,需要另一个有效密码和有效的 WDTxCON0 修改访问权限。

5.2 不通过WDT访问Endinit保护的寄存器

在某些应用中,可能不使用 WDT ,并将被禁用 (WDTxSR.DS =1) ,尽管不建议这样做。

在其他应用程序中,可能会使用 WDT 时间戳功能,刷新之间的 WDT 访问将是不可取的。

在这种情况下,仍然可以使用 ENDINIT 全球控制寄存器 (EICONx) 来临时访问受 Endinit 保护的寄存器。

6. Endinit实际应用

6.1 Endinit需求及场景介绍

需求:在ECU上电后需要在Startup阶段关闭看门狗,也就是配置WDTxCON1(x标识CPU0-5)的DR位域。但是,WDTxCON1寄存器是受Endinit保护的。所以,在修改前我们需要解锁Endinit,修改完WDTxCON1寄存器后再上锁Endinit。

分析1:因为CBS_OSTATE.ENIDIS只有在Debug模式下通过Cerverus module来Disable(置位CBS_OSTATE.ENIDIS),所以上电的时候因为CBS_OSTATE.ENIDIS是被Cleared的。

所以,能够通过WDT模块解锁Endinit功能。参考第5章节两种解锁Endinit的方式

分析2:WDTSSR寄存器的Reset值是0xFFFC 0010,则WDTSSR.PAS为0,WDTSSR.TCU为0。

所以,使用static password来解锁Endinit. 参考2.1和2.2章节的static password和Automatic Psassword 。

分析3:我们通过配置WDTSCON0寄存器来解锁Endinit.

6.2 Endinit解锁

解锁流程,参考Table 1.

Example: 解锁CPU0的Endinit.

#define WDT_WDTSCON0_ADDR    0xF0036024u


#define STARTUP_CLR_WDTLCK_WDTHPW27       (0xFFFFFF01u)

#define STARTUP_SET_WDTHPW27                      (0xF0u)

#define STARTUP_SET_ENDINIT                      (0x01u)

#define STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT       (0xFFFFFFF0u)

#define STARTUP_SET_WDTLCK                       (0x02u)

#define STARTUP_SET_WDTLCK_ENDINIT               (0x03u)


void UnlockEndinit_Core0(void)

{

  volatile uint32 WDTCON0_Register_Value;

  volatile uint32 *WDTCON0_Address;

  WDTCON0_Address = WDT_WDTSCON0_ADDR;


  /*

   * Create password and send to WDTSCON0

   */

  WDTCON0_Register_Value = *WDTCON0_Address;

  /* Clear WDTSCON0.LCK, WDTSCON0.PW[2:7]*/

  WDTCON0_Register_Value &= STARTUP_CLR_WDTLCK_WDTHPW27;

  /* Set WDTSCON0.PW[2:7] to 0xF */

  WDTCON0_Register_Value |= STARTUP_SET_WDTHPW27;

  /* Written 1 to WDTSCON0.ENDINIT for password access */

  WDTCON0_Register_Value |= STARTUP_SET_ENDINIT;

  *WDTCON0_Address = WDTCON0_Register_Value;  

  /*

   * Set the bit ENDINIT to 1 or 0 to allow access to registers of WDT_CON1 e.g.

   */


  /* Clear WDTSCON0.PW[2:7], WDTSCON0.LCK, WDTSCON0.ENDINIT  */

  WDTCON0_Register_Value &= STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT;

  /* WDTSCON0.PW[2:7]=0, WDTSCON0.LCK=1, WDTSCON0.ENDINIT=0 */

  WDTCON0_Register_Value |= STARTUP_SET_WDTLCK;

  *WDTCON0_Address = WDTCON0_Register_Value;

  WDTCON0_Register_Value = *WDTCON0_Address;

}

6.3 Endinit上锁

上锁流程,参考Table 3.

Example: 上锁CPU0的Endinit.

void LockEndinit_Core0(void)

{
  volatile uint32 WDTCON0_Register_Value;

  volatile uint32 *WDTCON0_Address;

  WDTCON0_Address = WDT_WDTSCON0_ADDR;

  /*

   * Create password and send to WDTSCON0

   */

  WDTCON0_Register_Value = *WDTCON0_Address;

  /* ClearWDTSCON0.LCK, WDTSCON0.PW[2:7]*/

  WDTCON0_Register_Value &= STARTUP_CLR_WDTLCK_WDTHPW27;

  /* set WDTSCON0.PW[2:7] to 0xF */

  WDTCON0_Register_Value |= STARTUP_SET_WDTHPW27;

  /* Write 1 to ENDINIT for password access */

  WDTCON0_Register_Value |= STARTUP_SET_ENDINIT;

  *WDTCON0_Address = WDTCON0_Register_Value;     /* modify access to WDTSCON0 */

  /*

   * Set the bit ENDINIT to 1 or 0 to allow access to registers of WDT_CON1 .e.g.

   */

  /* Clear WDTSCON0.PW[2:7], WDTSCON0.LCK, WDTSCON0.ENDINIT  */

  WDTCON0_Register_Value &= STARTUP_CLR_WDTHPW27_WDTLCK_ENDINIT;

  /* WDTSCON0.PW[2:7]={0}, WDTSCON0.LCK=1, WDTSCON0.ENDINIT=1 */

  WDTCON0_Register_Value |= STARTUP_SET_WDTLCK_ENDINIT;

  *WDTCON0_Address = WDTCON0_Register_Value;

  WDTCON0_Register_Value = *WDTCON0_Address;

}

7. 总结

为了提供系统的安全性,TC3xx芯片提供了Endinit机制来保护一些特殊的寄存器。在修改这些特殊寄存器的时候需要先解锁Endinit, 在解锁Endinit时需要考虑使用static静态还是automatic自动密码机制以及是否使用超时机制等。确定了解锁Endinit的类型后,就可以按照特定的步骤来解锁Endinit,然后按照UnlockEndinit à modify protected register à LockEndinit的步骤来修改特殊寄存器即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1251970.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++初阶】STL详解(八)List的模拟实现

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

JOSEF约瑟 JHOK-ZBZ201智能型漏电(剩余)继电器 导轨安装

JHOK-ZBZ漏电继电器(以下简称继电器)适用于交流电压至660V或更高的TN、TT、和IT系统,频率为50Hz。通过零序电流互感器检测出超过整定值的零序(剩余)漏电电流。该继电器与分励脱扣器或失压脱扣器的断路器、交流接触器、…

激活函数与其导数:神经网络中的关键元素

激活函数是神经网络中的重要组成部分,有力地推动了深度学习的发展。然而,仅仅了解和选择激活函数是不够的,我们还需要理解激活函数的导数。本文将详细介绍激活函数的概念、作用及其导数的重要性,并探究导数对神经网络训练的影响。…

2016年12月13日 Go生态洞察:2016年Go用户调查与企业问卷

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

【UGUI】中Content Size Fitter)组件-使 UI 元素适应其内容的大小

官方文档:使 UI 元素适应其内容的大小 - Unity 手册 必备组件:Content Size Fitter 通常,在使用矩形变换定位 UI 元素时,应手动指定其位置和大小(可选择性地包括使用父矩形变换进行拉伸的行为)。 但是&a…

如何减少40%的Docker构建时间

随着Docker的普及,许多公司的产品会将组件构建为Docker镜像。但随着时间的推移,一些镜像变得越来越大,对应的CI构建也变得越来越慢。 如果能在喝完一杯咖啡的时间(不超过5分钟)内完成构建,将是一个理想状态…

使用Kibana让es集群形象起来

部署Elasticsearch集群详细步骤参考本人: https://blog.csdn.net/m0_59933574/article/details/134605073?spm1001.2014.3001.5502https://blog.csdn.net/m0_59933574/article/details/134605073?spm1001.2014.3001.5502 kibana部署 es集群设备 安装软件主机名…

【数据库】物理操作的一趟扫描算法机制原理,理解关系代数据与物理计划的关系,以及代价评估的应用和算法优化

一趟扫描算法 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更新…

【OpenGauss源码学习 —— 执行算子(Merge Join 算子)】

执行算子(Merge Join 算子) 连接算子Merge Join 算子ExecInitMergeJoin 函数MergeJoin 结构体 ExecMergeJoin 函数MergeJoinState 结构体 ExecEndMergeJoin 函数 总结 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重…

【Linux】vim-多模式的文本编辑器

本篇文章内容和干货较多,希望对大家有所帮助👍 目录 一、vim的介绍 1.1 vi 与 vim的概念1.2 Vim 和 Vi 的一些对比 二、vim 模式之间的切换 2.1 进入vim2.2 [正常模式]切换到[插入模式]2.3 [插入模式]切换至[正常模式]2.4 [正常模式]切换至[底行模式…

【仿写实现move函数】

仿写实现move函数 一、值的类型 1.左值 描述:能够取地址的值成为左值 int a 10; const int b 15; int *pa &a; const int *pb &b;2.纯右值 描述:赤裸裸的字面值 eg(false , 3 , 12.23等) int a 13; int *p &a; //取a的地址 int …

AVD黑屏

启动android studio的AVD后,无法开启,一直处于黑屏状态 【解决方案】 1.点击 Android Virtual Device Manager中avd后面的编辑按钮 2.点击Show Advanced Settings按钮 3.找到Boot option中的Cold boot并选中 4.重启AVD

企业文件管理软件推荐:2023年5款国内外软件比较

文件管理是现代企业中一项重要而不可避免的任务,不断增长的数据量和不断变化的管理需求使得选择适合自己企业的文件管理软件尤为重要。那么哪些企业文件管理软件值得我们关注呢?本文将为您介绍几款备受好评的企业文件管理软件,帮助您做出明智…

【DevOps】一张图带你了解 DevOps 生态工具

一张图带你了解 DevOps 生态工具 ✅ 协作(Collaborate):JIRA、Confluence 大家肯定不陌生了,我之前也写过利用 Jekyll 搭建个人博客的帖子。✅ 构建(Build):常用的 SCM(Software Con…

一致性 Hash 算法 Hash 环发生偏移怎么解决

本篇是对文章《一文彻底读懂一致性哈希算法》的重写,图文并茂,篇幅较长,欢迎阅读完提供宝贵的建议,一起提升文章质量。如果感觉不错不要忘记点赞、关注、转发哦。原文链接: 《一文彻底读懂一致性Hash 算法》 通过阅读本…

4、LED闪烁

LED亮灭 使用STC-ISP软件的延时计算器自动生成延迟子函数 #include <REGX52.H> #include <INTRINS.H>//延迟函数 void Delay500ms() //12.000MHz {unsigned char i, j, k;//_nop_()需要导入<INTRINS.H>包_nop_();i 4;j 205;k 187;do{do{while (--k);}…

burp suite 2023.10 Intruder模块详解)

burp suite 2023 Intruder模块详解 Intruder 模块是Burp suite的一个重要功能&#xff0c;用于自动化攻击和对目标应用程序进行大规模的攻击测试。 其主要功能包括&#xff1a; Payloads 设置&#xff1a; 用户可以定义不同类型的 payload&#xff0c;例如字典、数字范围、定…

Python 前后端分离项目Vue部署应用

一、视图创建 from django.http import JsonResponse from django.shortcuts import render# Create your views here. from django.views import Viewclass IndexView(View):def get(self,request):# 前后端分离 &#xff08;前端JS代码渲染数据&#xff09;return JsonRespo…

用Python进行数据分析:探索性数据分析的实践与技巧(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Elasticsearch集群部署 head监控插件 Kibana部署 Nginx反向代理 Logstash部署

一、组件介绍1、Elasticsearch&#xff1a;2 、Logstash3、Kibana4、Kafka&#xff1a;5、Filebeat: 二、 Elasticsearch集群部署服务器创建用户安装ES修改配置文件创建数据和日志目录设置JVM堆大小 #7.0默认为4G修改安装目录及存储目录权限系统优化&#xff08;1&#xff09;增…