作者:王力(Neo Wang)
1. 背景介绍:
在TI上一代Jacinto 6汽车处理器中,例如DRA7x/TDA2x,为了实现性能与功能安全的综合考虑,提供了名为DVFS(Dynamic Voltage Frequency Scaling)的机制,使能系统能够实时获取芯片thermal状态,并动态反馈调节系统电压与运行频率,使得系统运行在安全温度范围内,实现性能最大化。
在TI最新一代Jacinto7 处理器中,例如DRA8x/TDA4x,目前外部PMIC输出电压NVM固定,故推荐使用DFS来实现在固定电压下的频率调节,从而实现对整芯片热状态的检测以及控制。
2. 测试条件:
TDA4VM EVM开发板:https://www.ti.com/tool/J721EXSOMXEVM
TDA4VM Linux SDK:https://www.ti.com/tool/download/PROCESSOR-SDK-LINUX-J721E/08.00.00.08
TDA4VM RTOS SDK:https://www.ti.com/tool/download/PROCESSOR-SDK-RTOS-J721E/08.00.00.12
3. TDA4动态热检测与控制流程:
在TDA4 SOC系统中,可参照图1所示流程进行SOC热状态检测以及控制,用户可在应用层对VTM(Voltage and Thermal Manager)的thermal值进行实时读取,并设置高温超出阈值/常温回落阈值,通过VTM的实时检测以及对比,在超出阈值时产生温度事件。或者在内核中通过增加VTM驱动,并直接在上层应用中读取thermal温度值并设置阈值,然后通过上层应用逻辑来实现对thermal的监控,在超出阈值时产生温度报警事件。
图 1 TDA4动态热检测与控制流程图
在得到温度报警事件后,通过对TDA4内部各核心运行状态以及运行频率的读取,能够在系统正常运行范围内,动态调整各核心的运行频率,从而降低系统功耗,实现对系统热状态的控制。
4. VTM动态热检测
首先需要动态读取SOC thermal温度值,VTM可以用来读取温度值以及设置温度报警阈值等,其详细介绍参照TDA4 TRM手册。其核心寄存器配置如表1所示:
表 1 VTM寄存器设置
Register in VTM module | Offset | Comments |
WKUP_VTM_TMPSENS_STAT_j | [9-0] DATA_OUT | 实时温度值(ADC code数值) |
WKUP_VTM_MISC_CTRL2 | [9-0] MAXT_OUTRG_ALERT_THR | 高温报警阈值,超出产生thermal alert |
WKUP_VTM_MISC_CTRL2 | [25-16] MAXT_OUTRG_ALERT_THR | 常温回落阈值,产生alert clean |
WKUP_VTM_TMPSENS_CTRL_j | [11] MAXT_OUTRG_EN | Enable/Disable alert 事件 |
CTRLMMR_WKUP_RESET_SRC_STAT | [24] THERMAL_RST | 产生/清除 alert事件的标志位 |
读出来的DATA_OUT值为内部ADC数值,需要进行转换才能成为摄制温度值,其转换方式如图2所示:
图 2 VTM ADC code与温度值计算关系表
此处提供patch,能够实现在Linux端对内部核心的thermal温度值读取。步骤如下:
a. 下载Linux SDK8.0并参照guide制作SD启动卡,并下载对应thermal patch。
b. 参照下述流程安装到原生SDK中。
cd $PSDK_PATH/board-support/linux-*
git am 0001-display-temperature-as-mili-celsius.patch
cd ../..
make linux
c. 参照下述流程将编译后的文件更新至SD卡系统中。
Edit the file $PSDK_PATH/Rules.make
Set DESTDIR=/media/$USER/rootfs
cd $PSDK_PATH
sudo make linux_install
d. 参照下述流程进行验证
cat /sys/class/thermal/thermal_zone*/temp
其中patch一共添加了五个域中kernel的温度值,其打印如图3所示:
图 3 thermal温度值读取
其中对应了五个Linux中的设备节点,所输出的值单位为毫摄氏度,例如图3中所示结果以及硬件对应关系为:
thermal_zone0 -> WKUP domain DMSC core -> 67.640℃
thermal_zone1 -> MAIN domain MPU A72 core -> 68.074℃
thermal_zone2 -> MAIN domain C7x core -> 68.507℃
thermal_zone3 -> MAIN domain GPU core -> 69.371℃
thermal_zone4 -> MAIN domain R5F core -> 68.074℃
5. TDA4核心动态调频控制
获取到TDA4内部各个核心实时的thermal值后,可以通过上层逻辑对读取到的温度值与预设的报警阈值进行逻辑比较,然后采取对应的措施进行核心频率调整。
在TDA4默认文件系统中,提供k3conf通过指定的device ID以及clock ID来实现对各个核心频率的读取以及控制。
5.1 Device ID的获取:
可通过TISCI手册J721E部分对各个模块的device ID进行查询:
https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/08_00_00_12/exports/docs/pdk_jacinto_08_00_00_37/packages/ti/drv/sciclient/soc/sysfw/binaries/system-firmware-public-documentation/5_soc_doc/j721e/devices.html#soc-doc-j721e-public-devices-desc-device-list
图4中列出了常用几个核心的device ID。
图 4 processor device ID
5.2 Clock ID的获取:
为了标识在一个核心中多个不同模块的频率设置,引入了clock ID对其进行区分,可在TISCI J721E部分对clock ID进行查询。
https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/08_00_00_12/exports/docs/pdk_jacinto_08_00_00_37/packages/ti/drv/sciclient/soc/sysfw/binaries/system-firmware-public-documentation/5_soc_doc/j721e/clocks.html?highlight=a72ss0_core0
5.3 对应核心运行频率检测:
获取到对应核心device ID后,可通过下述指令打印出当前对应核心的运行频率。
k3conf dump clock DEVICE_ID
以A72_CORE0为例,可以得到其当前运行频率为2GHz如图5所示。
图 5 A72 CORE0 运行频率
5.4 设置对应核心运行频率:
若按照第三章中的流程计算,当前运行频率需要进行调整,可使用下述指令对当前指定device ID以及clock ID 的模块进行频率控制。在对其核心频率进行修改之前,需要首先对其对应的锁相环进行修改,以A72_CORE0核心为例:
devmem2 0x00688040 w 0x80000001
k3conf set clock 202 2 1000000000
其修改过程如图6所示:
图 6 A72 CORE0频率修改流程
其中每个TDA4内部核心所支持的最大频率受硬件限制,以TDA4VM为例,如图7所示为不同PN中各核心所支持的最大频率,详情参照TDA4VM Datasheet。
图 7 TDA4VM中各核心所支持最大频率
同样的,在最大频率之下,各核心的频率设置并非随机设置,其必须满足内部分频器等硬件时钟要求,此相关设置参照TI Clock Tree Tools。