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

最新更新时间:2013-07-28来源: 与非网关键字:电源管理  嵌入式系统  PMU 手机看文章 扫描二维码
随时随地手机看文章

系统休眠是嵌入式系统除关机外最省电的一种状态。休眠(Suspend, STR (Suspend To RAM )),又称为挂起或者挂起到内存,会将目前的运行状态数据存放在内存,并关闭硬盘、外设等设备,进入等待状态,此时除了内存仍然需要电力维持其数据,整机其余部分耗电很少。

恢复时处理器从内存读出数据,回到挂起前的状态,恢复速度较快。一般在电池无故障且充满电的情况下可以维持这种状态数天之久。

1 SEP0611和电源管理单元硬件设计

SEP0611是东南大学自主研发的一款基于UniCore32内核的32位高性能、低功耗RISC微处理器,是定位于手持播放设备、卫星导航产品的高性能处理器。主要分为五个部分:系统与时钟控制、外设接口、多媒体系统、GPS系统和存储系统。系统与时钟控制部分包含了电源管理单元(Power Management Unit, PMU)的设计。

PMU包括时钟控制和功耗控制两部分。功耗控制主要负责在各个工作模式下的切换,进入低功耗模式后的唤醒,以及系统的复位控制。系统工作模式主要分为三种:正常工作模式、挂起模式、休眠模式。

2 Linux APM技术

 

图1 Linux APM技术架构图

图1是APM技术在Linux中的架构图。用户通过用户态的APM接口或策略向BIOS申请休眠请求,BIOS设备接收到用户层的休眠请求后会调用内核低功耗层的接口函数,从而实现系统进入休眠的一系列操作;在接收到唤醒信号后内核低功耗层会执行唤醒操作,与此同时低功耗层也会调用外设驱动的电源管理接口让设备跟随系统实现唤醒。SEP0611无BIOS,系统唤醒后会回到bootloader执行。

3 系统休眠的内核层分析与驱动设计

Linux系统休眠内核层是整个休眠部分的核心。它将接受上层休眠命令,并通过驱动层使外围设备进入相应的suspend状态等,在得到唤醒信号后将恢复状态继续运行。它包括了体系结构无关的部分:当前进程的冻结/释放,管理外围驱动;也包括了体系结构相关的部分:让处理器进入/退出休眠,DDR进入自刷新指令序列,系统状态保存/恢复等。本小节由休眠准备,休眠进入和休眠退出,完成唤醒三部分组成。

3.1 休眠准备

在本文中,将suspend_prepare函数、suspend_devices_and_enter函数中的大部分内容划分为休眠准备部分。

suspend_prepare函数的主要作用如下:

(1)用一个全局变量保存好控制台。

(2)执行pm_noTIfier_call_chain函数,该函数调用notifier_call_chain函数来通知事件(将休眠)的到达。

(3)冻结进程,这通过freeze_processses函数实现。

在suspend_devices_and_enter函数中执行剩余的休眠准备工作:

(1)调用suspend_ops->begin.

(2)调用suspend_cONsole函数获取控制台信号量以休眠控制台。

(3)调用dpm_suspend_start函数,该函数分为两步。

首先调用device_prepare,该设备准备函数通常无操作;然后调用device_suspend函数,使设备驱动进入休眠模式。

在该函数中,系统会遍历dpm_active链表,为该链表上的每个驱动调用suspend函数(该函数负责挂起设备驱动),正常返回后会将其移至dpm_off链表队列。至此,已完成休眠准备部分的工作。下面以音频驱动为例展示设备驱动suspend函数的填写(函数头略):

int i;

volatile unsigned long *p_regs = i2s_info.base;

i2s_regs = kmalloc((I2S_PM_REGS_NUM 《 2),

GFP_KERNEL);

if(i2s_regs == NULL)

return -ENOMEM;

for(i=0; i

i2s_regs[i] = *p_regs++;

clk_disable(i2s_info.clk);

return 0;

这段代码主要实现:保存音频设备硬件寄存器;禁止音频设备时钟。


3.2 休眠进入和休眠退出

完成了进入休眠的准备工作,接下来就是进入休眠。

suspend_enter是休眠进入函数,该函数将调用suspend_ops->enter(state),调用该函数即是调用SEP0611驱动接口函数sep_pm_enter;该接口函数在sep_pm.c中实现。该文件将保存在CPU寄存器,将休眠代码搬运到sram中,然后系统在sram中执行休眠代码,先让DDR进入自刷新状态,而后处理器进入sleep模式。当系统处于休眠模式时,一旦接收到唤醒事件的中断,如内部的RTC ALARM中断或者外部的Wakeup按键信号才能够让系统退出休眠,即唤醒系统。综上,进入/退出休眠的代码流程图如图2所示。

 

图2 进入/退出sleep模式的代码流图

 

在图2中的休眠进入部分,保存CPU各模式状态之后,跳转到sram执行DDR2的自刷新和休眠的进入,而这段代码(DDR2的自刷新和休眠的进入)此前已由copy_func_to_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之后的部分和suspend_finish函数完成与休眠准备相逆的操作。

首先在suspend_devices_and_enter函数中执行以下完成唤醒的工作:

(1)调用dpm_suspend_end函数,该函数分为两步。

首先调用设备唤醒函数device_resume,该函数会遍历dpm_off 链表队列,依次调用该队列上设备驱动的resume函数,让驱动恢复正常工作模式,并将其从dpm_off 队列恢复至dpm_active 队列。然后调用device_complete函数,该函数通常无操作。下面仍以音频驱动为例展示设备驱动resume函数的填写(函数头略):

int i;

volatile unsigned long *p_regs = i2s_info.base;

clk_enable(i2s_info.clk);

init_i2s_gpio();

for(i=0; i

*p_regs++ = i2s_regs[i];

kfree(i2s_regs);

i2s_regs = NULL;

return 0;

这段代码主要实现:

(1)使能音频设备时钟;初始化音频相关的GPIO口;恢复音频设备硬件寄存器。

(2)调用resume_console函数释放控制台信号量以唤醒控制台。

(3)调用suspend_ops->end.

其次suspend_finish函数完成与suspend_prepare函数相逆的操作:

(1)唤醒进程,通过thaw_processses函数实现。

(2)执行pm_notifier_call_chain函数,该函数调用notifier_call_chain函数来通知事件(完成唤醒)的到达。

(3)从全局变量恢复控制台。

至此,系统完成唤醒,且系统中所有的设备驱动能正常工作。

4 驱动验证

4.1 验证环境和方法

驱动验证在江苏东大集成电路有限公司生产的功耗测试板上进行,该测试板编号为:SEUIC东集PCB602_DEMO0611,生产日期为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 各0Ω电阻上的电流值

 

在休眠之前和完成唤醒后,系统都处于空闲模式。

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平台的整板功耗有重要意义,对其他平台下的电源管理驱动也有一定的借鉴意义。

关键字:电源管理  嵌入式系统  PMU 编辑:探路者 引用地址:基于SEP0611的电源管理驱动设计方案

上一篇:如何把电源的功率限制变为电流限制
下一篇:LM2567+IR2111做的同步整流降压电路

推荐阅读最新更新时间:2023-10-12 22:23

基于S7600A的嵌入式系统Internet接入方案
    摘要: TCP/IP协议栈大规模集成电路S7600A的结构、功能、硬件接口和应用程序接口;介绍一个基于实时任务操作系统μs/OS的S7600A应用方案,此方案实现了嵌入式系统的Internet接入。     关键词: TCP/IP API 实时操作系统(RTOS) 多任务 嵌入式系统 随着电子设备智能化要求的提高和各种功能强大的微处理器的推出,嵌入式系统逐渐成为许多电子设备不可缺少的一部分,并处在前所未有的发展期;而互联网概念的深入人心更为嵌入式系统与互联网的结合提出了要求。嵌入式系统接入Internet以后,不仅实现了设备的远程控制、维护和升级,而且从另外一层意义上讲,接入Internet的设备已
[嵌入式]
安森美半导体高效电源管理技术助力节能环保
当今社会,能源危机和环境污染已经成为世界各国共同面临的两大难题。随着人们环保和节能意识的增加,低功耗设计越来越受到厂商、消费者和各国政府的关注,高能效的电源设计将成为市场的主导。并且,电源设计周期加快、低待机能耗、高能效以及减少占位面积的要求正在改变传统的电源设计方法,推动电源管理设计的创新。无论是客观环境,还是人们的主观意识上,“环保节能型”设计已是电源管理市场发展的大趋势。 “环保节能型”设计的需求在给半导体产业带来巨大机遇的同时,也带来了重大挑战。在满足政府及相关组织提出的节能环保标准和规范的同时,半导体企业还必须考虑消费者的特定需求。作为业内领先的电源半导体解决方案供应商,安森美半导体拥有专业的设计队伍及高效的供应链
[电源管理]
嵌入式系统的实时数据接口扩展
嵌入式系统目前已广泛应用于信息家电、网络通信和工业控制等各个领域。典型的嵌入式系统主要由嵌入式硬件和软件构成,其中硬件部分的核心为嵌入式处理器。   ARM系列内核是目前嵌入式处理器中广泛使用的内核。采用ARM内核的处理器具有体积小、功耗低、成本低和性能高的特点。在全球有众多生产ARM内核处理器的厂商。   Linux是一种很受欢迎的开放源码操作系统,原先被设计应用于桌面系统,后被广泛应用于服务器。由于其开放源码和内核可裁减等特性,Linux逐渐被修改用于嵌入式领域。目前已有多个嵌入式应用的版本,μClinux 是其中的一个分支,最早被设计应用于微控制领域。其最大特征就是没有MMU(内存管理单元),很适合于许多低端的、
[单片机]
<font color='red'>嵌入式系统</font>的实时数据接口扩展
新兴解决方案增强电动汽车电源管理
电动汽车因其在质量、功能简单性以及最重要的能源效率方面的环保特性而变得越来越流行。功能推力由电动机驱动,与内燃机相比,电动机的结构简单。在能源效率方面,内燃机汽车和电动汽车的比较具有象征意义:内燃机汽车的能源效率为 16%,而电动汽车的能源效率为 85%。推进的电气特性比基于燃烧的特性——能量再生——具有优势。 电力提供了很大的灵活性,包括使用各种形式的能量收集,帮助为电池充电,从而延长车辆本身的运行时间。因此,能量收集技术处于电动汽车研发方案的前沿。 电动汽车的自主性直接反映了其动力总成和能源管理系统的效率。此外,必要的基础设施,例如现在达到数百千瓦功率的强大快速充电系统,同样需要严格遵守预先确定的尺寸和效率限制。通过其
[嵌入式]
新兴解决方案增强电动汽车<font color='red'>电源管理</font>
开关电源接假负载,并不是想接就能接的!
开关电源在负载短路时会造成输出电压降低,同样在负载开路或空载时输出电压会升高。在检修中一般采用假负载取代法,以区分是电源部分有故障还是负载电路有故障。关于假负载的选取,一般选取40W或60W的灯泡作假负载(大屏幕彩色电视机可选用100W以上的灯泡作假负载),优点是直观方便,根据灯泡是否发光和发光的亮度可知电源是否有电压输出及输出电压的高低。但缺点也是显而易见的,例如60W的灯泡其热态电阻为500Q,而冷态电阻却只有50Ω左右。根据下表可以看出:假设电源主电压输出为100V,当用60W灯泡作假负载时,电源工作时的电流为200mA,但启动时的主负载电流却达到了2A,是正常工作电流的10倍,因此,用灯泡作假负载,易使电源启动困难,由于灯
[电源管理]
基于嵌入式系统电源设计方案
本文探讨便携嵌入式系统 电源 设计的注意事项以及设计中应遵循的准则。这些原则对任何具有强大功能且必须以 电池 供电的便携嵌入式系统电源设计都是有帮助的。根据本文描述的构造模块,读者可以为特定设计选择合适的器件以及设计策略。 为 电源电路 规定具体的功能和架构模块并非微不足道,这些工作直接影响到 电池 供电系统的工作时间。电源系统架构会因嵌入式产品和应用领域的不同而各异。下图是典型便携嵌入式系统中的电源方案。 下面我们分别定义图中每个组成部分的要求。假设该产品由 电池 组或外接电源供电。电源路径控制器的功能是当有多个电源时,负责切换至合适的电源。在某些设计中可能需要考虑包括新兴的USB
[电源管理]
ARM平台的Microwindows图形编程
引言 由于受系统内存大小的限制,在运行Linux的ARM平台上直接运行桌面的X Windows系统不太现实。Microwindows是一个开放源码的嵌入式GUI软件,目的是把图形视窗环境引入到运行Linux的小型设备和平台上。作为X Windows系统的替代品,Microwindows可以用更少的RAM和文件存储空间(100K~600KB)提供相似的功能,允许设计者轻松加入各种显示设备、鼠标、触摸屏和键盘等。同时,Microwindows的可移植性非常好,现已成功移植到MIPS、ARM等多种平台上。 Microwindows在ARM平台的移植 尽管Linux 的arch目录下有对ARM处理器支持的代码,但由于Linux是在X
[单片机]
基于ARM高速闪存MCU应对广泛嵌入式需求
  由于采用了ARM7TDMI-S内核,LPC2000系列MCU工作频率达60MHz,与其他8-bit产品相比具有更强的功能延展性。同时它借助片上存储器加 模块实现了“零等待访问”高速闪存功能,提高了指令执行的效率。   此外,LPC2000的外设接口非常丰富,包括UART、SPI、I2C、CAN、ADC、 PWM、RTC等。LPC2000系列MCU应用领域非常广泛,从网络通信、 马达控制,到汽车和消费电子都适合于涉足。   嵌入式系统是面向用户、面向产品、面向应用的,它是将先进计算机技术、半导体技术和电子技术以及各行业的具体应用相结合的产物,因此它是一个高度密集、不断创新的知识集成系统。作为嵌入式系统,它必须能够根据
[应用]
小广播
最新电源管理文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved