ZHCAFX3 October   2025 AM62L , AM62P , AM67 , AM68 , AM69 , TDA4VM

 

  1.   1
  2.   摘要
  3.   商标
  4. 1VTM 模块
    1. 1.1 VTM 模块说明
    2. 1.2 VTM 工作原理及用法
  5. 2TI 处理器的硬件温度保护
    1. 2.1 VTM 的过热保护阈值
    2. 2.2 最高硬件温度保护
  6. 3软件温度保护策略
    1. 3.1 可选软件温度保护措施
    2. 3.2 Linux 温度保护逻辑
    3. 3.3 Linux 禁用没有使用的内核
  7. 4总结
  8. 5参考资料

Linux 温度保护逻辑

从 SDK 11.0(或更早版本)开始,Linux SDK 开始整合 Linux VTM 驱动程序。Linux 内核 VTM 及 SOC 的硬件 VTM 是两个不同的概念。内核 VTM 框架使用设备树配置(例如 k3-am62-thermal.dtsi,由内核热绑定文档定义)来监控传感器温度并执行相应的操作,例如降低 CPU 频率、关闭或重新启动 Linux。Linux 使用的传感器温度可以从 AM62x SOC 硬件 VTM 模块获得。

内核设备树 k3-am62a-thermal.dtsi 中的定义和配置仅为一个示例。客户可根据工程要求修改此设置,例如,用于关闭或重新启动 Linux。使用内核器件树 k3-am62a-thermal.dtsi 中的默认设置,内核会在温度达到 105°C 时触发关断序列。对于 Linux VTM 11.0,Linux SDK 驱动程序还为硬件 VTM 定义了类似的中断阈值,支持多达三个可编程温度阈值。其中两个阈值适用于高于阈值的值,一个适用于低于阈值的值,使 VTM 能够提醒内核采取措施。例如,当超过第一个阈值时,可以提醒内核开始降低 CPU 的电压和时钟速度,从而使 SoC 的整体温度稳定。如果 SoC 温度继续升高,我们可以使用第二个阈值来采取更积极的措施。例如,我们可以发出断电命令,以便在超过第二个阈值时完全关断器件。可使用设备树中定义的值在内核中设置阈值温度。这可用于设置内核关闭 SoC 的临界 温度。当 SoC 过热时,它会向内核发送被动 警报,可以通过将 cpufreq 驱动器注册为冷却器件来降低 MPU 频率。可以通过更改代码来修改软件热保护阈值,例如在 105°C 和 125°C 之间调节关断温度,这会将软件保护功能从工业级温度切换到汽车级温度。以下代码表示采用 5°C 迟滞控制的 55°C 的临界温度,在达到 55°C 时进入无源 状态以启动冷却措施,并在 125°C(2°C 迟滞控制)时立即关断。

/* From arch/arm64/boot/dts/ti/k3-am62a-thermal.dtsi */
thermal_zones: thermal-zones {
     main0_thermal: main0-thermal {
          polling-delay-passive = <250>;     /* milliSeconds */
          polling-delay = <500>;          /* milliSeconds */
          thermal-sensors = <&wkup_vtm0 0>;
          trips {
               main0_alert: main0-alert {
                    temperature = <95000>;
                    hysteresis = <2000>;
                    type = "passive";
               };
               main0_crit: main0-crit {
                    temperature = <105000>;     /* milliCelsius */
                    hysteresis = <2000>;     /* milliCelsius */
                    type = "critical";
               };
          };
          cooling-maps {
               map0 {
                    trip = <&main0_alert>;
                    cooling-device =
                         <&cpu0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                         <&cpu1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                         <&cpu2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,
                         <&cpu3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;
               };
          };
     };

当内核进入无源 状态时,内核可以通过消除低优先级进程来降低相应内核的负载。对于关键任务,降低工作频率可以降低功耗。动态频率选择 (DFS) 是动态调整 CPU 频率以优化性能的有效方法。有关更多详细信息,请参阅教程

DFS 方法目前允许便利地调整 A 内核的频率。以下部分提供更改其他内核频率的方法。首先,确定与 TRM(时钟部分)中的内核相关联的时钟源、PLL 和分频器。根据 PLL 修改分频器,以确保最终的输出时钟符合速度等级。

以下是关于如何修改 AM62A 的 C7x 内核时钟的示例。PLL 被识别为 MAIN_PLL7 HSDIV0,可在相应器件的 TRM 中找到。所进行的更改如下:原始 1GHz 主时钟频率分频为 500MHz。可使用此方法对其他内核进行类似的频率调整。更改之后,可以在 Linux 中使用 k3conf 命令来验证相应的时钟频率。客户还可以使用 k3conf set clock $CLOCKID $FREQ 命令来修改时钟。可能需要修改不同器件的器件 ID;例如,AM62A 中的 C7x 对应于 ID 208 和 211。

k3conf dump clock 208
k3conf dump clock 211
output: 
|----------------------------------------------------------------------------------------------|
| Device ID | Clock ID | Clock Name                        | Status          | Clock Frequency |
|----------------------------------------------------------------------------------------------|
|   208     |     0    | DEV_C7X256V0_C7XV_CORE_0_C7XV_CLK | CLK_STATE_READY | 500000000   |
|----------------------------------------------------------------------------------------------|
|   211     |     0    | DEV_C7X256V0_CLK_C7XV_CLK                      | CLK_STATE_READY | 500000000       |
|   211     |     7    | DEV_C7X256V0_CLK_PLL_CTRL_CLK                  | CLK_STATE_READY | 500000000       |
diff --git a/source/drivers/device_manager/rm_pm_hal/rm_pm_hal_src/pm/soc/am62ax/clocks.c
b/source/drivers/device_manager/rm_pm_hal/rm_pm_hal_src/pm/soc/am62ax/clocks.c
index 2122081..7438db5 100644
--- a/source/drivers/device_manager/rm_pm_hal/rm_pm_hal_src/pm/soc/am62ax/clocks.c
+++ b/source/drivers/device_manager/rm_pm_hal/rm_pm_hal_src/pm/soc/am62ax/clocks.c
@@ -2440,7 +2440,7 @@ static const struct clk_data_div_reg clk_data_hsdiv0_16fft_main_7_hsdiv0 = {
 static const struct clk_data_div_reg clk_data_hsdiv0_16fft_main_7_hsdiv0 = {
      .data_div          = {
           .n          = 128,
-          .default_div     = 2,
+          .default_div     = 4,
      },
      .reg               = 0x00680000UL + (0x1000UL * 7UL) + 0x80UL + (0x4UL * 0UL),
      .bit               = 0,

请注意,修改上述代码后,需要对 SDK 中的 lib 文件进行干净构建,并且由于修改后的代码在 DM(器件管理)内核上运行,执行与 DM 内核相对应的固件的干净构建。