图3 系统电源状态的转换
3 背光驱动的电源管理
3.1 LCD 背光的电源管理策略
背光驱动启动一个监视工作线程, 不停的等待3 个事件:
3.1.1 BackLightChang eEv ent
等待注册表中时钟的更新, 在注册表的时钟更新之后总是将背光灯打开。
dw Resul t = WaitForMul tipleObject s( NUM _EVENT S, & g_evtSignal[ 0] , FALSE, dw Tim eout ) ;
if ( WAIT _OBJECT_0 = = dw Res ult ) {
BL_ReadRegist ry( & g_BLInf o) ;
BL_On( TRUE) ;
}
3.1.2 Pow erChangedEv ent
供电电源发生变化, 例如插入了电源, 监视线程会获得了这个事件。如果使用电源, 可以使用m _ dw ACTimeout 值作为超时值, 否则, 使用m _ dw Batter yT imeout 值作为超时值。
if ( dw Result = = WAIT_OBJECT _0+ BL_POWERE VT) {
if ( IsACOn( ) ) {
dw Timeout = g_BLInf o. m_dw ACTim eout * 1000;
}
else {
dw Timeout = g_BLInf o. m_dw Bat t eryT imeout * 1000;
}
}
3.1.3 Pow erM anag er/ ActivityTimer / UserActivity
等待用户输入事件,如果用户有按键动作,则无论电源插上与否背光驱动都打开,否则,等待超时事件的发生, 将背光驱动关闭。
if ( dw Result = = WAIT_OBJECT _0+ 1 | | dwResult = = WAIT _OBJECT _0 + BL_BUT TONEVT )
{
if ( IsACOn( ) ) {
if ( g_BLIn fo. m_bAC Au t o) {
BL_On( TRUE) ; }
}
else {
if ( g_BLIn fo. m_bBat t eryAut o) {
BL_On( TRUE) ; }
}
}
else if ( dw Result = = WAIT_T IMEOUT ) {
BL_On( FALSE) ;
}
注册表的超时值决定了背光灯的工作时间。在注册表中进行如下超时值的设置:
[ H KEY_CURRE NT_USER/ Cont rolPanel / Backlight ]
"AC Timeout "= dword: 3c / / 十六进制, 十进制为60
"Bat t eryT imeout "= dw ord: 1e / / 十六进制, 十进制为30