RTC(Real-Time Clock,实时时钟)唤醒是一种低功耗的唤醒机制,它允许计算机系统在待机或睡眠状态下通过RTC定时器来唤醒。下面是RTC唤醒的基本原理:
-
RTC硬件: 计算机系统中的RTC硬件是一个独立的芯片或模块,用于提供实时时钟和日历功能。它通常由一个晶体振荡器和相关的计数器组成。
-
RTC定时器设置: 在计算机系统进入待机或睡眠状态之前,操作系统或BIOS可以通过编程设置RTC定时器的触发时间。这个触发时间可以是一个具体的日期和时间,也可以是相对于当前时间的一段时间间隔。
-
进入待机或睡眠状态: 当计算机系统进入待机或睡眠状态时,大部分硬件设备会被关闭或进入低功耗模式,以节省能源。但RTC仍然保持运行,并继续计时。
-
RTC定时器触发: 当RTC定时器的计数器达到预设的触发时间时,它会产生一个唤醒信号,通知系统唤醒。
-
系统唤醒: 在接收到RTC的唤醒信号后,计算机系统会从待机或睡眠状态中恢复,并重新启动操作系统或从先前的状态中恢复。
RTC唤醒机制的优点是它消耗的功耗非常低,因为RTC硬件通常只需要很少的电流来维持实时时钟的运行。这使得RTC唤醒成为一种适用于低功耗设备和需要长时间待机的应用场景的有效方法。
服务器中RTC唤醒依赖ACPI的中断触发,ACPI的EVENT详细参考ACPI Event介绍
如果实现了RTC (Real Time Clock)告警,则在睡眠状态下必须产生一个硬件唤醒事件。RTC可以被编程来产生警报。启用RTC告警可以在系统处于休眠状态时产生唤醒事件。ACPI提供了额外的硬件来支持OSPM确定RTC是尾流事件的来源:RTC_STS和RTC_EN位。尽管这些位是可选的,但如果支持它们,就必须按照这里描述的方式实现它们。
如果不支持RTC_STS和RTC_EN位,OSPM将尝试识别RTC为可能的尾流源;然而,它可能会错过某些唤醒事件。如果实现了,RTC唤醒功能需要在以下睡眠状态下工作:S1-S3。S4唤醒是可选的,通过FADT中的RTC_S4标志(如果设置,则平台在S4状态下支持RTC唤醒)*来支持。
注:* G2/S5的“软关闭”和G3的“机械关闭”状态不是睡眠状态。在进入G2/S5或G3状态前,系统会关闭RTC_EN位。
当RTC生成唤醒事件时,将设置RTC_STS位。如果设置了RTC_EN位,将产生一个RTC硬件电源管理事件(它将系统从睡眠状态唤醒,如果电池低信号不触发)。
RTC唤醒ACPI单元
Fixed Hardware特性
RTC唤醒事件状态和使能位是一个可选的Fixed Hardware特性,FADT内的一个标志(FIX_RTC)表示该寄存器位是否将被OSPM使用。如果RTC唤醒事件的状态和使能位是在Fixed Hardware中实现的,则OSPM可以在不加载整个操作系统的情况下判断该RTC是否是唤醒事件的源。这也使平台能够在不消耗GPE位的情况下指示RTC尾流源,如果RTC尾流不是使用Fixed HardwareRTC特性实现的,这将是必需的。如果不支持Fixed Hardware特性事件位,那么OSPM将尝试通过读取RTC的状态字段来确定这一点。如果平台实现了RTCFixed Hardware特性,并且这个硬件消耗了资源,那么可以使用_FIX方法将这些资源与Fixed Hardware关联起来。请参阅_FIX(固定注册资源提供程序),了解详细信息。
OSPM对现有RTC设备(仅支持99年日期和24小时告警)进行了增强。可选扩展提供了以下特性:
DAY_ALRM字段指向一个可选的CMOS RAM位置,它选择一个月内的哪一天产生RTC告警。
MON_ALRM字段指向一个可选的CMOS RAM位置,该位置选择一年中产生RTC告警的月份。
Centenary值CENT字段指向一个可选的CMOS RAM位置,它代表日期(数千年和数百年)的Centenary值。
RTC_STS位可以通过RTC中断(IA-PC体系结构中的IRQ8)来设置。OSPM将确保在休眠前禁用周期性和更新中断源。这允许RTC的中断引脚作为RTC_STS位生成的源。但是请注意,如果RTC中断引脚用于生成RTC_STS,则从S4唤醒时RTC_STS位值可能不准确。如果从S4唤醒时该值是准确的,那么平台应该设置S4_RTC_STS_VALID标志,以便OSPM可以利用RTC_STS信息。
8位值,在BCD中表示0x01-0x31天,在二进制中表示0x01-0x1F天。该字段的第6位和第7位被软件视为忽略。初始化RTC,以便当平台固件从传统模式切换到ACPI模式时,该字段包含一个“don’t care”值。不关心值可以是任何未使用的值(不是0x1-0x31 BCD或0x01-0x1F十六进制),RTC将其恢复为24小时警报。
FADT中的DAY_ALRM字段将包含一个非零值,该值表示RTC的CMOS RAM区域的偏移量,该区域包含日告警值。DAY_ALRM值为0表示不支持日告警特性。CENTURY
8位BCD或二进制值。这个值表示BCD中日期的千年和百年 (Centenary)变量(本世纪19个,下个世纪20个)或二进制(本世纪x13个,下个世纪x14个)。
FADT中的CENTURY字段 将包含一个非零值,该值表示RTC的CMOS RAM区域的偏移量,该区域包含该日期的Centenary值。CENTURY字段 的值为零表示该RTC不支持百年值。
偏移值(Offset) |
数据字段的意义描述(Description) |
||||||||||||||||||||||||||||||
00h 01h 02h 03h 04h 05h 06h 07h 08h 09h |
目前系统时间的“秒数”字段 预约警铃时间的“秒数”字段 目前系统时间的“分钟”字段 预约警铃时间的“分钟”字段 目前系统时间的“小时”字段 预约警铃时间的“小时”字段 星期几(星期一=01,星期二=02,依次类推) 目前系统日期字段(0~31) 目前系统月份字段(0~12) 系统公元纪年的后两位(00~99;00=2000,01=2001,以此类推) |
||||||||||||||||||||||||||||||
0Ah |
|
||||||||||||||||||||||||||||||
0Bh |
|
||||||||||||||||||||||||||||||
0Ch |
|
||||||||||||||||||||||||||||||
0Dh |
|
||||||||||||||||||||||||||||||
0Eh |
|
||||||||||||||||||||||||||||||
0Fh |
|
10h |
|
||||||||||||||
11h~13h |
可供其他用途 |
||||||||||||||
14h |
|
||||||||||||||
15h |
传统主存储器KB数,低字节 |
||||||||||||||
16h |
传统主存储器KB数,高字节C0280h=640K |
||||||||||||||
17h |
与IBM PC 兼容的总内存KB数,低字节 |
||||||||||||||
18h |
与IBM PC 兼容的总内存KB数,高字节(最大值仅FFFF=65535=64M) |
||||||||||||||
19h~2Dh |
可供其他用途 |
||||||||||||||
2Eh |
标准CMOS RAM 加总检查值,低字节 |
||||||||||||||
2Fh |
标准CMOS RAM 加总检查值,高字节 |
||||||||||||||
30h |
与IBM PC 兼容的扩展内存KB数,低字节 |
||||||||||||||
31h |
与IBM PC 兼容的扩展内存KB数,高字节 |
||||||||||||||
32h |
公元年号除以100后的BCD字段(20h=2000~2099,跟09h字段凑成整个公元纪年) |
||||||||||||||
33h~34h |
保留未用 |
||||||||||||||
35h |
POST所检测到扩展内存K数,除以64KB后的数值(低字节) |
||||||||||||||
36h |
POST所检测到扩展内存K数,除以64KB后的数值(高字节) |
||||||||||||||
37h~3Dh |
可供其他用途 |
||||||||||||||
3Eh |
扩展CMOS加总检查值的(低字节,从34h计算到3Dh) |
||||||||||||||
3Fh |
扩展CMOS加总检查值的(高字节,从34h计算到3Dh) |
||||||||||||||
40h~7Fh |
供AMI BIOS动态配置使用 |
//UEFI代码实现
InitRTCWakeup()
1.获取Variable中设置的RTC唤醒时间
//Register RTC wakeup Handler
Status = InitSmmHandler(ImageHandle, SystemTable, InSmmFunction, NULL);
EFI_SMM_BASE2_PROTOCOL_GUID
pBS->LocateProtocol(&gLocalEfiSmmBase2ProtocolGuid, NULL, &pSmmBase);
判断当前是否在SMM模式中,然后调用
GetSmstLocation
返回 EFI_SMM_SYSTEM_TABLE2 *Smst;
会执行函数
InSmmFunction()
在S2 entry的时候执行S5的SMI callback
pSmst->gEfiSmmPowerButtonDispatch2ProtocolGuid
设置预警的CMOS寄存器
#define RTC_SECONS_ALARM 1
#define RTC_MIN_ALARM 3
#define RTC_HOUR_ALARM 5
设置wakeuptime到RTC唤醒时间寄存器上,打开RTC唤醒
void SetWakeupTime (
IN EFI_TIME *Time )
{
UINT8 Value;
WriteRtcIndex(RTC_HOUR_ALARM,Time->Hour);
WriteRtcIndex(RTC_MIN_ALARM,Time->Minute);
WriteRtcIndex(RTC_SECONDS_ALARM,Time->Second);
//Set Enable
Value = ReadRtcIndex(RTC_STATUS_REG_B);
Value |= 1 << 5;
WriteRtcIndex(RTC_STATUS_REG_B,Value);
}
PM_BASE_ADDRESS 0x800
设置RTCstatus
PMx0800 [Pm1Status] (Pm1Stat)
今天的文章
由rtc唤醒_华硕主板rtc唤醒有什么用分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/80920.html