基于SEP0611的电源管理驱动设计

在图2中的休眠进入部分,保存CPU各模式状态之后,跳转到sram执行DDR2的自刷新和休眠的进入,而这段代码(DDR2的自刷新和休眠的进入)此前已由copy functo sram函数搬运至sram中;而跳转通过将sram的物理地址静态映射到linux内核(在对应架构的mm.c中)实现。此后,系统处于休眠(sleep)模式,直至唤醒信号的到来。SEP0611中可用的唤醒信号有:电源键、RTC的ALARM中断、外部GPIO(AO)口。一旦唤醒信号到来,即是该执行休眠退出部分了。PMU硬件部分将让系统重新上电,而软件则回到bootloader部分执行,在bootloader中有一段分支代码,该部分代码判断是一次正常启动还是一次从休眠的唤醒,若是后者,则恢复CPU各模式状态,此后回到linux操作系统。需要说明的是,在进入休眠部分的保存CPU各模式状态之前,PC值(用于返回的地址,实际保存的是PC值加上0x10(合4条指令))已经被保存到一个硬件寄存器中;因此,在退出休眠部分的恢复CPU各模式状态之后,将PC值从硬件寄存器取出,通过其使程序回到linux操作系统执行。
3.3 完成唤醒
上面讲到了程序回到linux系统执行后,休眠内核层将通过suspend_devices_and_enter函数中位于调用suspend_enter之后的部分和sus pend_finish函数完成与休眠准备相逆的操作。
首先在suspend_devices_and_enter函数中执行以下完成唤醒的工作:
(1)调用dpm_suspend_end函数,该函数分为两步。
首先调用设备唤醒函数device_resume,该函数会遍历dpm_off链表队列,依次调用该队列上设备驱动的resume函数,让驱动恢复正常工作模式,并将其从dpm_off队列恢复至dpm_active队列。然后调用device_complete函数,该函数通常无操作。下面仍以音频驱动为例展示设备驱动resume函数的填写(函数头略):
这段代码主要实现:
(1)使能音频设备时钟;初始化音频相关的GPIO口;恢复音频设备硬件寄存器。
(2)调用resume_console函数释放控制台信号量以唤醒控制台。
(3)调用suspend_ops->end。
其次suspend_finish函数完成与suspend_prepare函数相逆的操作:
(1)唤醒进程,通过thaw_processses函数实现。
(2) 执行pm_notitier_call_chain函数,该函数调用notifier_call_chain函数来通知事件(完成唤醒)的到达。
(3)从全局变量恢复控制台。
至此,系统完成唤醒,且系统中所有的设备驱动能正常工作。
4 驱动验证
4.1 验证环境和方法
驱动验证在江苏东大集成电路有限公司生产的功耗测试板上进行,该测试板编号为:SEUIC东集PCB602DEMO0611,生产日期为2011. 05.13。测试时:CPU运行在800MHz,AHB总线运行在180MHz,DDR运行在400MHz;测试板采用4路LDO供电,4路分别为core、arm、ddr phy、cpu io。测试方法为:1) 用万用表的毫安档测试电流,每测一路,要将该路的0Ω电阻吹掉,将万用表串入电路,同时保证其他路的0Ω电阻连接。2)通过操作linux操作系统中sysfs文件系统提供的接口让测试板进入休眠,即是在终端输入命令:echo_mem>sys/power/state。3)通过电源键(或RTC定时中断)唤醒系统,唤醒后验证设备驱动功能。
4. 2 验证结果
测试的0Ω电阻上的电流值如表1所示。b-s(mA)列代表系统休眠之前某电阻上的电流值;i-s(mA)列代表系统休眠之时某电阻上的电流值;a-s(mA)列代表系统完成唤醒时某电阻上的电流值;最后一列除了包含了上面提到了4路外,还包含DDR颗粒(ddr_mem)和外设(io)这两路。在休眠之前和完成唤醒后,系统都处于空闲模式。

由表1可见,系统进入休眠状态,core、arm、ddr_phy、cpu_io这四路的电流下降为0,因为这4路电压都为0,而此时DDR颗粒和外设上分别有14mA和17mA的电流。在测量各路电流的同时,还采用稳压源供电,测试了板级总电流:系统休眠之前的板级总电流为287mA,休眠之时为23mA,完成唤醒时为284mA。
在系统完成唤醒后,测试了系统中所有设备驱动的工作情况:系统中的包括TIMER、CPU这样的系统设备工作正常:系统中的外设驱动包括UART、LCDC、I2C、I2S、SDIO、NAND、USB等都能正常工作。
5 结论
由于在系统休眠时4路LDO的掉电和除常开区外各路时钟的切断,系统休眠的电流降到了23mA。这个数值为系统运行时的8%,大大降低了系统的功耗。目前的休眠电流主要消耗在DDR颗粒和外部io上,这都有改进的空间,例如:可以通过配置DDR控制器优化DDR时序、打开DDR的低功耗模式;采用具有更低功耗的DDR3颗粒;可以检查整板电路,是否在测试板休眠时有回路导致电流泄漏;可以检查io电路,等等。总体来说,本设计实现了SEP0611处理器板级的休眠和唤醒、所有设备驱动的休眠和唤醒;完成了电源管理驱动的设计;并在功耗测试板上验证了驱动的正确性。这对以后管理、降低SEP0611平台的整板功耗有重要意义,对其他平台下的电源管理驱动也有一定的借鉴意义。
- 基于FPGA的2M误码测试仪设计(05-11)
- 有关混合信号的技术方案及应用文献,包括示波器、信号调节器等(05-11)
- 基于CPLD的多次重触发存储测试系统设计(03-17)
- 一种2Gsps数字示波器数据采集系统的设计(08-18)
- 测试3G手机的DigRF(10-09)
- 准确测量便携式设备电池剩余电量的方法(10-24)
