Wince禁止自动关机/suspend

本文详细介绍了如何在Wince系统中禁用自动关机或suspend功能,包括修改注册表设置和解决特定问题的方法。此外,文章还讨论了与之相关的注册表配置、电源管理设置及解决自动关机问题的特殊场景。

转自:http://www.proarm.net/wince-disable-auto-suspend.html
本文描述禁止wince自动关机或者suspend再resume后出现自动关机的情况。
wince的注册表有如下内容:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Timeouts]
“ACUserIdle”=dword:3c ; in seconds
“ACSystemIdle”=dword:12c ; in seconds
“ACSuspend”=dword:0 ; in seconds
“BattUserIdle”=dword:3c ; in seconds
“BattSystemIdle”=dword:b4 ; in seconds
“BattSuspend”=dword:12c ; in seconds
如果想禁自动关机,也就是suspend的功能,可以分别设置ACSuspend和BattSuspend为0,分别表示外部供电和电池供电的suspend时间。
是否外部供电需要电池驱动中对于SYSTEM_POWER_STATUS_EX2结构体中的ACLineStatus 是 AC_LINE_ONLINE或者AC_LINE_OFFLINE。
(这部分可以查看本站另一篇文章:WinCE获取电池电量函数
WINCE 5.0直接设置以上ACSuspend和BattSuspend即可,WINCE 6.0可能会存在设置此值无效,原因是pm.dll加载的时候保存此段信息的注册表还不能访问,所以pm.dll使用了默认值,导致注册表设置的值没有被采用,这样设备还是会进入suspend状态。
此时如果查看电源管理中的设置,suspend时间与注册表中的值却是一样的,实际上是因为电源管理程序此时读了注册表。而电源管理模块却仍然使用的默认值。
解决此问题的方法是在某个驱动中(此时需要已经可以访问这段注册表的情况下)调用以下函数,让电池管理模块重新获取配置值。

HANDLE hevReloadActivityTimeouts = OpenEvent(EVENT_ALL_ACCESS, FALSE, _T("PowerManager/ReloadActivityTimeouts"));    
if (hevReloadActivityTimeouts)    {        
    SetEvent(hevReloadActivityTimeouts);        
    CloseHandle(hevReloadActivityTimeouts);    
} 

另外有一种不太常见的情况,如果注册中设置以下值:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power]
“DisableGwesPowerOff”=dword:0
虽然第一次开机不会自动进入suspend/关机,但是系统在suspend并唤醒后,如果不点击触摸屏或者向系统发送按键消息,则过一会机器可能仍然进入suspend状态。
此时将DisableGwesPowerOff设置成1即可,WINCE默认的值也是1。


另外两篇:
http://www.cnblogs.com/we-hjb/archive/2010/01/27/1657973.html
http://www.360doc.com/content/12/0208/13/8354145_185023839.shtml

### init的作用 在Wi-Fi驱动中,`init`函数是驱动模块加载时的入口点。它的主要职责包括注册设备驱动、初始化硬件资源以及建立与系统其他组件的通信机制。例如,在Linux内核中,通过调用`module_init()`宏指定的`init`函数,可以完成Wi-Fi设备的探测和初始化操作。 `init`函数通常负责创建平台设备驱动结构体,并将其注册到内核中。这一过程涉及将驱动程序的功能暴露给设备管理子系统,以便在检测到匹配的硬件时触发相应的探针(probe)函数[^2]。此外,它还可能负责申请必要的内存资源、配置中断处理程序以及初始化数据结构。 示例代码: ```c static int __init wlan_init(void) { // 注册平台设备驱动 platform_driver_register(&wlan_platform_drv); // 初始化总线接口 glBusInit(); // 加载固件 glLoadNvram(); return 0; } module_init(wlan_init); ``` ### resume/suspend的作用 `resume`和`suspend`函数用于实现系统的电源管理功能。当系统进入低功耗状态(如挂起到内存或休眠)时,`suspend`函数被调用以关闭或降低Wi-Fi设备的功耗;而当系统从低功耗状态恢复时,`resume`函数则重新激活设备并恢复其正常工作状态。 这些函数确保了Wi-Fi连接可以在系统睡眠后继续维持,或者根据需要断开连接以节省电量。具体来说,`suspend`可能会保存当前的寄存器状态、释放不必要的资源并设置唤醒条件;而`resume`则会恢复之前保存的状态,并重新启动相关的硬件功能。 示例代码: ```c static int wlan_suspend(struct device *dev) { // 停止网络接口 netif_stop_queue(wlan_net_dev); // 保存寄存器状态 wlan_save_registers(); // 进入低功耗模式 wlan_enter_low_power_mode(); return 0; } static int wlan_resume(struct device *dev) { // 恢复寄存器状态 wlan_restore_registers(); // 离开低功耗模式 wlan_exit_low_power_mode(); // 启动网络接口 netif_wake_queue(wlan_net_dev); return 0; } ``` ### kobj的作用 `kobj`即`struct kobject`结构体实例,它是Linux设备模型中的核心组件之一。`kobj`用于表示内核中的对象,并为它们提供统一的层次结构和生命周期管理。对于Wi-Fi驱动而言,`kobj`可以用来向用户空间暴露属性文件,从而允许用户读取或修改驱动的行为参数。 通过`kobj`,驱动程序能够在sysfs文件系统中创建条目,使得上层应用程序可以通过标准的文件操作(如open、read、write等)来访问和控制底层硬件[^2]。这种机制简化了用户空间与内核之间的交互,并增强了驱动程序的可配置性和调试能力。 示例代码: ```c static struct kobj_attribute wlan_attr = __ATTR(wlan_debug, 0644, show_wlan_debug, store_wlan_debug); static struct attribute *wlan_attrs[] = { &wlan_attr.attr, NULL, }; static struct attribute_group wlan_attr_group = { .name = "wlan", .attrs = wlan_attrs, }; static int wlan_create_sysfs_entry(void) { int ret; wlan_kobj = kobject_create_and_add("wlan", kernel_kobj); if (!wlan_kobj) return -ENOMEM; ret = sysfs_create_group(wlan_kobj, &wlan_attr_group); if (ret) { kobject_put(wlan_kobj); return ret; } return 0; } ``` ### init、resume/suspend和kobj的关系 `init`作为驱动模块的初始化入口,首先建立了整个Wi-Fi驱动的基础框架,包括注册设备驱动、初始化硬件以及创建sysfs条目(通过`kobj`)。一旦驱动成功加载,它就可以响应来自用户的命令或自动探测硬件事件。 当系统准备进入低功耗状态时,`suspend`函数被调用以保存Wi-Fi设备的状态并减少能耗;而在系统唤醒时,`resume`函数则负责恢复设备至先前的工作状态。这两个函数依赖于`init`阶段所建立的初始配置信息,并且也可能利用`kobj`提供的接口来更新用户空间的状态反馈。 与此同时,`kobj`在整个驱动生命周期中持续发挥作用,不仅限于初始化阶段,还包括运行时管理和调试支持。它可以协助`resume`/`suspend`流程中的一些动态调整,比如根据用户设置改变电源策略或记录特定的调试信息。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值