AM5708 thermal探究
1、在网上查资料,看模块工作原理,以及现有的别人整理的一些文档
2、查看芯片手册、硬件原理图,了解特定SOC(am5708)此模块的特性:模块的基本架构、供电、时钟、复位、信号、管脚、中断、寄存器等信息
3、结合u-boot/kernel具体代码查看/配置/编写调试相应驱动
4、与硬件工程师一起调试驱动
找到高通、瑞芯微平台相关的资料;与TI am5708差异较大,没有参考价值
芯片手册18.4.6.2Thermal Management Related Registers(P4140)
片内有五个温度传感器,每个温度传感器与一个电源域关联,并且是VBGAPTS的一部分。VBGAPTS有一个10为的ADC,ADC将温度值成比例的转换为数字输出值。每个VBGAPTS由专用的Thermal FSM控制。FSM是CTRL_MODULE_CORE的子模块。所有的FSM的时钟来源于L3INSTR_TS_GCLK。电源、复位、时钟由PRCM管理。
Thermal相关的寄存器可以分为以下几个部分:
-控制寄存器
-thermal alert comparators(thermal警告比较器)寄存器
-温度时间戳寄存器
-其他寄存器
-控制FIFOs
-控制提供给FSMs的时钟
手册中对以上提到的寄存器及shutdown机制作了说明,可详看手册。
(1)Alert有高阈值、低阈值设置,可屏蔽高低Alert输出;用一条中断线提示高低警告的发生,机制详见下图
(2)Shutdown机制为芯片内部机制,不向用户提供接口。高TSHUT阈值为123摄氏度,低TSHUT阈值为105摄氏度。高于123摄氏度芯片会shutdown,温度低于105摄氏度时才会启动。
(3)Timestamp寄存器中可以记录前五次的温度值及相应的测量次数。
(4)Table 18-13为寄存器值与温度值的对应表。
我们板卡的设备树文件为arch/arm/boot/dts/am570x-mid.dts
arch/arm/boot/dts/am570x-mid.dts中
#include "dra72x.dtsi"
#include "am57xx-idk-common.dtsi"
arch/arm/boot/dts/dra72x.dtsi中
#include "dra7.dtsi"
arch/arm/boot/dts/dra7.dtsi中
bandgap: bandgap@4a0021e0 {
reg = <0x4a0021e0 0xc
0x4a00232c 0xc
0x4a002380 0x2c
0x4a0023C0 0x3c
0x4a002564 0x8
0x4a002574 0x50>;
compatible = "ti,dra752-bandgap";
interrupts =
#thermal-sensor-cells = <1>;
};
thermal_zones: thermal-zones {
#include "omap4-cpu-thermal.dtsi"
#include "omap5-gpu-thermal.dtsi"
#include "omap5-core-thermal.dtsi"
#include "dra7-dspeve-thermal.dtsi"
#include "dra7-iva-thermal.dtsi"
};
&cpu_thermal {
polling-delay = <500>; /* milliseconds */
};
"omap4-cpu-thermal.dtsi"、"omap5-gpu-thermal.dtsi"、"omap5-core-thermal.dtsi"、"dra7-dspeve-thermal.dtsi"、"dra7-iva-thermal.dtsi"分别对应CPU、GPU、CORE、DSP、IVA的温度配置。
(1)主要的驱动代码在
(2)从Drivers/thermal/ti-soc-thermal/ti-bandgap.c的
module_platform_driver(ti_bandgap_sensor_driver);开始看起。
A)驱动注册时根据设备树中获得的"ti,dra752-bandgap",会匹配到
static const struct of_device_id of_ti_bandgap_match[]
{
……
{
.compatible = "ti,dra752-bandgap",
.data = (void *)&dra752_data,
},
……
}
B)Drivers/thermal/ti-soc-thermal/dra752-thermal-data.c中的dra752_data根据芯片手册,定义了此thermal支持的特性、时钟源、ADC值到温度值的转换数组、ti_thermal_expose_sensor、ti_thermal_remove_sensor、五个温度传感器(相应的寄存器及其内部偏移、Alert、shutdown阈值配置等)等信息。
C)匹配成功后会调用ti_bandgap_probe函数
int ti_bandgap_probe(struct platform_device *pdev)
{
ti_bandgap_tshut_init(申请中断,注册中断处理函数)
}
D)int ti_thermal_expose_sensor(struct ti_bandgap *bgp, int id, char *domain)
{
->ti_bandgap_get_sensor_data(bgp, id);//获得私有数据
-> data->ti_thermal= devm_thermal_zone_of_sensor_register(bgp->dev,id,data, ti_of_thermal_ops);
//解析设备树中thermal,注册、设置各温度传感器的设备信息和ops
-> ti_bandgap_set_sensor_data(bgp, id, data);//设置私有数据
->ti_bandgap_write_update_interval(bgp, data->sensor_id,
data->ti_thermal->polling_delay);//设置采样时间间隔
}
(3)特别说明
文档中加粗的为比较重要的函数;若需要更改默认的Alert阈值,在dra752_data.sensors.ts_data中;若需要在发生Alert、shutdown时添加相应操作,在各自相应的中断处理函数中添加(注意中断内部添加代码的注意事项)
和thermal相关的设备文件如下图
由代码可知,cooling_device0是属于MPU的,但内核代码只是注册了这个设备,没有相应的冷却机制
thermal_zone0对应MPU的温度
thermal_zone1对应GPU的温度
thermal_zone2对应CORE的温度
thermal_zone3对应DSP的温度
thermal_zone4对应IVA的温度
通过thermal_zone*/temp可以查看当前温度
通过thermal_zone*/type可以查看此zone对应的设备