Linux内核Thermal Sensor

Linux内核中,可用Thermal Sensor(如:RK3399 TS-ADC(Temperature-Sensor ADC))获取温度。

本文介绍RK3399 TS-ADC控制器驱动和调试方法。

一、TSADC驱动

1、TS-ADC控制器

RK3399 TS-ADC(Temperature-Sensor ADC)控制器模块支持用户自定义模式和自动模式。

1)用户自定义模式

TS-ADC所有的控制信号完全由软件写入寄存器直接控制。

2)自动模式

模块自动轮询TS-ADC输出并检查结果。

如果在一段时间内发现温度过高,会产生一个停机措施的中断;如果温度超过一段时间高,生成TSHUTCRU(Clock & Reset Unit)模块,让他复位整个芯片,或者通过GPIOPMIC

RK3399 TSADC控制器特性如下:

1)、支持用户自定义模式和自动模式。

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

3)、在自动模式下,可配置报警(高温/低温)中断的温度。

4)、在自动模式下,可配置系统复位的温度。

5)、支持2通道TS-ADC,每个通道的温度标准可配置。

6)、在自动模式下,可配置温度检测的时间间隔。

7)、在自动模式下,当检测到高温时,可配置温度检测的时间间隔。

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驱动加载的标志字符串
        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设置的关机温度120度
        pinctrl-names = "init", "default", "sleep"; ## TS-ADC工作的GPIO配置,初始化init和休眠sleep时gpio,默认                                                      ## 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>;      ## 温度超过关机温度的复位方式:0:通过CRU模块复位;1:通过GPIO连接PMIC复位                                           ## 引脚进行复位。
        /* tshut polarity 0:LOW 1:HIGH */
        rockchip,hw-tshut-polarity = <1>;  ## 关机极性:0:低;1:高
        rockchip,hw-tshut-temp = <110000>; ## 关机温度:110度
        status = "okay";        ## 使能TS-ADC驱动
};

3、TS-ADC驱动

RK3399 TS-ADC驱动文件:drivers/thermal/rockchip_thermal.c,主要关注:

static const struct rockchip_tsadc_chip rk3399_tsadc_data = {
    .chn_id[SENSOR_CPU] = 0, /* cpu sensor is channel 0 */   ## TS-ADC通道0监控CPU温度
    .chn_id[SENSOR_GPU] = 1, /* gpu sensor is channel 1 */   ## TS-ADC通道1监控GPU温度
    .chn_num = 2, /* two channels for tsadc */               ## TS-ADC通道个数

    .tshut_mode = TSHUT_MODE_GPIO, /* default TSHUT via GPIO give PMIC */ ## TS-ADC关机模式(GPIO)
    .tshut_polarity = TSHUT_LOW_ACTIVE, /* default TSHUT LOW ACTIVE */    ## TS-ADC关机极性(低有效)
    .tshut_temp = 95000,                                                  ## TS-ADC关机温度(95)
    ## 如果dts中没有配置上面三个属性,则使用上面三个默认值,否则使用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, ## 设置报警温度并使能对应中断
    .set_tshut_temp = rk_tsadcv2_tshut_temp, ## 设置关机温度并使能对应中断
    .set_tshut_mode = rk_tsadcv2_tshut_mode, ## 设置关机模式

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

##注册thermal sensor设备驱动实现函数
static const struct thermal_zone_of_device_ops rockchip_of_thermal_ops = {
    .get_temp = rockchip_thermal_get_temp,   ## 获取温度,调用rk_tsadcv2_get_temp()
    .set_trips = rockchip_thermal_set_trips, ## 设置报警温度,调用rk_tsadcv2_alarm_temp()
};

二、TS-ADC调试

下面基于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命令,动态监控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

注:转载请注明作者。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容

  • PWM(Pulse Width Modulation)是脉冲宽度调制的缩写,在嵌入式系统中非常常见。它提供了一种脉...
    小田BSP阅读 2,702评论 0 4
  • 在嵌入式系统中,串口既可以用于输出日志进行系统调试,又可以用于短距离低速通信,是一种非常实用的通信端口。 本文基于...
    小田BSP阅读 3,306评论 0 1
  • 掀开DRM基本概念的面纱后,我们把“罪恶”的小手伸向DRM内核代码。 注:本文和后续DRM驱动系列基于Linux4...
    小田BSP阅读 5,159评论 0 1
  • 一、Linux 内核源码 到 www.kernel.org 下载官方内内核。 1.linux内核目录 目录说明 a...
    Mr_Michael阅读 6,296评论 0 2
  • 本文基于RockPi 4A单板Linux4.4 内核介绍OPP Table。 内核中将频率、电压的相关配置放在DT...
    小田BSP阅读 2,815评论 0 1