MTK平台控制CPU核心和频率的程序(源代码)
把微博的转过来
之前的满血工具MTKboost,时间有限不打算研究下去了,正好也有人需要,就开源供有兴趣朋友试试
2016-05-31 23:49:06
不root控制的原理是利用了MTK平台的perfservice服务
一般6595之后的机器都会支持(具体看/system/lib/下有没有libperfservice.so和libperfservicenative.so)
6595的话,Flyme 5之后似乎是支持的,之前的旧版不行。
原理上参考https://yq.aliyun.com/articles/26696 这篇文章
个人只是做了一点微小的工作,抓log试了几个针对6797的参数
最近时间有限不打算研究下去了,正好也有人需要,就开源供有兴趣朋友试试
因为心血来潮用了一晚上随手写的,java部分借用了之前自己的程序,所以比较糙请不要见笑哈哈
源码地址: http://pan.baidu.com/s/1hs0MAtm
其中Native文件夹是C写的原生代码部分。
-------------------
说明:
*注意,频率单位均为kHz
Native界面的3个函数:
resetCPU();取消所有的profile设置
setCPU(int bigNum, int bigFreq, int littleNum, int littleFreq);
旧版API:设置CPU大小核上线数量和频率
对于三集群的MT6797,只能设置高频A53 cluster和低频A53 cluster,无法控制A72
bigNum: 大核心上线数量
bigFreq:大核心频率
littleNum:小核心上线数量
littleFreq:小核心频率
对于MT6795这类,8个核心全部为小核心,则需要设置littleNum=8才能8核全开
setCluster(int cmd, int p1, int p2, int p3, int p4);
新版API:
cmd为命令,p1,p2, p3, p4为参数
cmd:2 设置最少大小核数,对于6797为高配A53和低频A53
参数2个 - param_1:大核数,param_2:小核数
例如: setCluster(2, bigNum, littleNum,0,0);
cmd:3 设置最多大小核数,对于6797为高配A53和低频A53
参数2个 - param_1:大核数,param_2:小核数
例如: setCluster(3, bigNum, littleNum,0,0);
cmd:8 设置GPU最低频率级别
参数1个 - param_1:频率级别,级别越大,频率越高
例如: setCluster(8, gpu, 0,0,0);
由于上述文章和目前可供下载到的代码不是很新,并不支持MT6797三丛集
下面几个参数是文章中没有提供的,个人通过在6797平台上抓log试出来的
cmd:17 设置特定cluster的最小频率
参数2个 - param_1:cluster序号,param_2:频率
对于MT6797:
低频A53: cluster 0
高频A53: cluster 1
A72: cluster 2
例如:
setCluster(17, 0, litteSFreq,0,0);
setCluster(17, 1, litteFreq,0,0);
setCluster(17, 2, bigFreq,0,0);
cmd:18 设置特定cluster的最大频率
参数2个 - param_1:cluster序号,param_2:频率
对于MT6797:
低频A53: cluster 0
高频A53: cluster 1
A72: cluster 2
例如:
setCluster(17, 0, litteSFreq,0,0);
setCluster(17, 1, litteFreq,0,0);
setCluster(17, 2, bigFreq,0,0);
cmd:23 设置整体系统性能
MT6797利用此命令去开启A72
参数1个 - param_1:系统性能级别,貌似是30到1000的整数
例如:
setCluster(23, 800, 0, 0, 0); //开启8个A53+1个A72,满频
setCluster(23, 1000, 0, 0, 0); //开启8个A53+2个A72,满频(安兔兔模式)
====
目前尚无发现直接对A72 cluster的核心数进行设置的命令
因此先采用cmd 23开启需要数量的A72,再对低频和高频A53的核心数进行限制
最后在对3个cluster的频率进行限制
例如:
//开启1个A72
if(bigN==1){
//强开8A53+1A72
setCluster(23, 800,0,0,0);
//设置低频高频A53最小核心数
setCluster(2, littleN,littleSN,0,0);
//设置低频高频A53最多核心数
setCluster(3, littleN,littleSN,0,0);
//18: 设置3个cluster的最大频率
setCluster(18, 0,litteSF* 1000,0,0);
setCluster(18, 1,litteF* 1000,0,0);
setCluster(18, 2,bigF* 1000,0,0);
//17: 设置3个cluster的最小频率
setCluster(17, 0,litteSF* 1000,0,0);
setCluster(17, 1,litteF* 1000,0,0);
setCluster(17, 2,bigF* 1000,0,0);
}
if(bigN ==2){
//强开8A53+2A72,安兔兔模式
setCluster(23, 1000,0,0,0);
//设置低频高频A53最小核心数
setCluster(2, littleN,littleSN,0,0);
//设置低频高频A53最多核心数
setCluster(3, littleN,littleSN,0,0);
//18: 设置3个cluster的最大频率
setCluster(18, 0,litteSF* 1000,0,0);
setCluster(18, 1,litteF* 1000,0,0);
setCluster(18, 2,bigF* 1000,0,0);
//17: 设置3个cluster的最小频率
setCluster(17, 0,litteSF* 1000,0,0);
setCluster(17, 1,litteF* 1000,0,0);
setCluster(17, 2,bigF* 1000,0,0);
}
====================================
目前的问题:
0. 关闭屏幕会进入低功耗模式,清除原有的设置,这是系统限制。
1. MTK或者厂家预先定义了部分场景,比如微博强制不开A72
在进入这些app后,perfservice的status会被该app的预定义场景覆盖
比如好好的满血状态,进微博A72就下线了,回桌面又会上线。
2. 经过测试,cmd:23 设置整体系统性能 中的参数=1000(安兔兔模式)具有最高优先级
因此满血状态可以有效保持。
但在MT6797上,通过新API设置成各个cluster的频率和上线数量后,在MTKboost APP内没有问题,但返回桌面时系统似乎会通过perfservice重新设置A53/A72的数量和频率,导致设置在MTKboost APP外变的无效。(优先级不如安兔兔模式来的高)