一、为什么要进入suspend mode.
为了使嵌入式系统尽可能的省电,特别是对于电池供电设备,将能够提供比较长的工作时间。举一个例子,colibri全系列模块在挂起状态下的功耗是3.3v@2ma。
二、wince如何进入挂起模式(suspend mode)与唤醒
通常有3种方法,
1) 点击wince的开始—挂起
2) 使用电源计划,设定挂起的时间
3) 使用api函数
举例:
#include pm.h
setsystempowerstate( null, power_state_suspend, 0 );
三、wince 挂起与唤醒时,发生了什么?
一旦操作系统被要求挂起,它就启动了关闭该设备的子系统进程。
1) 首先,系统任务栏(task bar)得到通知,该系统即将中止。这是唯一得到提示的应用程序。这是意味着你的应用程序不能得到通知。
2) 应用程序消息队列关闭。这意味着应用程序将无法接收到任何消息。
3) 系统通知设备驱动的电源管理部分将硬件的电源转换到挂起状态,大部分的硬件将被关闭,系统只保留极少数的硬件电源。
4) 内核停止线程调度,只有挂起线程保留运行。
5) 内核通过设备驱动管理程序再次确认设备是否关闭电源。
6) 该内核将系统处于待唤醒状态,有一些唤醒源可以激活系统, 例如特定的gpio、触摸屏或以太网、实时时钟的一个计划中的事件。
7) 内核将ram置于低功耗状态,保持里面的数据,
8) 最后,内核处于一个低功率状态的cpu
使用唤醒源来唤醒系统:
1) 这其实是一个cpu reset事件,bootloader 引导程序来运行。将转到程序最初进入挂起前的状态。
2) 内核将ram上电以便能够使用。
3) 内核开始控制设备驱动,使设备上电。
4) 内核开始运行线程了。
5) 消息队列开始运行。
6) 一个消息被广播到运行的应用程序中,使程序知道内核已经脱离暂停。
http://blog.gkong.com/uploadfile3/2010513174916470.jpg
四、colibri计算机模块进入suspend和wakeup的具体设置
1) wakeup 源,以下均可以设置为唤醒源
[URL=http://wiki.toradex.com/index.php/touch_screen]
touch screen
[/URL]
触摸屏
internal
[URL=http://wiki.toradex.com/index.php/rtc]
rtc
[/URL]
内部时钟
sodimm pin 43 rising and falling edge
sodimm pin 63 rising and falling edge (ps2 mouse)ps2鼠标
sodimm pin 69 rising and falling edge (ps2 keyboard) ps2键盘
colibri pxa 270 [/b]
gpio:
以下每一个: 0-15, 16-17, 34, 35, 39, 83, 90, 91, 93-102, 116
两者之一: 31 or 113
仅其中的一个: 38 or 36 or 40 or 53
colibri pxa 320 [/b]
sodimm:
以下每一个:
019,021,023,025,027,029,030,031,032,033,034,035,036,037,038,043,045,049,051,053,054,
055,057,061,063,065,066,069,073,075,077,081,085,086,088,090,092,093,095,096,100,101,
102,103,104,106,107,118,120,122,124,127,129,131,134,135,136,137,138,140,142,144,146,
150,152,154,156,158,160,162,164,166,168,170,172,174,176,180,190,192,194,196
043: this pin is always sensitive on both edges!
064,099,133: these pins could be used as wakeup under special circumstances but we
advise to not use them!
extconn扩展接口:
以下每一个:
01,02,03,05,06,07,08,09,10,11,12,13,14,15,16,17,18
colibri pxa 300/310 [/b]
sodimm:
pxa 300/10以下每一个:
019,021,023,025,027,028,029,030,031,032,033,034,035,036,037,038,045,047,049,050,051,
052,053,054,055,057,059,061,063,064,065,066,069,074,081,085,086,088,090,092,093,095,
099,100,102,104,105,106,107,118,120,122,124,127,129,131,133,135,136,137,138,140,142,
144,146,152,154,156,158,160,174,176,184,190,192,194,196
043: this pin is always sensitive on both edges!
050,064,066,074,099,133: these pins could be used as wakeup under special
circumstances but we advise to not use them!
仅 pxa300 :
004,006,014,016,018,020,073,075,077,150,162,164,166,168,170,172,180
仅 pxa310 :
178: this pin could be used as wakeup under special circumstances but we advise
to not use it!
extconn扩展接口:
pxa300/310以下每一个:
01,02,03,05,06,07,08,09,10,11,12,13,14,15,16,17,18
仅 pxa310 :
04: this pin could be used as wakeup under special circumstances but we advise
to not use it!
2) 注册表设置
[/b]
sodmimm [/b]管脚作为唤醒源[/b]
语法: sodimm+pin+edge+[edge]
触发沿: r: raising edge, f: falling edge
举例:
[hklm\system\pm\suspend]
wakeupsources = sodimm69r,sodimm30rf
[/b]
extension connector 扩展接口(x3)
[/b]作为唤醒源: [/b][/b]
语法: extconn+pin+edge+[edge]
触发沿: r: raising edge, f: falling edge
举例:
[hklm\system\pm\suspend]
wakeupsources = extconn2r
[/b]
gpio (pxa270 only) [/b]作为唤醒源[/b][/b]
语法: gpio+pin+edge+[edge]
触发沿: r: raising edge, f: falling edge
举例:
[hklm\system\pm\suspend]
wakeupsources = gpio0rf,gpio14rf
其它唤醒源 [/b][/b]
rtc: 内部时钟.
handle hnotif;
ce_user_notification un={0};
systemtime st={2010,4,3,21, 6,23,0,0}; //year,month,dayofweek,day, hour,minute,second,millisecond
//wake the system on april 21, 2010, 06:23:00
hnotif = cesetusernotification(null, l, &st, &un);
touch:
touch screen
. in this case the system will wake up if you touch the display.
example:
[hklm\system\pm\suspend]
wakeupsources = rtc,touch
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=115688&Name=toradexag