一种基于SEP0611的电源管理驱动设计方案实现

最新更新时间:2014-02-09来源: 中电网关键字:SEP0611  电源管理 手机看文章 扫描二维码
随时随地手机看文章

引言

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

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

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

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

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

Linux APM技术

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

图1 Linux APM技术架构图

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

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

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 ;

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_PM_REGS_NUM; i++)

i2s_regs[i] = *p_regs++;

clk_disable(i2s_info.clk);

return 0;

这段代码主要实现:保存音频设备硬件寄存器;禁止音频设备时钟。 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、完成唤醒

上面讲到了程序回到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《I2S_PM_REGS_NUM; 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) 从全局变量恢复控制台。

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

驱动验证

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定时中断)唤醒系统,唤醒后验证设备驱动功能。

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等都能正常工作。

结论

由于在系统休眠时4路LDO的掉电和除常开区外各路时钟的切断,系统休眠的电流降到了23mA.这个数值为系统运行时的8%,大大降低了系统的功耗。目前的休眠电流主要消耗在DDR颗粒和外部io上,这都有改进的空间,例如:可以通过配置DDR控制器优化DDR时序、打开DDR的低功耗模式;采用具有更低功耗的DDR3颗粒;可以检查整板电路,是否在测试板休眠时有回路导致电流泄漏;可以检查io电路,等等。总体来说,本设计实现了SEP0611处理器板级的休眠和唤醒、所有设备驱动的休眠和唤醒;完成了电源管理驱动的设计;并在功耗测试板上验证了驱动的正确性。这对以后管理、降低SEP0611平台的整板功耗有重要意义,对其他平台下的电源管理驱动也有一定的借鉴意义。

关键字:SEP0611  电源管理 编辑:探路者 引用地址:一种基于SEP0611的电源管理驱动设计方案实现

上一篇:一种利用多单元串联大功率逆变电源的控制方法
下一篇:新能源最给力:实时内核的电动车电子差速仿真

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

linux驱动程序之电源管理之Run-time PM 详解(4)
Run-time PM. 每个device或者bus都会向run-time PM core注册3个callback struct dev_pm_ops { ... int (*runtime_suspend)(struct device *dev); int (*runtime_resume)(struct device *dev); int (*runtime_idle)(struct device *dev); ... }; 每个device或者bus都会有2个计数器,一个是device的usage counter,一个是device的active状态的children个数。
[单片机]
集创北方亦庄国投1.36亿美元收购IML显示业务
Exar 公司,今天宣布将其旗下的iML子公司出售给北京亦庄 集创北方 科技有限公司,由专注集创北方科技有限公司及其北京亦庄国际投资发展有限公司联合投资成立的企业,目前已签订最终协议,交易价格为1.36亿美元现金支付。 Exar的IML是全球领先的 电源管理 和色彩校准的平板显示和LED照明市场的解决方案供应商。   “我们很高兴与亦庄集创北方达成协议,相信这将为我们的股东创造更多价值,有利于显示领域客户的持续创新,为iML员工带来全新的机会加入到新公司,进一步成为市场的领导者,“Exar公司首席执行官Ryan A. Benton表示, “这次交易是Exar在打造核心竞争力上的重要一步,增加Exar的运营现金和实现资产重组
[嵌入式]
APC电源管理模块IT设备的灵活配电解决方案
任何时候都具有高可用性 PMM 是用于数据中心的模块化紧凑型配电柜,它整合了对输出的单相支路的保护功能和对电能管理的功能。 特性和优点 PMM具有极高的功率密度,可对负载变化进行监测 ,免除手动测量电流的麻烦,可直接与现有设施集成。 标准功能 PMM具有详细信息的显示面板(kVA - kVAR - kW - Pf - I - f - U),通过两级报警阈值消除过载的风险,并可监测负载以及相间配电状况的变化,可集成用于非线性负载的隔离变压器中性线加粗到400A 。 通讯 PMM拥有JBus/ModBus卡,用以将PMM连接至楼宇管理系统;干接点卡,通过无源触点功能来转送PMM的状态,并
[电源管理]
ST电源管理产品阵容新增高集成度的微型PWM控制器芯片
高性能芯片率先在片级封装内集成高级功能和驱动器,配有表示电源正常的PowerGOOD输出引脚,以服务器和计算机主板为目标应用 中国,2007年10月25日 — 世界最大的电源管理芯片供应商之一*的意法半导体(纽约证券交易所代码:STM)今天宣布,电源管理芯片产品组合新增一系列高灵活性、高性能的脉宽调制(PWM)控制器,这些产品的目标应用是计算机主板和负载点设备(POL)市场。新系列产品共有四款产品:L6726A、L6727、L6728和L6728A。在一个标准的SO-8或微型3x3mm DFN封装内,这些产品集成了电压参考电路、控制逻辑电路、栅驱动器以及电压监控和保护电路。其中有两款芯片还提供了适合高端应用的附加功能,例如,
[新品]
电源管理半导体市场近况不佳年底走出低谷
  iSuppli公司认为,电源管理半导体厂商可能必须遵守“创新或死亡”的信条,以便在竞争日趋激烈的市场中保持生存。   虽然电源管理半导体的短期增长情况保持健康,预计2008年营业额增长5%达到277亿美元左右,但较长期的前景仍然黯淡。   几个季度以来,iSuppli公司不断指出电源管理市场面临动荡,有些企业会比其它企业更加成功。iSuppli公司认为,电源管理市场的掠夺性越来越强,有些厂商显著成长——部分在于产业增长,但主要是因为产品的大众化,以及与OEM和ODM展开了富有成效的合作。   与此同时,iSuppli公司预测,有些在早期推出创新性产品的供应商,将能够从其它厂商手中夺得市场份额。尽管许多原有供应
[电源管理]
<font color='red'>电源管理</font>半导体市场近况不佳年底走出低谷
基于bqTINY-II的电源管理模块设计
O 引言 便携式电子产品以电池作为电源。随着便携式产品的迅猛发展,各种电池的用量大增,并且开发出许多新型电池。近年来开发的高能量密度的锂离子电池具有体积小、容量大、待机时间长等特性,非常适合便携式系统的应用。 在便携式电子产品的设计过程中,其电源管理模块的设计是十分重要的,因为这关系到整个系统工作的稳定性、持续性及快速恢复的能力问题。尤其是在使用锂电池作为系统电源时,其电源管理模块的作用更加突现。本文针对锂电池充电的特点,介绍了一种基于bqTINY—II的便携式电子心音检测仪电源管理模块解决方案。 1 锂离子电池充电过程 锂系列(锂离子或锂聚合物)电池的充电过程分为3个阶段,如图1所示。 第一阶
[电源管理]
基于bqTINY-II的<font color='red'>电源管理</font>模块设计
STM8S电源管理-重点活跃停机模式
STM8 电源管理 2012-06-08 22:47:55| 分类: STM8 |字号 订阅 默认情况下在系统或电源复位后,MCU处于运行模式。在这种模式下,CPU由fCPU提供时钟并执行程序代码,系统时钟分别为各个处于激活状态的外设提供时钟,MCU功耗最大。 在运行模式下,为了保持CPU继续运行并执行代码,有下列几种途径可降低功率消耗: ● 降低系统时钟 ● 关闭未使用外设的时钟 ● 关闭所有未使用的模拟功能块 但是,如果CPU不需要保持运行,可使用下列三种低功耗模式: ● 等待(Wait) ● 活跃停机(Active Halt)( 可配置为慢速或快速唤醒) ● 停机(Halt) (可配置为慢速或
[单片机]
STM8S<font color='red'>电源管理</font>-重点活跃停机模式
TYPEC拓展坞电源管理芯片|IM2603设计方案
应用于Type-C拓展坞外围集成Buck变换器的电源管理芯片 IM2603 IM2603 概述 用于带有集成降压转换器的 Type-C 外围应用的电源管理 IC IM2603 是一款主要用于 Type-C 外围应用的电源管理 IC。 它集成了一个带有内置高侧 MOSFET 的同步降压转换器和一个用于可选低侧外部 MOSFET 的栅极驱动器。 如果输入电压 VIN 降低到接近 VOUT 的电压,则进入低压差操作,占空比为 100%。 它具有内部固定软启动功能并提供保护功能,包括输入 UVLO、逐周期电流限制、输出短路保护 (SCP) 或 OVP 和热关断。 IM2603 还控制两个 N-MOSFET 作为负载开关,有助于降低 BO
[嵌入式]
TYPEC拓展坞<font color='red'>电源管理</font>芯片|IM2603设计方案
小广播
最新电源管理文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved