次の方法で共有


Microsoft が提供する UEFI バッテリ充電アプリケーションのアーキテクチャ

このトピックでは、Windows 10 Mobile を実行するデバイス用に Microsoft が提供する UEFI バッテリー充電アプリケーションの設計に関する情報を提供します。 OEM は Microsoft のバッテリー充電アプリケーションを使用することも、独自の充電アプリケーションを実装することもできます。 独自の UEFI バッテリー充電アプリケーションを実装する OEM は、このトピックの情報を設計のガイドラインとして使用できます。

UEFI バッテリー充電アプリケーションはブートプロセス中に実行される Microsoft が所有する最初のアプリケーションの一つです。 UEFI バッテリー充電アプリケーションは主に以下の責任を持ちます:

  • デバイスがブートするのに十分な電力を持っていることを確認します。

  • OEM によって有効になっている場合 パワーオフ充電 サポートを提供します。 パワーオフ充電の詳細については ブート環境でのバッテリー充電 を参照してください。

UEFI バッテリー充電アプリケーションは主要な UEFI プロトコルを使い、関連するドライバから返される様々な状態に反応します。

このトピックにおける UEFI バッテリー充電アプリケーション という用語は mobilestartup.efi によってロードされる UEFI バッテリー充電ライブラリを指します。 mobilestartup.efi についての詳細は Boot と UEFI を見て下さい。

UEFI バッテリー充電アプリケーションによって使われる UEFI プロトコル

UEFI バッテリー充電アプリケーション(Microsoft によって所有されている)は次のセクションで説明するプロトコル(OEM によって実装されている)を使います。

UEFI バッテリー充電プロトコル (EFI_BATTERY_CHARGING_PROTOCOL)

以下のステップでは UEFI バッテリー充電アプリケーションが UEFI バッテリー充電プロトコルを使う方法の主要な側面について説明します:

  1. UEFIバッテリー充電アプリケーションは、バッテリーハードウェアのリアルタイムステータスをポーリングする EFI_BATTERY_CHARGING_PROTOCOL.GetBatteryInformation (のバージョン 0x00010002 をサポートするデバイスの場合 EFI_BATTERY_CHARGING_PROTOCOL) or EFI_BATTERY_CHARGING_PROTOCOL.GetBatteryStatus (EFI_BATTERY_CHARGING_PROTOCOLのバージョン0x00010001をサポートするデバイスの場合)。 これらの関数は、可能な限り正確な充電状態(SOC)値を返すことが重要です。 SOC は、バッテリーの状態(容量、電圧、温度を含む)に基づく充電量から、OEM が定義した 0 から 100 までの値へのマッピングです。

  2. OEMの定義 メインOSのしきい値へのブート (0から100までの値) . この値はデバイス・モデルによって異なる場合があります。 についての詳細は メインOSのしきい値へのブート およびその他のしきい値については ブート環境でのバッテリー充電.

  3. バッテリ充電アプリケーションはドライバからの SOC を使い Boot to Main OS しきい値 と比較して、UEFI で充電するためにブートプロセスをブロックする必要があるか、ブートを続行するかを決定します。 充電状態に関する他の情報は受け取らない。

  4. UEFI バッテリー充電アプリケーションはデバイスを充電するために EFI_BATTERY_CHARGING_PROTOCOL.ChargeBattery を呼び出し、対応する EFI_BATTERY_CHARGING_STATUS を持つ CompletionEvent が返されるのを待ちます。

このプロトコルの詳細については UEFIバッテリー充電プロトコル.

UEFI ディスプレイ電源状態プロトコル (EFI_DISPLAY_POWER_PROTOCOL)

UEFI バッテリー充電プロセスの間、UEFI バッテリー充電アプリケーションは交互に低電力 UI を表示します。 電源ボタンが押されずに 10 秒が経過すると、アプリケーションは EFI_DISPLAY_POWER_PROTOCOL.SetDisplayPowerState を呼び出してディスプレイとバックライトをオフにします。 これにより、UEFI バッテリー充電中のデバイスの消費電力を抑え、デバイスの充電とメイン OS への移行をより素早く行うことができます。 ディスプレイがオフになっている間にユーザーが電源ボタンを押すと、アプリケーションは EFI_DISPLAY_POWER_PROTOCOL.SetDisplayPowerState を再度呼び出してディスプレイをオンに戻します。 詳細については、このトピックで後述する ユーザー・エクスペリエンス を参照してください。

このプロトコルについての詳細は UEFI display power state protocol を見て下さい。

UEFI USB ファンクションプロトコル (EFI_USBFN_IO_PROTOCOL)

UEFI バッテリー充電アプリケーションは接続されているポートのタイプを決定するために EFI_USBFN_IO_PROTOCOL.DetectPort にのみ依存しています。 ポートタイプに基づいて、アプリケーションは1500mAまたは500mAのいずれかで EFI_BATTERY_CHARGING_PROTOCOL.ChargeBattery を呼び出します。

このプロトコルの詳細については UEFI USBファンクションプロトコルを参照してください。

アプリケーションの論理

次の図は UEFI バッテリー充電アプリケーションの論理的な手順を説明しています。

uefi battery charging logic.

以下のノートはロジックのいくつかの重要なセクションを拡大したものです:

  • EFI_BATTERY_CHARGING_PROTOCOL.ChargeBattery を呼び出す前に、アプリケーションは EFI_USBFN_IO_PROTOCOL.DetectPort を呼び出してUSB充電器が提供できる最大電流を決定します:

    • ポートが存在する場合、アプリケーションは専用壁面充電器には1500 mA、その他のポートには500 mAを使用します。

    • ポートが存在しない場合、アプリケーションは500 mAを使用します。 ワイヤレス充電器はこの値を無視することが期待される。

    • 充電器が存在しない場合、アプリケーションは500 mAを使用します。 ただし、アプリケーションは EFI_BATTERY_CHARGING_PROTOCOL.ChargeBatteryEfiBatteryChargingSourceNotDetected のステータスを持つ EFI_BATTERY_CHARGING_COMPLETION_TOKENを返すことを期待します。

  • どのような場合でも、OEM はデバイスと充電器が安全な動作領域内にあることを確認する必要があります。

  • デバイスにバッテリーがなく、電源が接続されている場合、アプリケーションがバッテリーを充電するために EFI_BATTERY_CHARGING_PROTOCOL.ChargeBattery を呼び出すと、UEFI バッテリー充電ドライバは EfiBatteryChargingStatusBatteryNotDetected を返すはずです。 アプリケーションは、エラー UI を表示してデバイスをシャットダウンすることで、このエラーを処理します。

  • EFI_BATTERY_CHARGING_STATUS 値は EfiBatteryChargingStatusSuccess 以外は しきい値充電 モードでも パワーオフ充電 モードでも同じように解釈されます。 これらの充電モードの詳細については ブート環境でのバッテリー充電を参照してください。

  • デバイスが充電モードにあるとき、電源を切断すると、ファームウェアは EfiBatteryChargingSourceNotDetected をアプリケーションに通知し、アプリケーションはデバイスをシャットダウンします。

  • ファームウェアが EfiBatteryChargingStatusOverheat または EfiBatteryChargingStatusTimeout のステータスをアプリケーションに通知すると、デバイスは 5 分間充電を一時停止します(ただし、アプリケーションは約 1 秒間隔で EFI_BATTERY_CHARGING_PROTOCOL.GetBatteryInformation または EFI_BATTERY_CHARGING_PROTOCOL.GetBatteryStatus を呼び出します)。 5 分後、デバイスは EFI_BATTERY_CHARGING_PROTOCOL.ChargeBattery を呼び出すことによって充電を再開します。 この 5 分間の間、ファームウェアは、適切な EFI_BATTERY_CHARGING_STATUS 値(例えば、ソースの切断は EfiBatteryChargingSourceNotDetectedをシグナルするはずです)で、アプリケーションによって提供されたイベントをシグナルすることが期待されています。

  • どちらの充電モードでも、前の図の「 Stay in app 」と書かれたボックスの中に、関連するアニメーション UI が表示されます。

  • 電源オフ充電 モードでは、ファームウェアがイベントをシグナルして EfiBatteryChargingStatusSuccess のステータスを提供した場合、UEFI バッテリー充電アプリケーションはユーザーが電源ボタンを 3 秒間押し続けるまでメイン OS にブートしません。 しかし、この時点で 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 再起動 再起動

次の表は EFI_BATTERY_CHARGING_PROTOCOL.GetBatteryInformation または EFI_BATTERY_CHARGING_PROTOCOL.GetBatteryStatus から受け取ったステータス値に対する UEFI バッテリー充電アプリケーションの反応を示しています。

状態 しきい値充電モード パワーオフ充電モード(充電状態がしきい値に達する前と後)
EFI_SUCCESS。
エラーが検出されなかった場合、この値が返されます。
適用なし 適用なし
EFI_INVALID_PARAMETER。
入力パラメータが正しくない場合にこの値が返される。 本番環境では理論上、このようなことは起こりえないはずです。
エラーUIを10秒間表示した後、シャットダウンする エラーUIを10秒間表示した後、シャットダウンする
EFI_DEVICE_ERRORまたはEFI_NOT_READY。
これらのエラー条件も同様に処理されます。 これらの値は、何らかのデバイス・エラーによってデバイスがメインOSにブートできない場合に EFI_BATTERY_CHARGING_PROTOCOL.GetBatteryInformation または EFI_BATTERY_CHARGING_PROTOCOL.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 をスクリーンに描画するかを示しています。

battery charging user experience.

以下のステップでは、アプリケーションがどのように UI をスクリーンに描画するかを説明します:

  • アプリケーションは、フレーム内のすべてのピクセルに背景の塗りつぶし色を書き込むことで、画面をクリアします。

  • アプリケーションは、ビットマップバッファからディスプレイに直接ピクセルをコピーすることで、交互に低バッテリーUIビットマップを描画します。 電源ボタンが押されずに10秒が経過すると、アプリケーションは EFI_DISPLAY_POWER_PROTOCOL.SetDisplayPowerState を呼び出してディスプレイとバックライトをオフにします。 ユーザーが電源ボタンを押すと、EFI_DISPLAY_POWER_PROTOCOL.SetDisplayPowerStateが呼び出され、ディスプレイがオンに戻ります。

  • アプリケーションがドライバからエラーを受信すると、アプリケーションはフレーム・バッファ内の各ピクセルに背景の塗りつぶし色を書き込むことによって画面を消去し、適切なビットマップ・バッファからディスプレイに直接ピクセルをコピーすることによってバッテリ・エラー画面を描画します。