ZHCAFM6 July 2025 AM623 , AM625 , AM62A3 , AM62A7-Q1 , AM62L , AM62P , AM6411 , AM6412 , AM67 , AM68 , AM68A , AM69 , TDA4VE-Q1 , TDA4VEN-Q1 , TDA4VM
从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核对应的固件。