飞思卡尔DVFS
用途:根据负载情况,动态调节频率用于降低功耗。
使用范围:IMX31和IMX53都默认启用,并且imx53还添加了总线频率调节功能。
几个概念及实现:
1. DVFS Dynamic Voltage FrequencyScaling,即动态电压频率调整。
在imx31中,支持硬件的反弹式自动处理和软件的预知处理。这两种方式只可以选择一种。
硬件的反弹式处理:是基于中断的,也就是说,用户是不干预DVFS操作。所以如果选择这种方式的话,对用户来说,是不需要任何工作的。
软件的预知处理:在这种方式下,内核会将极端时间内的15次负载采样返回给用户空间,此时用户空间的程序需要通过一定的算法,给CPU选择一个合适的频率。这里值得注意的是,这15次负载采样,是完全基于硬件寄存器(load track),通过DMA上传到用户空间的buf中的,那么说明这是一个极端时间内的负载采样值,在用户层的程序需要关注的是这一段时间内的采样规律,进而动态的调整cpu的频率。
2. Burst Mode / Skip Mode /Brown Out分频有关的概念
前两个是通过跳周期/跨周期方式来实现轻负载时降低频率。
Brown Out 是指加入了欠压保护
BurstMode详细说明:
当轻负载的时候的VFB(FEEDBACK电压)会降低,当降低到一个数值后(并且为了避免受干扰,要持续一段时间),进入到了Burst-mode.在Burst-mode下,驱动信号不是每时每刻都有的,而是受VFB控制的。当VFB到3.0V时,开始有驱动信号,此时占空比较大,受CURRENT LIMIT LEVEL(也就是初级侧电流最大值)限制。因为有驱动,开关管导通,能量从初级传递到次级,VO和VFB增大,当增大到3.5V时,驱动信号消失。也就是说占空比变成0,停止从初级到次级传递能量,完全靠输出电容的能量维持输出(因为载很轻),VO变低,VFB也变低,当下降到3.0V时,有开始产生驱动信号;就这样一直循环,直到负载突然变大,VFB突然增大到4.5V时,退出burst-mode,进入正常状态。由于驱动信号的断续,所以才叫BURST-MODE。下面两个波形图说明BurstMode;
3. IMX53 DVFS的实现:
随系统启动的PowerManagerService里调用JNI里实现的enable函数,使能驱动文件节点的enable文件。
分层的具体实现为:
a) hardware/libhardware_legacy/power/power.c实现启用驱动文件节点的函数。
b) frameworks/base/core/jni/android_os_Power.cpp中实现JNI函数映射,并调用上面Hal中实现的函数。
c) frameworks/base/services/java/com/android/server/PowerManagerService.javabootCompleted中调用b)步映射的函数打开功能。
d) 驱动包含在freescale包里面的,kernel_imx\arch\arm\plat-mxc\dvfs-core.c。
Imx53在这里实现的开关路径是:/sys/devices/platform/mxc_dvfs_core.0/enable
上面三步只是添加了开机启动,驱动中的实现才是全部重点,下面会边学习边记录。
4. IMX53 DVFS驱动代码分析
因为发现有时假死时是进入了dvfs驱动中一个while循环里面跳不出来了:
5.