天天看點

[RK3288][Android6.0] 調試筆記 --- CPU溫度降頻控制

rk3288平台關于溫度調節cpu頻率有個bug.

在rk3288.dtsi中,有:

temp-limit-enable = <1>;
target-temp = <80>;
min_temp_limit = <48>;
           

當溫度升到超過80°時,随着溫度升高,cpu頻率最終會降到min_temp_limit的值,每次降的level按照下表執行

target-temp = <>;
    normal-temp-limit = <
    /* delta-temp delta-freq */
           
           
           
          
        >;
           

第一列為降低每一級閥值,第二列為降低頻率,預設溫控開始溫度是80°.

例如目前溫度是82°,那麼不作用,當達到83°時, 溫控降頻開始有效,假設系統目前要設定1008000KHz,那麼經過溫控系統之後會減去96000KHz. 如果溫度很高,就會一直這樣減下去,減到不能低于min_temp_limit為止.

最終影響系統頻率的地方是在dvfs_get_limit_rate().

不過原始code中min_temp_limit的機關有問題,應該是KHz.

改動:

[email protected]:~/rk3288/kernel$ g df 15b426e089c6f5091168ab3a0552ac96faa290c1 b3e70eaeda236c57e239ea2c3c24da49304b240f
diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi
index e8dd31f..7d8804f 100644
--- a/arch/arm/boot/dts/rk3288.dtsi
+++ b/arch/arm/boot/dts/rk3288.dtsi
@@ -997,7 +997,9 @@
                                        tsadc-ch = <1>;
                                        temp-limit-enable = <1>;
                                        target-temp = <80>;
-                                       min_temp_limit = <48>;
+                                       min_temp_limit = <312000>;
           

312MHz是rk給的建議頻率.

代碼使用:

dvfs.c:

讀取:

static int dvfs_node_parse_dt(struct device_node *np,
                  struct dvfs_node *dvfs_node)
{
        of_property_read_u32_index(np, "min_temp_limit",
                       , &dvfs_node->min_temp_limit);
        dvfs_node->min_temp_limit *= ;
}
           

比較:

static void dvfs_temp_limit_normal(struct dvfs_node *dvfs_node, int temp)
{
            if (arm_rate_step &&
                (dvfs_node->temp_limit_rate > arm_rate_step)) {
                dvfs_node->temp_limit_rate -= arm_rate_step;
                printk("temp_limit_rate:%ld\n", dvfs_node->temp_limit_rate);
                if (dvfs_node->temp_limit_rate <
                    dvfs_node->min_temp_limit)
                    dvfs_node->temp_limit_rate =
                    dvfs_node->min_temp_limit;
                dvfs_clk_set_rate(dvfs_node,
                          dvfs_node->last_set_rate);
                dvfs_temp_limit_4k();
            }
}
           

繼續閱讀