在了解Symbian OS电源管理之前,先来看一下电源有哪些状态。Symbian OS内核定义了三种电源状态:
l Off状态,在这个状态下所有的设备都关闭电源或处于非活动状态,或者仅仅只有很微弱的电源消耗。这个状态是由于用户的行为、应用程序的请求、UI进入非活动状态或意外电源损耗的结果。另外系统进入睡眠状态时,电源也是这种状态。需要注意的是必须重启系统电源才会回到Active状态,可以是冷启动,也可以是热启动如果系统在睡眠时。
l Standby状态,一个较低的电源损耗状态,由于关闭了系统很多资源如时钟、外设、CPU及一些内部处理而进入此状态。从此状态可以很快切换到Active状态。
l Active状态,及完全的活动状态。
电源管理
Symbian OS系统内核提供了一个电源管理的框架,可以管理电源的状态切换,内核端管理设备电源状态,通过实现内核扩展接口来对手机上电源进行管理。内核端框架还为设备驱动使用电源提供了接口。框架的用户端接口在User Library中的电源相关的类给出,从而使得应用程序可以被通知、响应、改变电源的状态。
下图显示了Symbian OS 中电源管理框架结构:
图1 电源管理架构图 (源:SDL)
电源管理器模块管理电源状态的转换;电源控制器是内核的一个扩展,它管理特定设备的电源,如芯片电源控制器,振荡器等;电源处理器是电源管理的设备驱动接口。
电源管理器(Power manager)
电源管理器管理电源状态的转换,从上图中可以看出,它协调外设和CPU的电源状态变化,提供设备驱动和电源控制器之间的交互,它还管理与用户端的交互。
电源管理器是DPowerManager类的一个实例化,这个对象是Symbian OS的私有对象,这个对象在系统初始化时创建,但直到电源控制器被创建和注册后才被安装。在这个对象安装之前,Symbian OS用内建的缺省行为来管理电源。
在用户端的电源类,是一系列的静态函数,允许用户端请求从Standby 或Off 的状态转换,并允许用户端请求唤醒事件通知。电源管理器对象是电源控制器对象和电源处理器对象的定位点(anchor point)。
电源控制器(Power Controller)
电源控制器管理专用设备的电源,诸如芯片电源管理控制器,振荡器等。它是DPowerController类的一个实例,它是一个抽象类,需要从新实现。电源控制器需要注册,注册实际上就是在电源管理器对象中放一个指向电源控制器对象的指针。
电源控制器负责跟踪唤醒事件,并通知电源管理器。
电源处理器(Power Handlers)
DPowerHandler类为设备驱动与电源管理器提供了接口,这是一个抽象类,需要物理设备驱动实现。DPowerHandler对象如何适配到驱动的对象模型中取决于设备驱动的设计,当这个对象创建后,驱动应该调用DPowerHandler::Add方法进行注册,注册成功后就可以收到电源状态改变的通知了。
当请求电源状态切换为Off或Standby时,电源管理器调用DPowerHandler::PowerDown方法,当请求电源切换到Active状态时,电源管理器调用DPowerHandler::PowerUp方法。驱动程序必须在这两个函数被调用后做出相应的响应。