Linux內(nèi)核Thermal Sensor

Linux內(nèi)核中,可用Thermal Sensor(如:RK3399 TS-ADC(Temperature-Sensor ADC))獲取溫度。

本文介紹RK3399 TS-ADC控制器驅(qū)動和調(diào)試方法。

一、TSADC驅(qū)動

1、TS-ADC控制器

RK3399 TS-ADC(Temperature-Sensor ADC)控制器模塊支持用戶自定義模式和自動模式。

1)用戶自定義模式

TS-ADC所有的控制信號完全由軟件寫入寄存器直接控制。

2)自動模式

模塊自動輪詢TS-ADC輸出并檢查結(jié)果。

如果在一段時間內(nèi)發(fā)現(xiàn)溫度過高,會產(chǎn)生一個停機(jī)措施的中斷;如果溫度超過一段時間高,生成TSHUTCRU(Clock & Reset Unit)模塊,讓他復(fù)位整個芯片,或者通過GPIOPMIC。

RK3399 TSADC控制器特性如下:

1)、支持用戶自定義模式和自動模式。

2)、在用戶自定義模式下,start_of_conversion可以完全由軟件控制,也可以由硬件生成。

3)、在自動模式下,可配置報警(高溫/低溫)中斷的溫度。

4)、在自動模式下,可配置系統(tǒng)復(fù)位的溫度。

5)、支持2通道TS-ADC,每個通道的溫度標(biāo)準(zhǔn)可配置。

6)、在自動模式下,可配置溫度檢測的時間間隔。

7)、在自動模式下,當(dāng)檢測到高溫時,可配置溫度檢測的時間間隔。

8)、可配置高溫防抖。

9)、溫度范圍:-40 ~ 125°C,溫度精度:5°C。

10)、10bit SARADC,采樣率50KS/s。

注:1KS/s = 1KHz,即每秒采樣1000個點。

RK3399 TS-ADC控制器框圖如下:

image.png

2、TS-ADC配置

RK3399 TS-ADC配置文件:

1)arch/arm64/boot/dts/rockchip/rk3399.dtsi

TS-ADC屬性配置如下:

tsadc: tsadc@ff260000 {
        compatible = "rockchip,rk3399-tsadc"; ## TS-ADC驅(qū)動加載的標(biāo)志字符串
        reg = <0x0 0xff260000 0x0 0x100>;     ## TS-ADC寄存器基地址和寄存器地址長度
        interrupts = <GIC_SPI 97 IRQ_TYPE_LEVEL_HIGH 0>; ## TS-ADC中斷
        assigned-clocks = <&cru SCLK_TSADC>;  
        assigned-clock-rates = <750000>;     ## TS-ADC工作時鐘為750000
        clocks = <&cru SCLK_TSADC>, <&cru PCLK_TSADC>; 
        clock-names = "tsadc", "apb_pclk";  ## TS-ADC模塊的兩個時鐘:工作時鐘和配置時鐘
        resets = <&cru SRST_TSADC>;
        reset-names = "tsadc-apb";
        rockchip,grf = <&grf>;              ## TS-ADC引用grf模塊
        rockchip,hw-tshut-temp = <120000>;  ## TS-ADC設(shè)置的關(guān)機(jī)溫度120度
        pinctrl-names = "init", "default", "sleep"; ## TS-ADC工作的GPIO配置,初始化init和休眠sleep時gpio,默認(rèn)                                                      ## default是輸出功能。
        pinctrl-0 = <&otp_gpio>;
        pinctrl-1 = <&otp_out>;
        pinctrl-2 = <&otp_gpio>;
        #thermal-sensor-cells = <1>;
        status = "disabled";
};

TS-ADC引腳配置如下:

tsadc {
        otp_gpio: otp-gpio {
                rockchip,pins = <1 6 RK_FUNC_GPIO &pcfg_pull_none>;
        };

        otp_out: otp-out {
                rockchip,pins = <1 6 RK_FUNC_1 &pcfg_pull_none>;
        };
};

2)arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4.dtsi

使能TS-ADC配置如下:

&tsadc {
        /* tshut mode 0:CRU 1:GPIO */
        rockchip,hw-tshut-mode = <1>;      ## 溫度超過關(guān)機(jī)溫度的復(fù)位方式:0:通過CRU模塊復(fù)位;1:通過GPIO連接PMIC復(fù)位                                           ## 引腳進(jìn)行復(fù)位。
        /* tshut polarity 0:LOW 1:HIGH */
        rockchip,hw-tshut-polarity = <1>;  ## 關(guān)機(jī)極性:0:低;1:高
        rockchip,hw-tshut-temp = <110000>; ## 關(guān)機(jī)溫度:110度
        status = "okay";        ## 使能TS-ADC驅(qū)動
};

3、TS-ADC驅(qū)動

RK3399 TS-ADC驅(qū)動文件:drivers/thermal/rockchip_thermal.c,主要關(guān)注:

static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
    .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */   ## TS-ADC通道0監(jiān)控CPU溫度
    .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */   ## TS-ADC通道1監(jiān)控GPU溫度
    .chn_num = 2, /* two channels for tsadc */               ## TS-ADC通道個數(shù)

    .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ ## TS-ADC關(guān)機(jī)模式(GPIO)
    .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */    ## TS-ADC關(guān)機(jī)極性(低有效)
    .tshut_temp = 95000,                                                  ## TS-ADC關(guān)機(jī)溫度(95)
    ## 如果dts中沒有配置上面三個屬性,則使用上面三個默認(rèn)值,否則使用dts中的值。

    .initialize = rk_tsadcv3_initialize,     ## 初始化TS-ADC控制器
    .irq_ack = rk_tsadcv3_irq_ack,
    .control = rk_tsadcv3_control,           ## 使能和禁止TS-ADC控制器
    .get_temp = rk_tsadcv2_get_temp,         ## 獲取溫度 
    .set_alarm_temp = rk_tsadcv2_alarm_temp, ## 設(shè)置報警溫度并使能對應(yīng)中斷
    .set_tshut_temp = rk_tsadcv2_tshut_temp, ## 設(shè)置關(guān)機(jī)溫度并使能對應(yīng)中斷
    .set_tshut_mode = rk_tsadcv2_tshut_mode, ## 設(shè)置關(guān)機(jī)模式

    .table = {
        .id = rk3399_code_table,
        .length = ARRAY_SIZE(rk3399_code_table),
        .data_mask = TSADCV3_DATA_MASK,
        .mode = ADC_INCREMENT,
    },
};

##注冊thermal sensor設(shè)備驅(qū)動實現(xiàn)函數(shù)
static const struct thermal_zone_of_device_ops rockchip_of_thermal_ops = {
    .get_temp = rockchip_thermal_get_temp,   ## 獲取溫度,調(diào)用rk_tsadcv2_get_temp()
    .set_trips = rockchip_thermal_set_trips, ## 設(shè)置報警溫度,調(diào)用rk_tsadcv2_alarm_temp()
};

二、TS-ADC調(diào)試

下面基于RockPI 4A單板查看RK3399 CPU和GPU的溫度,方法如下:

## CPU溫度
root@xiaotianbsp:/# cat /sys/class/thermal/thermal_zone0/temp
36875
## GPU溫度
root@xiaotianbsp:/# cat /sys/class/thermal/thermal_zone1/temp
38750

可以使用watch命令,動態(tài)監(jiān)控CPUGPU溫度,方法如下:

## 每隔1秒顯示一次CPU溫度
root@xiaotianbsp:/# watch -n 1 cat /sys/class/thermal/thermal_zone0/temp
Every 1.0s: cat /sys/class/thermal/the...  linaro-alip: Mon Aug 16 14:46:38 2021

36875

## 每隔1秒顯示一次GPU溫度
root@xiaotianbsp:/# watch -n 1 cat /sys/class/thermal/thermal_zone1/temp
Every 1.0s: cat /sys/class/thermal/the...  linaro-alip: Mon Aug 16 14:48:41 2021

38750

注:轉(zhuǎn)載請注明作者。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • PWM(Pulse Width Modulation)是脈沖寬度調(diào)制的縮寫,在嵌入式系統(tǒng)中非常常見。它提供了一種脈...
    小田BSP閱讀 3,111評論 0 4
  • 在嵌入式系統(tǒng)中,串口既可以用于輸出日志進(jìn)行系統(tǒng)調(diào)試,又可以用于短距離低速通信,是一種非常實用的通信端口。 本文基于...
    小田BSP閱讀 3,769評論 0 1
  • 掀開DRM基本概念的面紗后,我們把“罪惡”的小手伸向DRM內(nèi)核代碼。 注:本文和后續(xù)DRM驅(qū)動系列基于Linux4...
    小田BSP閱讀 6,033評論 0 1
  • 一、Linux 內(nèi)核源碼 到 www.kernel.org 下載官方內(nèi)內(nèi)核。 1.linux內(nèi)核目錄 目錄說明 a...
    Mr_Michael閱讀 7,021評論 0 2
  • 本文基于RockPi 4A單板Linux4.4 內(nèi)核介紹OPP Table。 內(nèi)核中將頻率、電壓的相關(guān)配置放在DT...
    小田BSP閱讀 3,409評論 0 1

友情鏈接更多精彩內(nèi)容