i.MX53 休眠
mx53的几个模式:
1. RUN - core+时钟+外设都工作,由软件控制哪些模块的时钟可被停止。
2. WAIT - core停止,clock停止,总线时钟和外设按需打开。
3. STOP - core停止,外设停止,总线时钟停止,DPLLs关闭。
其中2/3都属于WFI(Wait For Interrupt)模式,cpu停止直到唤醒源到来。
mx53执行WFI指令的过程:
1. 允许CPU进入Deep Sleep(ARM_LPC, Low Power Control 11.3.3)
ARM_LPC.DBGDSM = 1 ,在DEBUG模式时允许CPU进入Deep Sleep Mode
ARM_LPC.DSM=1, 允许CPU进入Deep Sleep Mode
2. 软件设置CCM模块的LPM位
CCM (18.3.20)
下面描述的是进入STOP模式,可以修改以进入WAIT模式。
CLPCR.LPM[1:0] = 0b10 //进入STOP模式
CLPCR.STBY_COUNT = 0b11 //等待16个ckil时钟周期
CLPCR.VSTBY = 1
CLPCR.SBYOS = 1
进入STOP时,mx53会控制PMIC_VSTBY_REQ(PMIC_STBY_REQ)引脚。这样可以通知PMIC"系统已经进入休眠了,你现在可以设置休眠时的供电电压了"。
若CLPCR.VSTBY = 1,则进入STOP后mx53会将PMIC_VSTBY_REQ拉高。
从STOP模式唤醒时,PMIC_VSTBY_REQ首先释放,CCM等待系统电压恢复正常(采样PMIC_VFUNCIONAL_READY引脚),PMIC此时应该恢复系统正常供电。
从STOP模式唤醒时,CCM释放PMIC_VSTBY_REQ并去采样PMIC_VFUNCIONAL_READY信号之前,会等待一段时间(下图中的t1),STBY_COUNT指定这段时间的长度。
PMIC_VFUNCIONAL_READY是PMIC用来向CPU发送的信号,用以指示现在电源都准备好了。可以省略这个信号,但要保证t1的时间足够长。
3. 设置GPC模块的电源门控位(power gate bit)
SRPGC_SRPGCR.PCR=1 //pdn_req信号有效时,将电源切断。
ps:
碰到一个比较奇怪的问题,有一台机器休眠后再也无法唤醒了。检查发现休眠的最后CPU并没有将PMIC_STBY_REQ拉高,所以判断是CPU休眠时出的问题(而不是唤醒有问题)。最后查找发现:Android获得Audio设备后就不会再释放它,一直持有。而mx53使用了sdma来传送数据。如果在休眠时掉sdma的clk,则这台机器休眠/唤醒就正常了。
通常,在休眠时是需要尽量释放资源和关闭clk时钟的,但如果不关闭的话并不会影响CPU的休眠工作(正常情况下)。目前只能猜想这台机器的CPU会有这个问题。不知道是否真的是Freescale的一个BUG,其概率为多少。