Microsoft 提供的 UEFI 電池充電應用程式的架構

本主題提供 Microsoft 針對執行 Windows 10 行動裝置版 的裝置所提供 UEFI 電池充電應用程式設計的相關資訊。 OEM 可以使用 Microsoft 的電池充電應用程式,也可以實作自己的充電應用程式。 實作自己的 UEFI 電池充電應用程式的 OEM 可能會使用本主題中的資訊作為其設計的指導方針。

UEFI 電池充電應用程式是開機程式期間執行的第一個 Microsoft 擁有應用程式之一。 UEFI 電池充電應用程式具有下列主要責任:

  • 請確定裝置有足夠的電源可開機。

  • 如果 OEM 啟用,請提供 電源關閉充電 支援。 如需電源關閉充電的詳細資訊,請參閱 開機環境中的電池充電

UEFI 電池充電應用程式會使用金鑰 UEFI 通訊協定,並回應相關驅動程式所傳回的各種狀態。

本主題中的 UEFI 電池充電應用程式 一詞是指 mobilestartup.efi 所載入的 UEFI 電池充電程式庫。 如需 mobilestartup.efi 的詳細資訊,請參閱 開機和 UEFI

UEFI 電池充電應用程式所使用的 UEFI 通訊協定

Microsoft) 所擁有的 UEFI 電池充電 (應用程式會使用 OEM 所實作的通訊協定 (,) 下列各節所討論。

UEFI 電池充電通訊協定 (EFI_BATTERY_CHARGING_PROTOCOL)

下列步驟說明 UEFI 電池充電應用程式如何使用 UEFI 電池充電通訊協定的重要層面:

  1. UEFI 電池充電應用程式會使用EFI_BATTERY_CHARGING_PROTOCOL輪詢電池硬體的即時狀態 。支援 EFI_BATTERY_CHARGING_PROTOCOL) 或EFI_BATTERY_CHARGING_PROTOCOL版本 0x00010002 裝置中的 GetBatteryInformation (。支援EFI_BATTERY_CHARGING_PROTOCOL) 版本0x00010001裝置中的 GetBatteryStatus (。 請務必盡可能傳回收費 (SOC) 值的精確狀態。 SOC 是 OEM 定義的對應,根據電池的狀態 (包括容量、電壓和溫度) 到從 0 到 100 的值。

  2. OEM 會定義 開機到主要 OS 閾值 , (從 0 到 100) 的值。 對於不同的裝置型號,此值可能不同。 如需 開機至主要 OS 閾值 和其他閾值的詳細資訊,請參閱 開機環境中的電池充電

  3. 電池充電應用程式會使用驅動程式的 SOC,並將它與 開機到主要 OS 閾值 進行比較,以判斷它是否需要封鎖開機程式,才能在 UEFI 中充電或繼續開機。 它不會收到任何有關收費狀態的其他資訊。

  4. UEFI 電池充電應用程式會呼叫 EFI_BATTERY_CHARGING_PROTOCOL。ChargeBattery為裝置收費,並等候會傳回對應EFI_BATTERY_CHARGING_STATUSCompletionEvent

如需此通訊協定的詳細資訊,請參閱 UEFI 電池充電通訊協定

UEFI 顯示電源狀態通訊協定 (EFI_DISPLAY_POWER_PROTOCOL)

在 UEFI 電池充電過程中,UEFI 電池充電應用程式會顯示替代的低電量 UI。 在 10 秒後未按下電源按鈕,應用程式會 呼叫 EFI_DISPLAY_POWER_PROTOCOL。SetDisplayPowerState 可關閉顯示器和倒光燈。 這可協助裝置在 UEFI 電池充電期間耗用較少的電源,這可協助裝置更快速地充電並繼續進行主要 OS。 如果使用者在關閉顯示器時按下電源按鈕,應用程式會呼叫 EFI_DISPLAY_POWER_PROTOCOL。再次設定DisplayPowerState 以重新開啟顯示器。 如需詳細資訊,請參閱本主題稍後的 使用者體驗

如需此通訊協定的詳細資訊,請參閱 UEFI 顯示電源狀態通訊協定

UEFI USB 函式通訊協定 (EFI_USBFN_IO_PROTOCOL)

UEFI 電池充電應用程式僅依賴 EFI_USBFN_IO_PROTOCOL。DetectPort 可判斷連接的埠類型。 根據埠類型,應用程式會 呼叫 EFI_BATTERY_CHARGING_PROTOCOL。具有 1500 mA 或 500 mA 的 ChargeBattery。

如需此通訊協定的詳細資訊,請參閱 UEFI USB 函式通訊協定

應用程式邏輯

下圖說明 UEFI 電池充電應用程式的邏輯程式。

uefi 電池充電邏輯。

下列附注會展開邏輯的一些主要區段:

  • 呼叫 EFI_BATTERY_CHARGING_PROTOCOL 之前。ChargeBattery,應用程式會 呼叫 EFI_USBFN_IO_PROTOCOL。DetectPort ,以判斷 USB 充電器可以提供的最大目前:

    • 如果有埠存在,應用程式會使用 1500 mA 作為專用牆電池,或針對其他埠使用 500 mA。

    • 如果沒有埠存在,應用程式會使用 500 mA。 無線充電器預期會忽略此值。

    • 如果不存在任何殭水,則應用程式會使用 500 mA。 不過,應用程式需要EFI_BATTERY_CHARGING_PROTOCOL。ChargeBattery傳回狀態為EfiBatteryChargingSourceNotDetectedEFI_BATTERY_CHARGING_COMPLETION_TOKEN

  • 在所有情況下,OEM 都必須確保裝置和電池保持在安全的作業區域內。

  • 如果裝置中沒有電池,但有連線的電源,當應用程式呼叫 EFI_BATTERY_CHARGING_PROTOCOL時。ChargeBattery 若要充電電池,UEFI 電池充電驅動程式應該會傳回 EfiBatteryChargingStatusBatteryNotDetected。 應用程式會藉由顯示錯誤 UI 並關閉裝置來處理此錯誤。

  • 除了EfiBatteryChargingStatusSuccess以外,EFI_BATTERY_CHARGING_STATUS值會以相同方式解譯閾值充電關閉電源充電模式。 如需這些充電模式的詳細資訊,請參閱 開機環境中的電池充電

  • 當裝置處於充電模式時,電源中斷連線預期會導致韌體使用 EfiBatteryChargingSourceNotDetected向應用程式發出訊號,這會導致應用程式關閉裝置。

  • 如果韌體向應用程式發出 狀態為 EfiBatteryChargingStatusOverheatEfiBatteryChargingStatusTimeout的訊號,則裝置會暫停充電 5 分鐘 (,但應用程式仍 會呼叫 EFI_BATTERY_CHARGING_PROTOCOL。GetBatteryInformationEFI_BATTERY_CHARGING_PROTOCOL。GetBatteryStatus 大約以 1 秒的間隔) 。 5 分鐘之後,裝置會呼叫 EFI_BATTERY_CHARGING_PROTOCOL 繼續充電 。ChargeBattery。 在這 5 分鐘內,韌體仍預期會以適當的 EFI_BATTERY_CHARGING_STATUS 值 (向應用程式提供的事件發出訊號,例如,來源中斷連線應該發出 EfiBatteryChargingSourceNotDetected) 的訊號。

  • 在這兩種充電模式中,都會在標示為 [停留在應用程式] 的方塊中顯示相關的動畫 UI。

  • 關閉電源充電 模式中,如果韌體已發出事件訊號,並提供 EfiBatteryChargingStatusSuccess的狀態,則 UEFI 電池充電應用程式不會開機到主要 OS,直到使用者保留電源按鈕 3 秒為止。 不過,如果應用程式偵測到 USB 纜線目前已中斷連線,則會關閉裝置電源。 UEFI 電池充電應用程式預期驅動程式會在 電源關閉充電模式中完全維持電池。

  • 關閉電源充電模式中,只要韌體未發出錯誤或成功事件訊號,UEFI 電池充電應用程式就不會關閉裝置電源。

錯誤處理

每次 EFI_BATTERY_CHARGING_PROTOCOL。會呼叫 ChargeBattery ,並指定 EFI_BATTERY_CHARGING_COMPLETION_TOKEN 。 如果驅動程式遇到錯誤,權杖中的事件會以 EFI_BATTERY_CHARGING_STATUS發出訊號。 下表說明 UEFI 電池充電應用程式在不同情況下如何回應不同的狀態值。

狀態 閾值充電模式 電源關閉充電模式 (在充電狀態達到閾值)
EfiBatteryChargingStatusNoneNone 不預期/無效 不預期/無效
EfiBatteryChargingStatusSuccess 開機至 OS 在收費狀態達到閾值之前: 在關閉電源充電模式中繼續。 在收費狀態達到臨界值之後: 保持關閉電源充電模式,直到 USB 中斷連線為止。
EfiBatteryChargingStatusOverheat 暫停充電 5 分鐘,然後繼續充電 暫停充電 5 分鐘,然後繼續充電
EfiBatteryChargingStatusVoltageOutOfRange 開機至 OS 開機至 OS
EfiBatteryChargingStatusCurrentOutOfRange 開機至 OS 開機至 OS
EfiBatteryChargingStatusTimeout 暫停充電 5 分鐘,然後繼續充電 暫停充電 5 分鐘,然後繼續充電
EfiBatteryChargingStatusAborted 顯示錯誤 UI 10 秒,然後關閉 顯示錯誤 UI 10 秒,然後關閉
EfiBatteryChargingStatusDeviceError 顯示錯誤 UI 10 秒,然後關閉 顯示錯誤 UI 10 秒,然後關閉
EfiBatteryChargingStatusExtremeCold 顯示錯誤 UI 10 秒,然後關閉 顯示錯誤 UI 10 秒,然後關閉
EfiBatteryChargingStatusBatteryChargingNotSupported 顯示錯誤 UI 10 秒,然後關閉 顯示錯誤 UI 10 秒,然後關閉
EfiBatteryChargingStatusBatteryNotDetected 顯示錯誤 UI 10 秒,然後關閉 顯示錯誤 UI 10 秒,然後關閉
EfiBatteryChargingSourceNotDetected 關機 關機
EfiBatteryChargingSourceVoltageInvalid 顯示錯誤 UI 10 秒,然後關閉 顯示錯誤 UI 10 秒,然後關閉
EfiBatteryChargingSourceCurrentInvalid 顯示錯誤 UI 10 秒,然後關閉 顯示錯誤 UI 10 秒,然後關閉
EfiBatteryChargingErrorRequestShutdown 關機 關機
EfiBatteryChargingErrorRequestReboot 重新啟動 重新啟動

下表說明 UEFI 電池充電應用程式如何回應從EFI_BATTERY_CHARGING_PROTOCOL接收的狀態值 。GetBatteryInformationEFI_BATTERY_CHARGING_PROTOCOL。GetBatteryStatus

狀態 臨界值充電模式 電源關閉充電模式 (在收費狀態達到臨界值之後)
EFI_SUCCESS。
當偵測到任何錯誤時,就會傳回此值。
不適用 不適用
EFI_INVALID_PARAMETER。
當輸入參數不正確時,會傳回此值。 這在生產環境中應該不可能。
顯示錯誤 UI 10 秒,然後關閉 顯示錯誤 UI 10 秒,然後關閉
EFI_DEVICE_ERROR或EFI_NOT_READY。
這些錯誤狀況的處理方式相同。 這些值應該由 EFI_BATTERY_CHARGING_PROTOCOL 傳回 。GetBatteryInformationEFI_BATTERY_CHARGING_PROTOCOL。如果 裝置因為某些裝置錯誤而無法開機到主要 OS,GetBatteryStatus。 尤其是:

EfiBatteryChargingStatusAborted
EfiBatteryChargingStatusDeviceError
EfiBatteryChargingStatusExtremeCold
EfiBatteryChargingStatusBatteryChargingNotSupported
EfiBatteryChargingStatusBatteryNotDetected
EfiBatteryChargingSourceVoltageInvalid
EfiBatteryChargingSourceCurrentInvalid
EfiBatteryChargingErrorRequestShutdown
EfiBatteryChargingErrorRequestReboot。

擲回EFI_DEVICE_ERROR或EFI_NOT_READY後面接著上述其中一個錯誤的完成權杖,會導致裝置最終關閉。
繼續並呼叫 EFI_BATTERY_CHARGING_PROTOCOL。ChargeBattery 繼續並呼叫 EFI_BATTERY_CHARGING_PROTOCOL。ChargeBattery

使用者體驗

下圖顯示 UEFI 電池充電應用程式如何在電池中沒有足夠的電量,或裝置處於 關閉電源充電模式時,將 UI 繪製到畫面。

電池充電使用者體驗。

下列步驟說明應用程式如何將 UI 繪製到畫面:

  • 應用程式會藉由將背景填滿色彩寫入畫面中的每個圖元,以清除畫面。

  • 應用程式會直接將點陣圖緩衝區中的圖元複製到顯示器,以繪製替代的低電池 UI 點陣圖。 如果在未按下電源按鈕的情況下通過 10 秒,應用程式會呼叫 EFI_DISPLAY_POWER_PROTOCOL。SetDisplayPowerState 可關閉顯示器和回光。 如果使用者按下電源按鈕,EFI_DISPLAY_POWER_PROTOCOL。系統會呼叫 SetDisplayPowerState 來重新開啟顯示。

  • 當應用程式從驅動程式收到錯誤時,應用程式會將背景填滿色彩寫入畫面緩衝區中的每個圖元,然後應用程式會直接從適當的點陣圖緩衝區將圖元複製到顯示器來繪製電池錯誤畫面。