本文轉載自:https://blog.csdn.net/kris_fei/article/details/55045936
Platform: RK3288
OS: Android 6.0
Kernel: 3.10.92
RK3288使用TSADC(Temperature-Sensor ADC)來測量CPU溫度,支持兩種模式:
用戶自定義模式: 主動控制讀取溫度.
自動模式: 自動檢測溫度,達到閥值就自動報告.
rk3288.dtsi中的device配置:
tsadc: tsadc@ff280000 {
compatible = "rockchip,tsadc";
reg = <0xff280000 0x100>;
interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
#io-channel-cells = <1>;
io-channel-ranges;
clock-frequency = <10000>;
clocks = <&clk_tsadc>, <&clk_gates7 2>;
clock-names = "tsadc", "pclk_tsadc";
pinctrl-names = "default", "tsadc_int";
pinctrl-0 = <&tsadc_gpio>;
pinctrl-1 = <&tsadc_int>;
tsadc-ht-temp = <120>; //關機閥值
tsadc-ht-reset-cru = <1>;
tsadc-ht-pull-gpio = <0>;
status = "okay";
};
rockchip_tsadc.c:
tsadc溫度控制驅動文件.
rockchip-hwmon.c:
基於hwmon(HW Monitor)的驅動實現,也就是說tsadc使用hwmon提供接口到userspace.
rockchip_temp_probe -> rockchip-hwmon.c
rockchip_hwmon_init -> rockchip_tsadc.c
request_threaded_irq //申請一個中斷線程,對應函數是rockchip_tsadc_auto_ht_interrupt()
create_singlethread_workqueue //創建workqueue thread,對應函數是rockchip_tsadc_auto_ht_work
of_property_read_u32 //讀取dts中的tsadc-ht-temp, tsadc-ht-reset-cru,tsadc-ht-pull-gpio
rockchip_tsadc_set_auto_temp //設置為自動溫度探測模式,參數channel表示只針對此channel設置,rk3288 cpu對應是channel 1.
rockchip_tsadc_auto_mode_set -> //設置中斷和關機的溫度, 分別對應的是80和120度
data->ops.read_sensor = rockchip_rk3288_tsadc_get_temp; //讀取溫度函數接口定義.
INIT_DEFERRABLE_WORK(&data->work, tsadc_monitor); //溫度變化時更新sysfs中的alarm node信息.
sysfs_create_group //在tsadc device下創建sysfs,attr為rockchip_temp_group, 按照SENSOR_DEVICE_ATTR格式來定義,不過最終用的都是sysfs文件創建那一套.
hwmon_device_register //hwmon device注冊, 會在/sys/class/hwmon下看到.
當達到80°的時候,中斷被觸發:
rockchip_tsadc_auto_ht_interrupt ->
queue_work(dev->workqueue, &dev->auto_ht_irq_work) -> //給workqueue執行
rockchip_tsadc_auto_ht_work ->
tsadc_readl //讀取中斷狀態
pm_power_off //過溫就執行關機
實際測試中斷並沒有被觸發(注意TSADC_TEMP_INT_EN的值是0),不過修改關機溫度(tsadc-ht-temp)確實會關機,是TSSHUT觸發直接硬件關機了。rockchip_tsadc_set_cmpn_shut_vale()設置了關機的閥值,參數就是tsadc-ht-temp對應的值。
命令行讀取cpu溫度:
root@rk3288:/ # cat sys/devices/ff280000.tsadc/temp1_input
54
或者
root@rk3288:/sys/class/hwmon/hwmon0/device # cat temp1_input
55
平台上一共有四路sensor讀取內部溫度, 0保留,1讀取cpu,2讀取gpu, 3未知。
有趣的是,文檔說系統有三路sensor,但是寄存器卻給出了4路配置,醉了...