MTK平台控制CPU核心和频率的程序(源代码)

夜曲1990 2018-04-20 05:00:15
把微博的转过来


之前的满血工具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外变的无效。(优先级不如安兔兔模式来的高)
...全文
3471 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,851

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧