RTC Wakeup的秘密

RTC 是一个 Wake Up source,因此可以用它来设置一个时间,每天的那个时间都会自动进行唤醒。
同样,使用这样的原理,可以编写一个 Long run 的测试工具让系统不断关机然后启动,这样可以用来完成 S5 的loop 测试。

具体操作:
1. 进入 Setup 打开 RTC Wake 功能,设置一个唤醒时间,比如:0:5:0
2. 进入系统(UEFI Shell 或者 Windows)之后,重置时间到 0:0:0
3. 关机

之后静静等待,过一会就能唤醒了(RTC 到 0:5:0)。需要特别注意的是:时间不要超过你设定的唤醒时间,比如上面例子中,没有步骤二,结果关机时已经是0:6:0,那么只能等接近24小时才有机会唤醒了;此外,如果你在Win10中手工实验上述动作时发现无法唤醒,很可能的原因是第三步直接使用菜单关机。实际上Win10是做的S4,只有ctrl关机才是真正S5,这里可以从80 Port输出是否为 0005 看出来。

产生这个现象的原因是许多IBV 只在 S5 的SMI相关代码中设置 RTC Wake 相关寄存器,如果按照S4的流程运行就不会跑到其中,因此也无法做到 RTC 唤醒。

EFI_STATUS
SxSleepEntryCallBack (
  IN  EFI_HANDLE                    DispatchHandle,
  IN  CONST VOID                    *DispatchContext,
  IN  OUT VOID                      *CommBuffer,
  IN  OUT UINTN                     *CommBufferSize
  )

 

个人感觉这个应该不是什么 bug ,因为最开始 S4 和 S5 相对独立,哪知道后面 ms 为了更好的用户体验将他们混合在一起----对于普通用户来说,他们甚至无法得知当前究竟进入的是哪个睡眠状态。

当然,随着时代的发展, S3/S4/S5 即将成为历史,BIOS 工程师会在痛苦中迎接 Connected Standby 的到来,亦如当时 S3/S4 的到来带来的痛苦一样.......

《RTC Wakeup的秘密》有4个想法

  1. 您好:

    想請教您文中提到"许多IBV 只在 S5 的SMI相关代码中设置 RTC Wake 相关寄存器",這個SMI是由ACPI發出的嗎?
    如果是的話,當按下關機按鈕或是從開始選單選擇關機後,由ACPI內部的哪個部份產生SMI呢?

    謝謝

  2. 您好:
    謝謝您的回覆,我查詢PI spec內 7.8 MM Power Button Dispatch Protocol,想請教這類的
    SMI中斷是電源鍵按下就會自動發生,還是需要在port 0xb2寫入一個值來觸發呢?

    謝謝

发表回复

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