Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83
Board: Firefly-RK3399
背景:
和RK3288一样,RK3399上有两路TSADC通道分别用于监测CPU和GPU的温度。
不同的是RK3399结合kernel thermal core框架来管控,而RK3288直接是写了一个独立驱动控制硬件。
RK3288平台可参考: [RK3288][Android6.0] TS-ADC驱动流程小结
TSADC两种模式:
1.用户自定义模式。 所以信号都通过是user写到寄存器中控制。
2.自动模式。 控制器自动查询TSADC输出,如果温度过高就会产生中断,如果再高就会发信号给CRU模块复位整个芯片或者通过gpio通知PMU做处理。
TSADC控制器特性:
1. 支持用户自定义和自动模式
2. 支持两路通道
3. 系统复位的温度点可被配置
4. 可设置范围:~40-125°, 精度是5°
5. ADC精度10bit,采样率50kb/s
6. 温度探测和周期值可配置
控制器配置:
rk3399.dtsi:
tsadc: tsadc@ff260000 {
compatible = "rockchip,rk3399-tsadc"; //设备名,和驱动匹配
reg = <0x0 0xff260000 0x0 0x100>;
interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH 0>;
rockchip,grf = <&grf>;
clocks = <&cru SCLK_TSADC>, <&cru PCLK_TSADC>;
clock-names = "tsadc", "apb_pclk";
assigned-clocks = <&cru SCLK_TSADC>;
assigned-clock-rates = <750000>;
resets = <&cru SRST_TSADC>;//reset对应的cru
reset-names = "tsadc-apb";
pinctrl-names = "init", "default", "sleep";
pinctrl-0 = <&otp_gpio>;
pinctrl-1 = <&otp_out>;
pinctrl-2 = <&otp_gpio>;
#thermal-sensor-cells = <1>;
rockchip,hw-tshut-temp = <95000>; //设置的关机温度
status = "disabled";
};
另一部分配置是在rk3399-firefly-core.c中:
&tsadc {
/* tshut mode 0:CRU 1:GPIO */
rockchip,hw-tshut-mode = <1>; //关机模式,设置为通过gpio方式
/* tshut polarity 0:LOW 1:HIGH */
rockchip,hw-tshut-polarity = <1>; //对应关机极性
status = "okay";
};
除了tsadc之外,我们也需要了解thermal zone的配置:
thermal_zones: thermal-zones {
soc_thermal: soc-thermal {