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

2024-06-05 10:28

本文主要是介绍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。

这篇关于i.MX8MP平台开发分享(TMU驱动及用户接口篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032803

相关文章

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来