由rtc唤醒_华硕主板rtc唤醒有什么用

由rtc唤醒_华硕主板rtc唤醒有什么用如果RTC唤醒事件的状态和使能位是在FixedHardware中实现的,则OSPM可以在不加载整个操作系统的情况下判断该RTC是否是唤醒事件的源

RTC(Real-Time Clock,实时时钟)唤醒是一种低功耗的唤醒机制,它允许计算机系统在待机或睡眠状态下通过RTC定时器来唤醒。下面是RTC唤醒的基本原理:

  1. RTC硬件: 计算机系统中的RTC硬件是一个独立的芯片或模块,用于提供实时时钟和日历功能。它通常由一个晶体振荡器和相关的计数器组成。

  2. RTC定时器设置: 在计算机系统进入待机或睡眠状态之前,操作系统或BIOS可以通过编程设置RTC定时器的触发时间。这个触发时间可以是一个具体的日期和时间,也可以是相对于当前时间的一段时间间隔。

  3. 进入待机或睡眠状态: 当计算机系统进入待机或睡眠状态时,大部分硬件设备会被关闭或进入低功耗模式,以节省能源。但RTC仍然保持运行,并继续计时。

  4. RTC定时器触发: 当RTC定时器的计数器达到预设的触发时间时,它会产生一个唤醒信号,通知系统唤醒。

  5. 系统唤醒: 在接收到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唤醒_华硕主板rtc唤醒有什么用

RTC唤醒ACPI单元

Fixed Hardware特性

由rtc唤醒_华硕主板rtc唤醒有什么用

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

Status Register A(状态寄存器A

Bit7

指示位。0=目前可读取日期/时间,1=日期/时间更新中,稍后读取

Bit6-4

计时频率除法器的填值,BIOS默认为010b,指定32.768KHz的计数频率

Bit3-0

设置闹钟警示中断频率。BIOS默认为1024Hz,每次中断间隔为1/1024秒

0Bh

Status Register B(状态寄存器B

Bit7

停止系统频率设定时间(0=直接设定时间,实时系统仍在计时状态)(1=停止CRT计时并设定时间)

Bit6

周期性中断(0=Disable,1=Enable)

Bit5

Alarm Interrupt(0=Disable,1=Enable)

Bit4

Update-Ended Interrupt(0=Disable,1=Enable)

Bit3

Square wave 方波设定(0=关掉方波,1=依Status Reg A 设定产生方波)

Bit2

Date and Time Mode (0=使用BCD格式,为默认值。1=binary二进制值)

Bit1

24 或 12 小时计时制(0=指定12小时制,1=设定24小时制)

Bit0

日光节约时间(0=Disable,1=Enable)

0Ch

Status Register C(状态寄存器C),以下为只读状态

Bit7

IRQ Flag (read-only)

Bit6

Periodic Interrupt Flag (read-only)

Bit5

Alarm Interrupt Flag (read-only)

Bit4

Update Interrupt Flag (read-only)

Bit3-0

保留未用,应该设为 0。

0Dh

Status Register D(状态寄存器D

Bit7

CMOS RAM内容合法(0=CMOS电池储电量偏低,RAM内容正常)(0=CMOS电池储电量偏低,RAM内容异常)

Bit6-0

保留未用,应该设为 0。

0Eh

Diagnostic Status(诊断状态记录值)

Bit7

CMOS/RTC芯片电源(0=电源正常,1=电源不正常)

Bit6

CMOS RAM checksum加总检查值状态(0=检查值正常,1=检查值不符)

Bit5

CMOS RAM组态(0=CMOS记录的组态与目前检测到的一致,1=组态不一致)

Bit4

CMOS RAM 记录的内存状态(0=CMOS记录的内存跟目前检测到的一致,1=组态不一致)

Bit3

硬盘C:起始状态(0=启动通过,准备boot。1=硬盘C:启动失败,无法boot)

Bit2

时间状态指示(0=记录时间正常。1=记录时间异常)

Bit1-0

保留未用,应该设为 0。

0Fh

 

shutdown status byte 当机复位指示字节,指示值如下:

00h

软件或其他不知名状态下的复位(reset)

01h

正在真实/保护模式下检查内存时发生reset或者重新进入真实模式下做芯片组initialization时发生reset

02h

在真实/保护模式下内存家传通过后的系统复位

03h

在真实/保护模式下内存家传通失败的系统复位

04h

通过INT 19h重新开机(boot)

05h

清除键盘中断(产生一个EOI信号)并且跳到40h:0067h记录的跳跃位置

06h

在保护模式下完成所有测试后的系统复位或在未产生EOI信号下跳到40h:0067h记录的跳跃位置

07h

在保护模式下没有通过所有测试后的系统复位

08h

由POST切到保护模式下进行内存家测时所使用

09h

由BIOS INT 1h 的 AH=”87h”(区块移动功能)所使用

0Ah

返回并跳跃到40h:0067h记录的程序进入点地址

0Bh

以IRET方式回到40h:0067h记录的程序进入点

0Ch

以RETF方式回到40h:0067h记录的程序进入点

0Dh-FFh

系统电源刚打开时的复位

10h

 

 

软驱类型

00

None

01

360K 5.25 in.

02

1.2M 5.25 in.

30

720K 3.5 in.

40

1.44M 3.5 in.

50

2.88M 3.5 in.

11h~13h

可供其他用途

14h

Bits7-6

软盘驱动器数目(00=1 Drive,01=2 Drives)

Bits5-4

Monitor Type 显示器型号(00=Monochrome,01=40*25 CGA,10=80*25 CGA,11=VGA/EGA)

Bit3

显示功能位(0=不显示,1=启用并显示))

Bit2

键盘功能位(0=关掉键盘,1=启用键盘)

Bit1

协处理器(x87)(0=不具备FPU,1=具备)

Bit0

软盘机Drive(0Disabled,1=Enabled)

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唤醒时间

由rtc唤醒_华硕主板rtc唤醒有什么用

 //Register RTC wakeup Handler

    Status = InitSmmHandler(ImageHandle, SystemTable, InSmmFunction, NULL);

EFI_SMM_BASE2_PROTOCOL_GUID

pBS->LocateProtocol(&gLocalEfiSmmBase2ProtocolGuid, NULL, &pSmmBase);

由rtc唤醒_华硕主板rtc唤醒有什么用判断当前是否在SMM模式中,然后调用由rtc唤醒_华硕主板rtc唤醒有什么用

 GetSmstLocation

返回 EFI_SMM_SYSTEM_TABLE2    *Smst;

会执行函数

InSmmFunction()

在S2 entry的时候执行S5的SMI callback

由rtc唤醒_华硕主板rtc唤醒有什么用

pSmst->gEfiSmmPowerButtonDispatch2ProtocolGuid

由rtc唤醒_华硕主板rtc唤醒有什么用

设置预警的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唤醒有什么用由rtc唤醒_华硕主板rtc唤醒有什么用

今天的文章
由rtc唤醒_华硕主板rtc唤醒有什么用分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/80920.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注