ZHCAFX3 October 2025 AM62L , AM62P , AM67 , AM68 , AM69 , TDA4VM
从 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 内核相对应的固件的干净构建。