ZHCAFM6 July   2025 AM623 , AM625 , AM62A3 , AM62A7-Q1 , AM62L , AM62P , AM6411 , AM6412 , AM67 , AM68 , AM68A , AM69 , TDA4VE-Q1 , TDA4VEN-Q1 , TDA4VM

 

  1.   1
  2.   摘要
  3. 1VTM模块
    1. 1.1 VTM 模块简介
    2. 1.2 VTM 工作原理及使用
  4. 2TI处理器芯片的硬件温度保护
    1. 2.1 VTM的过温保护阈值
    2. 2.2 最高硬件温度保护
  5. 3软件温度保护策略
    1. 3.1 可选的软件温度保护措施
    2. 3.2 Linux 温度保护逻辑
  6. 4总结
  7. 5参考文献

Linux 温度保护逻辑

从SDK11.0(或更早)开始,Linux SDK开始加入Linux VTM 驱动,Linux内核 VTM 和 芯片的硬件 VTM 是两个互不相关的概念。内核 VTM 框架使用设备树中的配置(k3-am62-thermal.dtsi,由内核热绑定文档定义)来监控传感器温度,并采取相应的措施,例如降低 CPU 频率、关闭或重启 Linux。Linux所使用的传感器温度由 AM62x 硬件 VTM 模块获取。

内核设备树 k3-am62a-thermal.dtsi 中的定义/配置只是一个示例,客户可以根据项目需求进行修改,例如,关闭或重启 Linux。使用内核设备树 k3-am62a-thermal.dtsi 中的默认设置,当温度达到 105C 时,内核将触发关机序列。Linux SDK11.0为例,Linux的VTM驱动程序也定义了类似硬件VTM的中断阈值,可以编程设置最多 3 个阈值温度,其中 2 个用于大于阈值,1 个用于小于阈值,以便 VTM 能够提醒内核采取行动。例如,当超过第一个阈值时,可以提醒内核开始降低 CPU 的电压和时钟速度,从而使 SoC 的整体温度稳定下来。如果 SoC 温度持续升高,我们可以使用第二个阈值采取更积极的措施。例如,我们可以在超过第二个阈值后发出 poweroff 命令,完全关闭设备。阈值温度可以在内核中使用我们在设备树中定义的值进行设置。这可以用于:设置"临界"温度,内核将在此温度下关闭 。SoC在过热时向内核发出"被动"警报,并且可以通过将 cpufreq 驱动程序注册为冷却设备来降低 MPU 频率。 通过修改下列代码可以更改软件热保护的阈值,如将关机温度由105℃更改到125℃,对应将软件保护从工规的关机温度切换到车规温度。以下代码表示临界温度为55℃,5℃的滞后控制,在达到55℃时,进入"被动"状态启动散热措施,在达到125℃(2℃的滞后控制)时立即保护并关机。

/* 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(Dynamic Frequency Selection)就是很好的根据需要降低CPU频率的方式。DFS详情可以参阅该教程

DFS的方式目前可以方便的改变A核的频率,下文提供更改其他核的频率的方式。首先从芯片的 TRM(时钟部分)中识别与该核关联的时钟源/PLL 和分频器。 根据 PLL 修改分频器,使最终输出时钟符合速度等级。

以下是如何更改 AM62A 的 C7x 内核时钟的示例,PLL 被标识为 MAIN_PLL7 HSDIV0,该内容可以在对应器件的TRM中得到,因此所做的更改如下。该修改将之前的1GHz的主频时钟,通过分频成为500MHz,其他核的频率更改同样可以使用该方式进行更改。在更改完成后,可以在Linux中使用K3conf命令对对应的时钟频率进行验证。同样客户可以使用K3conf set clock $CLOCKID $FREQ 命令对时钟进行更改。不同设备的对应的Device 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文件进行clean build,并且由于更改的代码是运行在DM(Device Management)核上的,所以也需要重新clean build DM核对应的固件。