Platform: RK3368

OS: Android 6.0

Kernel: 3.10.0

rk3368采用cpufreq进行CPU频率调节,但同时又做了过温保护和温度限制频率。

1. 过温保护
驱动位于kernel/drivers/thermal/rockchip_thermal.c
dts定义:

tsadc: tsadc@ff280000 {
                compatible = "rockchip,rk3368-tsadc";
                reg = <0x0 0xff280000 0x0 0x100>;
                interrupts = <GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&clk_tsadc>, <&clk_gates20 0>;
                rockchip,grf = <&grf>;
                rockchip,cru = <&cru>;
                rockchip,pmu = <&pmu>;
                clock-names = "tsadc", "apb_pclk";
                clock-frequency = <32000>;
                resets = <&reset RK3368_SRST_TSADC_P>;
                reset-names = "tsadc-apb";
                //pinctrl-names = "default";
                //pinctrl-0 = <&tsadc_int>;
                #thermal-sensor-cells = <1>;
                hw-shut-temp = <120000>;
                status = "disabled";
        };

可以看到当前hw-shut-temp = <120000>;也就是温度大于120度就会触发过温保护,强制关机。
查看当前CPU温度:

#cat /sys/rockchip_thermal/temp

CPU动态调频(DVFS)
Linux内部共有五种对频率的管理策略userspace,conservative,ondemand,powersave 和 performance.可以根据负载进行频率提升和降低。

查看支持的governors
# cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
conservative ondemand userspace powersave interactive performance

DVFS的dts定义:

dvfs {
        vd_arm: vd_arm {
            regulator_name = "vdd_arm";
            suspend_volt = <1000>; //mV
            pd_core {
                clk_core_b_dvfs_table: clk_core_b {
                    operating-points = <
                        /* KHz    uV */
                        312000 1200000
                        504000 1200000
                        816000 1200000
                        1008000 1200000
                        >;
                    status = "okay";
                    cluster = <0>;
                    temp-limit-enable = <1>;
                    target-temp = <80>;
                    min_temp_limit = <216000>;
                    normal-temp-limit = <
                    /*delta-temp    delta-freq*/
                        3    96000
                        6    144000
                        9    192000
                        15    384000
                        >;
                    performance-temp-limit = <
                        /*temp    freq*/
                        100     816000
                        >;
                    lkg_adjust_volt_en = <1>;
                    channel = <0>;
                    tsadc-ch = <0>;
                    def_table_lkg = <25>;
                    min_adjust_freq = <216000>;
                    lkg_adjust_volt_table = <
                        /*lkg(mA)  volt(uV)*/
                        0         25000
                        >;
                    pvtm_min_temp = <25>;
                };
                clk_core_l_dvfs_table: clk_core_l {
                    operating-points = <
                        /* KHz    uV */
                        312000 1200000
                        504000 1200000
                        816000 1200000
                        1008000 1200000
                        >;
                    status = "okay";
                    cluster = <1>;
                    temp-limit-enable = <1>;
                    target-temp = <80>;
                    min_temp_limit = <216000>;
                    normal-temp-limit = <
                    /*delta-temp    delta-freq*/
                        3    96000
                        6    144000
                        9    192000
                        15    384000
                        >;
                    performance-temp-limit = <
                        /*temp    freq*/
                        100     816000
                        >;
                    lkg_adjust_volt_en = <1>;
                    channel = <0>;
                    tsadc-ch = <0>;
                    def_table_lkg = <25>;
                    min_adjust_freq = <216000>;
                    lkg_adjust_volt_table = <
                        /*lkg(mA)  volt(uV)*/
                        0         25000
                        >;
                    pvtm_min_temp = <25>;
                };
            };
        };

可以看到里面定义了大核和小核的两种限制模式,normal-temp-limit和performance-temp-limit。performance模式中,当温度高于80则频率限制在816000。而在normal模式中,则是每当温度上升delta-temp,则频率降低delta-freq,直到降到min_temp_limit为止。

实现代码位于:
arch/arm/mach-rockchip/dvfs.c
驱动初始化了一个工作队列dvfs_temp_limit_work_func,每隔HZ/10执行一次。主要任务是根据当前温度对temp_limit_rate进行修改。从而让dvfs_get_limit_rate返回的是限频的值。

系统默认为normal模式,在init.rc中写入的:

# set temperature control policy as normal mode
    write /sys/module/rockchip_pm/parameters/policy 1

查看及修改当前电源策略:

# cat /sys/module/rockchip_pm/parameters/policy
# echo "1">/sys/module/rockchip_pm/parameters/policy

rk3368 CPU动态调频与温度保护相关推荐

  1. CPU动态调频二:interactive governor

    Linux提供了多种governor供用户选择,这里以interactive为例,毕竟现在的android手机中都是采用该governor. 基于linux 3.14 以下代码若未指明位置则默认在dr ...

  2. linux动态调频响应时间,CPU动态调频(linux 3.14.0)一

    最近做了一个关于CPU动态调频的project,边工作边学习,在此记录一下. code版本:3.14.0(在linxu目录顶层Makefile中可看到版本号) 设备:基于安卓4.4原生系统的某厂商的手 ...

  3. 初探Linux CPU动态调频与实测

    关于 本文主要涉及Linux CPUFreq子系统是什么,为什么需要,怎么用. 并解决在实际测试中遇到的三个问题: scaling_governor没有userspace的问题. /proc/cpui ...

  4. linux CPU动态调频【转】

    转自:https://www.xuebuyuan.com/2185926.html 针对sep4020的linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时 ...

  5. linux CPU动态调频

    针对 sep4020的 linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时间的工作主要在机制上.暂时想实现的主要的机制有: cpu级,设备驱动级,系统平台 ...

  6. 【interactive governor】CPU动态调频:

    #!/usr/bin/bash # interactive(互动)是目前最常用的调速器, CPU 频率是根据负载实现交互式反应, # ondemand(一经请求)  # conserative(保守) ...

  7. CPU动态调频三:interactive governor如何选频

    choose_freq函数用来选频,使选频后的系统workload小于或等于target load. 核心思想是:选择最小的频率来满足target load. 影响选频结果的因素有两个: 1.两次统计 ...

  8. iTOP-4418开发板支持动态调频,AXP228电源管理,预留锂电池接口,内置充放电电路及电量计...

    iTOP-4418开发板 支持动态调频,AXP228电源管理,预留锂电池接口,内置充放电电路及电量计 核心板320PIN全引出,16G存储高配版本,核心板4418/6818全兼容,并跨行业大量应用 系 ...

  9. android 系统gpu 调试_基于Android系统的GPU动态调频方案 | Imagination中文技术社区

    针对移动终端上GPU的高功耗问题,提出一种基于Android系统的GPU动态调频方案.方案根据各种应用对GPU的性能需求,引入了GPU的频率一性能模型,包括选择工作频率和测量相对性能的方法.动态调频算 ...

最新文章

  1. html如何超链接到servlet
  2. 【控制】《复杂运动体系统的分布式协同控制与优化》-方浩老师-第3章-局部指数稳定的多欧拉-拉格朗日系统协同控制
  3. 图论相关算法理解和总结
  4. php 自定义菜单 openid,微信公众平台开发(99) 自定义菜单获取OpenID
  5. 优化android studio编译的apk大小
  6. Excel与DataGridView的操作示例
  7. 5步带你掌握工作流Activiti框架的使用
  8. VB 字符串续行符最多25行…………
  9. 102份深圳炒房材料曝光 网友举报千人炒房大会
  10. oracle应用程序开发,关于Oracle 数据库应用程序开发问题
  11. html中使用js实现福彩双色球随机选号
  12. Rhino(犀牛)室内模型导入Unity3d快速烘焙光影【2020】
  13. 服务器虚拟机声卡无法加载,Esxi虚拟机添加声卡
  14. java action例子_实例——创建ActionForm Bean
  15. win7网络不显示共享计算机,Win7电脑已开启共享却找不到设备 局域网显示空白该怎么解决...
  16. 【方向盘】启动命令和IDEA如何传递:VM参数、命令行参数、系统参数、环境变量参数、main方法参数
  17. sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表
  18. java中环境变量设置
  19. python课程知识点总结(循环结构~列表)(0基础学习,后持续更新)
  20. 棋牌服务器的租用选择

热门文章

  1. CAD中如何快速填充标题栏?
  2. 倾斜框IOU计算实现(c++,python)
  3. signature=29c2d7f30321e08413c374e6d87fb171,来用百度密语吧!!!
  4. 从感恩节到圣诞节,看看黑客在节假日都干了啥?
  5. unix 修改文件类型
  6. 可以替代百度统计工具Matomo,小睿部署实战!看完你也会了哦!
  7. Firefox在线安装Firebug插件
  8. 网易100件事任务清单html,人生必做的100件事测试
  9. WIN10 装了PP助手运行提示:初始化数据库失败!
  10. 整蛊小病毒,自己拿来快乐