i.MX8MP平台开发分享(TMU驱动及用户接口篇)

概念

  • thermal zone
    温度控制区域。
  • sensor
    获取温度。
  • trip points
    温度跳变点,或者是温度阈值。
  • cooling device
    Thermal Cooling Device 是可以降温设备的抽象,能降温的设备比如风扇,这些好理解,但是像CPU、GPU 这些 Cooling devices 怎么理解呢?
    其实降温可以从两方面来理解,一个是加快散热,另外一个就是降低产热量。风扇,散热片这些是用来加快散热,CPU、GPU 这些 Cooling devices 是通过降低产热来降温。
  • governor
    温度控制的策略。
    • step wise
      节流逻辑:使用趋势来节流。*如果热区域正在“升温”,这将通过一个步骤来限制所有与该区域及其特定跳变点相关的冷却设备。如果该区域正在“冷却”,它会将设备的性能提高一步。
    • user space
      给用户侧发送一个事件,由用户侧来处理
    • gov_bang_bang
      控制风扇的一种简单策略,当超过温度T0时开启风扇,当温度低于T1时关闭风扇,T0 > T1。
    • power_allocator
      使用PID控制算法来精细控制温度变化。

设备树定义

TMU的设备树定义了温度校准数据的存储位置。

			tmu: tmu@30260000 {compatible = "fsl,imx8mp-tmu";reg = <0x30260000 0x10000>;clocks = <&clk IMX8MP_CLK_TSENSOR_ROOT>;nvmem-cells = <&tmu_calib>;nvmem-cell-names = "calib";#thermal-sensor-cells = <1>;};

温控的thermal-zones有两个thermal, 分别对应两个TMU。可以看到设备树定义了温度范围,但是这个范围目前的驱动代码会被驱动覆盖。

thermal-zones {cpu-thermal {polling-delay-passive = <250>;polling-delay = <2000>;thermal-sensors = <&tmu 0>;trips {cpu_alert0: trip0 {temperature = <85000>;hysteresis = <2000>;type = "passive";};cpu_crit0: trip1 {temperature = <95000>;hysteresis = <2000>;type = "critical";};};cooling-maps {map0 {trip = <&cpu_alert0>;cooling-device =<&A53_0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,<&A53_1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,<&A53_2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,<&A53_3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,<&mix_gpu_ml 0 1>;};};};soc-thermal {polling-delay-passive = <250>;polling-delay = <2000>;thermal-sensors = <&tmu 1>;trips {soc_alert0: trip0 {temperature = <85000>;hysteresis = <2000>;type = "passive";};soc_crit0: trip1 {temperature = <95000>;hysteresis = <2000>;type = "critical";};};cooling-maps {map0 {trip = <&soc_alert0>;cooling-device =<&A53_0 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,<&A53_1 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,<&A53_2 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>,<&A53_3 THERMAL_NO_LIMIT THERMAL_NO_LIMIT>;};};};};

驱动

对于驱动初始化函数imx8mm_tmu_probe,首先将设备树中两个thermal信息依次注册进thermal 框架中,迭代每个传感器的所有trip点(阈值温度),使用thermal_zone_get_num_trips获取trip点的数量。然后调用thermal_zone_get_trip函数获取每个trip点的详细信息。然后根据trip点的类型(THERMAL_TRIP_CRITICALTHERMAL_TRIP_PASSIVE),分别设置传感器的temp_criticaltemp_passive字段。

for (i = 0; i < data->num_sensors; i++) {tmu->sensors[i].priv = tmu;tmu->sensors[i].tzd =devm_thermal_of_zone_register(&pdev->dev, i,&tmu->sensors[i],&tmu_tz_ops);tmu->sensors[i].hw_id = i;devm_thermal_add_hwmon_sysfs(&pdev->dev, tmu->sensors[i].tzd);for (j = 0; j < thermal_zone_get_num_trips(tmu->sensors[i].tzd); j++) {ret = thermal_zone_get_trip(tmu->sensors[i].tzd, j, &trip);if (ret)continue;if (trip.type == THERMAL_TRIP_CRITICAL) {tmu->sensors[i].temp_critical = trip.temperature;} else if(trip.type == THERMAL_TRIP_PASSIVE) {tmu->sensors[i].temp_passive = trip.temperature;}}}

然后imx8mm_tmu_probe_set_calib_v2读取nvmem中的校准数据,写入对应的温度校准寄存器。

最后通过写入寄存器来打开TMU监测。

设备树中的温度阈值会被imx8mp_tmu_get_temp读取的TMU中的温度阈值覆盖。

static int imx8mp_tmu_get_temp(void *data, int *temp)
{struct tmu_sensor *sensor = data;struct imx8mm_tmu *tmu = sensor->priv;unsigned long val;bool ready;if (sensor->hw_id > (MAX_SENSOR_NUMBER - 1))return -EINVAL;val = readl_relaxed(tmu->base + TRITSR);ready = test_bit(probe_status_offset(sensor->hw_id), &val);if (!ready)return -EAGAIN;val = sensor->hw_id ? FIELD_GET(TRITSR_TEMP1_VAL_MASK, val) :FIELD_GET(TRITSR_TEMP0_VAL_MASK, val);if (val & SIGN_BIT) /* negative */val = (~(val & TEMP_VAL_MASK) + 1);*temp = val * 1000;if (*temp < VER2_TEMP_LOW_LIMIT || *temp > VER2_TEMP_HIGH_LIMIT)return -EAGAIN;return 0;
}

用户层接口

/sys/class/thermal/thermal_zoneX

/sys/class/thermal/thermal_zone0 # ls -l
-r--r--r-- available_policies //可选的温控governor,如 power_allocator user_space step_wise
--w------- emul_temp //模拟设置thermal的温度,单位毫摄氏度,设置后 update_temperature()中可获取到这个温度,和实际达到这个温度同效果。只有其为0,读取的才是真正的温度值,否则就是echo的模拟值
-rw-r--r-- integral_cutoff
-rw-r--r-- k_d
-rw-r--r-- k_i
-rw-r--r-- k_po
-rw-r--r-- k_pu
-rw-r--r-- mode //此thermalzone是否使能了,若是为disabled,对其sys文件的操作不生效,可以echo enabled使能
-rw-r--r-- offset
-rw-r--r-- passive
-rw-r--r-- policy //当前使用的governor是哪个
-rw-r--r-- slope
-rw-r--r-- sustainable_power
-r--r--r-- temp //该温区的当前温度,测试时往 emul_temp 中写的值也会体现在这里。
-rw-r--r-- trip_point_0_hyst //滞后温度,来自设备树 hysteresis 字段,此例中为 2000。有 trips 节点才会有此文件。
-rw-r--r-- trip_point_0_temp //触发温度,来自设备树 temperature字段,此例中为 116500,可以通过sysfs更改。
-r--r--r-- trip_point_0_type //触发点0的类型,来自设备树 type 字段,此例中为"critical"
-r--r--r-- type //该温区的名称,对应于设备树 thermal_zones 下子节点的名字,此例中为"soc_max"
-rw-r--r-- uevent

不同 thermal_zoneX 下的文件不完全相同,取决于在设备树中是否指定了trips成员,以及指定了几个。

/sys/class/thermal/cooling_deviceX

/sys/class/thermal/cooling_device0 # ls -l
-rw-r--r-- cur_state //该 cooling_device 的当前 cooling state
-r--r--r-- max_state //该 cooling_device 的最大 cooling state
drwxr-xr-x  stats
-r--r--r-- type //该cooling device的名称
-rw-r--r-- uevent/sys/class/thermal/cooling_device0 # ls -l stats/
--w------- reset //对统计状态进行复位
-r--r--r-- time_in_state_ms //在每个state下停留的时间
-r--r--r-- total_trans //不同state之间转换的次数
-r--r--r-- trans_table //各个state状态转换表,最大只能显示1个页的内容

type 为 thermal-cpufreq-X 的 cool device 控制 CPU ClusterX 的频点,比如向 cur_state 中写入 max_state 的值,对应Cluster的 scaling_max_freq 文件将显示被限制到了最小频点。
type 为 thermal-cpufreq-X 的是通过 cpufreq_cooling.c 注册的 cool device,type 为 thermal-devfreq-X 的是通过 devfreq_cooling.c 注册的 cool device。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/22624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探究Spring中的Controller:单例、多例及其并发安全性

1. Spring框架的简介 Spring是一个开源的Java平台&#xff0c;用来简化企业级应用程序的开发。Spring框架提供了一整套统一的编程模型&#xff0c;使得开发人员能够更加专注于业务逻辑&#xff0c;而不必去处理复杂的技术细节。Spring包含多个模块&#xff0c;其中最常使用的就…

cesium Material的理解与使用

1.简介 材质Material可以是比较简单的&#xff0c;比如直接将一张图片赋予表面&#xff0c;或者使用条纹状、棋盘状的图案&#xff1b;也可以使用Fabric和GLSL&#xff0c;重新创建一个新的材质或者组合现有的材质。例如&#xff0c;我们可以通过程序生成的纹理(procedural bri…

el-input实现后缀图标和clearable的兼容,调整el-input clearable与自定义图标展示位置问题

背景&#xff1a;常见的输入框存在两个图标的展示效果都是清空在前搜索或其他图标在后 常见以及最终实现效果&#xff08;清空图标在前&#xff0c;搜索图标在后&#xff09; BUG以及el-input默认效果 问题排查 通过控制台审查元素能够发现&#xff0c;默认的效果是自定义图标…

pyautogui模拟鼠标拖动选中文字的基本知识(附Demo)

目录 前言1. Demo1.1 特定窗口点击拖动1.2 屏幕中间点击拖动 2. 基本知识 前言 相关知识推荐阅读&#xff1a; 详细分析Python中的Pyautogui库&#xff08;附Demo&#xff09;详细分析PyAutoGUI中的locate函数&#xff08;附Demo&#xff09; 1. Demo 先给出一部分代码展示…

银河麒麟操作系统安装conda

参考&#xff1a; https://blog.csdn.net/Andy_shenzl/article/details/136294743 查看系统版本 uname -m 下载对应版本 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD 安装 bash Anaconda3-2023.09-0-Linux-aarch64.sh 刷新环境 source ~/.bashrc 查看…

基于C#的计算机与安捷伦34970A通信方法

概述 安捷伦34970A采集数据&#xff0c;34970A支持RS232接口&#xff0c;但是如果直接用winform自带的seriaport类基本是没必要使用的&#xff0c;安捷伦等仪表通讯需要用到VISA的库。 库的获取 1. 是德科技的IO Library. 2. NI下载NI-VISA. 两者用法接近. 代码如下 using…

WLAN基础-WLAN安全

目录 一、引言二、WLAN安全威胁三、WLAN安全防御机制四、WLAN常用接入认证方式五、总结 一、引言 随着无线网络的广泛应用&#xff0c;WLAN&#xff08;无线局域网&#xff09;因其灵活性和便利性成为越来越多用户和企业首选的接入方式。然而&#xff0c;由于无线通信开放的传…

【动手学深度学习】多层感知机之暂退法研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 多层感知机暂退法 &#x1f30d;3.2 基础练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 防止过拟合&#xff1a;权重衰减和暂退法都是用来控制模型的复杂…

基于springboot实现疫情信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现疫情信息管理系统演示 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定疫情信息…

【C++题解】1392 - 回文偶数?

问题&#xff1a;1392 - 回文偶数&#xff1f; 类型&#xff1a;for循环 题目描述&#xff1a; 小明发现有一类数非常有趣&#xff0c;他们正过来读和反过来读是一样的&#xff0c;比如&#xff1a;121、202、383 等&#xff0c;小明给这类数起了一个名字&#xff0c;叫做回文…

【Python】 将日期转换为 datetime 对象在 Python 中

基本原理 在 Python 中&#xff0c;处理日期和时间的库是 datetime&#xff0c;它提供了广泛的功能来处理日期和时间。datetime 模块中有一个 datetime 类&#xff0c;它可以用来表示日期和时间。有时&#xff0c;我们可能会遇到需要将日期字符串转换为 datetime 对象的情况&a…

《绝区零》测试开启,揭开了米哈游海外战略意图

原标题&#xff1a;《绝区零》公测&#xff0c;米哈游希望用一个成熟平台迎接《绝区零》的诞生 易采游戏网6月5日消息&#xff1a;随着《绝区零》公测日期的逐渐迫近&#xff0c;身为米哈游的忠实拥趸&#xff0c;对于这款新作怀揣着无尽期待。作为中国二次元游戏行业的领军企业…

一文读懂银行承兑汇票:从申请到使用全攻略

银行承兑汇票&#xff08;Banks Acceptance Bill&#xff0c;BA&#xff09;是商业汇票的一种。它是由在承兑银行开立存款账户的存款人出票&#xff0c;向开户银行申请并经银行审查同意承兑的&#xff0c;保证在指定日期无条件支付确定的金额给收款人或持票人的票据。银行承兑汇…

qt c++类继承QWidget和不继承有什么区别

class CheckBoxSetting {Q_OBJECT public:CheckBoxSetting(); };和 class CheckBoxSettingsEditor : public QWidget {Q_OBJECTpublic:explicit CheckBoxSettingsEditor(QWidget *parent 0);~CheckBoxSettingsEditor();有什么区别&#xff1f; 这两个类 CheckBoxSetting 和 C…

Klipper安装

安装必要软件 Klipper相关的软件需要Python等软件才能运行&#xff0c;且需要git来同步最新的Klipper等软件源代码&#xff0c;所以需要使用sudo apt install build-essential python3 python3-pip git来安装必要的软件。 安装好pip后&#xff0c;运行pip config set global.i…

Linux系统Docker部署Apache Superset并实现远程访问详细流程

目录 前言 1. 使用Docker部署Apache Superset 1.1 第一步安装docker 、docker compose 1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问 3. 设置固定连接公网地址 前言 作者简介&#xff1a; 懒大王敲代码&#xff0…

校园外卖系统的技术架构与实现方案

随着校园生活的日益现代化&#xff0c;外卖需求在高校学生群体中迅速增长。为了满足这一需求&#xff0c;校园外卖系统应运而生。本文将详细探讨校园外卖系统的技术架构及其实现方案&#xff0c;帮助读者了解这一系统的核心技术与实现路径。 一、系统概述 校园外卖系统主要包…

上海亚商投顾:深成指、创业板指均涨超1%,电力股午后集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日低开后震荡反弹&#xff0c;深成指、创业板指均涨超1%&#xff0c;黄白二线依旧分化。电力、电网股午…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于保守度自适应优化的综合能源系统鲁棒灵活性评估》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

目标检测——铁轨表面缺陷数据集(一)

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …