ソフトウェア定義バッテリー
Note
一部の情報はリリース前の製品に関する事項であり、正式版がリリースされるまでに大幅に変更される可能性があります。 Microsoft はここに示されている情報について、明示か黙示かを問わず、一切保証しません。
はじめに
このトピックの目的は、ソフトウェア定義バッテリー (SDB) を導入し、Windows SDB アーキテクチャについて説明し、この機能の Windows API と DDI コントラクトについて詳しく説明することです。
このトピックでは、最初に仮想的な 2 つのバッテリー システム用の Simple Age Balancing SDB アルゴリズムを導入します。 その後、SDB アルゴリズムを実装するために必要なアーキテクチャ レイアウトと API コントラクトが続きます。
分類
BattC - バッテリー クラス ドライバー
CAD - Charge Arbitration Driver (CAD) は、USB レガシー、USB Type-C、ワイヤレス充電ソースの間で電力を調整する Microsoft ドライバーです
コールド スワップ対応バッテリー - ブラウンアウトや完全停電のリスクなしにシステムから取り外すことができないバッテリー
サイクル数 - ACPI 仕様で説明されているように、バッテリーによって実行される完全な充放電サイクルの数
ホット スワップ対応バッテリー - システムの動作中に安全に取り外すことができるバッテリーで、ブラウンアウトのリスクはありません
HPMI - ハードウェアの電源管理インターフェイス
ホット スワップ非対応バッテリー - システムにインストールされた、1 つ以上のコールド スワップ対応およびスワップ非対応バッテリー
スワップ非対応バッテリー - エンド ユーザーが設計および削除することを意図していないバッテリー
SDB の概要
ソフトウェア定義バッテリーに関する MSR の研究論文は次のとおりです : https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf
このトピックでは、このホワイト ペーパーで説明されている一部のアイデアを再評価し、ノート PC やその他のモバイル デバイスでソフトウェア ベースのバッテリー使用時間の分散機能を製品化するビューを示します。
2 つのバッテリー システムを想像してください。 1 つのバッテリーが SAC の隣に位置する取り外しができないバッテリーである場合は、この内蔵バッテリーを呼び出しましょう。 もう 1 つのバッテリーは、取り外しができるキーボードの横に位置するホット スワップ対応バッテリーです - この外部バッテリーを呼び出しましょう。
マルチ バッテリー システム
キーボードが一定期間にわたって取り外され、2 つのバッテリーの経年劣化が強制的に異なります。 これにより、SDB 単純な年齢分散アルゴリズムを使用して、バッテリーの年齢のバランスを取り、システムの使いやすさ期間を延長するためのスコープが作成されます。
Simple Age Balancing SDB アルゴリズム
このアルゴリズムは、バッテリーの経過時間のバランスを取ろうとするため、単純なエージングバランスと呼ばれます。 シンプルなエージングバランスアルゴリズムにより、システムは、最も古くなったバッテリーを放電することを好みます。 サイクル数が少ないバッテリーは、電力を保持する容量が多いだけでなく、一般的に電力を供給する際の効率も向上します。 これにより、システムがバッテリーで維持できる時間を延長します。
Simple Age Balancing SDB アルゴリズム
単純な年齢分散アルゴリズムの背後にある基本的な考え方は、上記のフローチャートの意思決定ボックス (2) に示すように、最小のバッテリー サイクル数を発生させたバッテリーを使用することです。 この例の架空のシステムでは、内部または外部のバッテリーを排他的に使用できます。 ただし、これはすべてのシステムに当てはまるとは言えない場合があります。 他のシステムは、柔軟性がない場合や、バッテリーの使用に電気的制約がある場合があります。 このような場合、アルゴリズムは年齢のバランスを取る最善の試みを期待します。 たとえば、次の SSML を考えてみましょう。
外部バッテリーでのみ電源を維持できないシステム (外部バッテリーが補助電源のみに設計されている可能性があります)。 このシステムは、上記フローチャートのプロセスブロック(A)内の内部電池と外部バッテリーの両方を同時に放電することによって単純な年齢バランスアルゴリズムを実装し得る。
外部バッテリーが存在する場合は常に外部バッテリーを使用する必要があるシステム (リムーバブル キーボードの電源をオンに保つことに関連する追加の電力の描画が原因である可能性があります): このシステムは、上記のフローチャートのプロセス ブロック (B) 内の内部バッテリーと外部バッテリーの両方を同時に放電することによって、単純な年齢バランスアルゴリズムを実装できます。
シンプルな年齢バランスアルゴリズムは、システムを実行するのに十分な充電が内部および外部バッテリーに存在する場合にのみ使用するように配置することができ、決定ボックス(1)は、上記のフローチャートにチェックこの状態を示しています。 たとえば、外部バッテリーに充電がない場合(もう一度仮定のシステムに戻る)、バッテリーのバランスを取る年齢の範囲がなく、デシジョンボックス(1)は"NO"ブランチになります。
OEM は、内部または外部のバッテリーの電源が切れている場合に加えて、単純な年齢バランス アルゴリズムが有効にならない場合に、制約と条件を自由に選択できます。 たとえば、OEM は、次の場合に年齢の分散を実行しないことを選択できます。
- SOC/プロセッサがハイ パフォーマンス モードで実行されている
- システムが熱的に不安定である
単純な年齢分散アルゴリズムが使用されていない場合 (上記の 1 つ以上の条件のため)、ロジックは、上記のフローチャートのプロセス ボックス (3) で示されているように OEM の独自のバッテリー使用ポリシーに戻ります。 プロセス ボックス (3) は、SDB がサポートされていない場合に OEM が有効になったロジックです。
ホットスワップ可能なバッテリーで使用する SDB アルゴリズムの適応
単純な年齢分散 SDB アルゴリズムは、最も健康的なバッテリーの使用を試みますが、この戦略は長期的なバッテリー寿命を向上させるために適切に機能しますが、次のシナリオで説明するように、システムの短期的な使いやすさに深刻な影響を与える可能性があります。
上記の 2 つのバッテリー システムでは、次の状況を考慮してください。
ユーザーは、内部バッテリーと外部バッテリーの両方の充電が使い果たされるまで、十分な時間システムを使用することが期待されます。
外部バッテリーは、内部バッテリーと比較して、より多くの期限切れになっています。
このシステムで単純な年齢分散アルゴリズムが実行されると、最初に内部バッテリーに格納されている充電を使い果たそうとします (上記の条件 #1 と #2 に基づきます)。 ユーザーがしばらくして外部バッテリーを取り外すと、内部バッテリーが使い果たされるため、外部バッテリーを取り外すと、使用可能なバッテリー容量が大幅に減少するため、ユーザーエクスペリエンスが低下します。
SDB 以外のシステムでは、ほとんどの場合、内部バッテリーを使用する前に外部バッテリーが使い果たされるため、この問題は一般的に発生しません。
したがって、上記のシナリオが発生する可能性が高い場合は、単純な年齢分散アルゴリズムを選択的に無効にすることが望まれます。
要約すると、ユーザーが外部バッテリーを取り外して長時間システムを使用することが予想される場合は常に、SDB アルゴリズムを無効にし、OEM バッテリー使用ポリシーの使用に戻すのが最適です (通常は外部バッテリーを最初に使用することをお勧めします)。
Windows では、バッテリーの可用性が計算され、「ホット スワップ不可能なバッテリーの保持」ヒントが生成されます。 次のフロー図のデシジョン ボックス (X) に示すように、このヒントが SDB アルゴリズムによって使用される場合。
ホットスワップ可能なバッテリーに適合したシンプルな年齢バランスSDBアルゴリズム
ファームウェアでの SDB アルゴリズムの実装
このセクションでは、システム ファームウェアに実装されている完全なバッテリー放電制御ロジックを示します。 これは、既存のマルチバッテリー放電ロジック ((Y) ブロックでマークされた) を組み込む方法を示すために、前述のバッテリーエージバランスロジックに基づいています。
これは、OEM によって SDB アルゴリズムを実装する方法の処方箋ではなく、SDB の動作を示すために使用されるこのセクションで説明されている単純で仮定的なマルチバッテリー デバイスの包括的な例であることに注意してください。
Simple Age Balancing SDB アルゴリズムの完全なファームウェア実装
パワースタックアーキテクチャ
このセクションでは、電源スタックに参加しているすべてのコンポーネントのコンポーネント レイアウトと、相互の相対的な関係について説明します。
バッテリー ミニポート
バッテリー ミニポート インターフェイスはメイン同じです。
SDB インターフェイスは、ACPI/CmBatt メカニズムに依存したり、独自のミニポートを開発したりする OEM の要望に影響を与えたりしません。
Windows では、すべてのIOCTL_BATTERY_Standard Edition T_INFORMATION コマンドが、システムに列挙されているすべてのバッテリー デバイスに転送されます。
HPMI
ハードウェア Power Manager インターフェイス (HPMI) は、電源スタックに導入された新しいコンポーネントです。
HPMI は、OEM/デバイスの製造元によって開発および所有されているドライバーです。
HPMI には、基になるハードウェアの構成と状態に関する詳しい知識があり、システム ファームウェアにアクセスできます。
SDB 機能を実装するために、HPMI ドライバーは次の操作を行います。
- Windows に登録します。
- SDB サポートをアドバタイズします。
- Windows によって提供される SDB 制御パラメーターを使用します。
今後、HPMI インターフェイスを実装するには、SDB をサポートするマルチバッテリー システムが必要です。 HPMI API プロトコルは、複数のバッテリー システムを実装するための新しい標準です。
今後、他の充電、放電、充電管理機能をサポートするためにHPMIが更新される予定です。
ドライバーの特性
システム上に HPMI ドライバーのインスタンスを 1 つ以上存在させる必要はありません。 HPMI は、ユーザー モードまたはカーネル モード ドライバーとして実装できます。
インストール
HPMI は、ACPI デバイスとして表示されるか、OEM の裁量で他の OEM サービス/ドライバーのいずれかによってルート列挙される場合があります。
SDB アルゴリズムの実装
次の図は、ファームウェア コンポーネントが既に大量のバッテリー制御ロジックをホストしている場合に SDB アルゴリズムを実装する方法の 2 つの例を示しています。
HPMI が SDB アルゴリズムを実装する
HPMI は SDB アルゴリズムを実装することを選択できます。これには HPMI がファームウェアに充放電ヒントを転送する必要があります。
ファームウェアで SDB アルゴリズムを実装する
または、HPMI はフォワーダーとして機能し、上の図に示すように、SDB アルゴリズムが実装されているファームウェアに Windows バッテリー使用率のヒントを転送するだけです。 このモデルの使用を推奨する理由は次のとおりです:
SDB アルゴリズムの実装に必要な情報は、すぐに入手できます。この情報を HPMI に渡す必要はありません
SDB アルゴリズムは、マルチ バッテリー システムに既に実装されている放電ロジックの拡張機能です
SDB アルゴリズムの実装方法を示す完全なフローチャート モデルについては、「ファームウェアでの SDB アルゴリズムの実装」をご参照ください。
インターフェイス定義
HPMI デバイス用の新しいデバイス インターフェイス クラス GUID が導入されました。 HPMI デバイスは、デバイス インターフェイス クラスを実装するものとして自身を識別する必要があります。 詳細については、「WDK でのデバイス インターフェイスの使用」をご参照ください。
Windows では、HPMI デバイスのクエリと構成にデバイス到着通知が使用されます。
//
// HPMI Device Interface Class.
//
// {DEDAE202-1D20-4C40-A6F3-1897E319D54F}
DEFINE_GUID(GUID_DEVINTERFACE_HPMI,
0xdedae202, 0x1d20, 0x4c40, 0xa6, 0xf3, 0x18, 0x97, 0xe3, 0x19, 0xd5, 0x4f);
HPMI は、複数の同時 IOCTL 呼び出しを処理できる必要があります。
デバイス インデックスは 0 に設定する必要があることにご注意ください。
機能の検出
IOCTL_HPMI_QUERY_CAPABILITIES は、HPMI でサポートされている機能を検出するために使用されます。 IOCTL_HPMI_QUERY_CAPABILITIESは必要な IOCTL です。
Windows は、新しい HPMI ドライバー インスタンスが検出された後、この IOCL を HPMI に 1 回発行します。
//
// Query command sent to HPMI to query features supported by HPMI and Windows
// services requested by HPMI.
//
// This IOCTL may be issued multiple times, HPMI must respond with same
// information in HPMI_QUERY_CAPABILITIES_RESPONSE, as a response to all
// subsequent IOCTL calls.
//
#define IOCTL_HPMI_QUERY_CAPABILITIES
CTL_CODE(FILE_DEVICE_BATTERY, 0x200,
METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// IOCTL_HPMI_QUERY_CAPABILITIES - Command.
//
typedef struct _HPMI_QUERY_CAPABILITIES {
//
// Set to HPMI_QUERY_CAPABILITIES_VERSION_1.
//
ULONG Version;
} HPMI_QUERY_CAPABILITIES, *PHPMI_QUERY_CAPABILITIES;
#define HPMI_QUERY_CAPABILITIES_VERSION_1
(1)
#define HPMI_QUERY_CAPABILITIES_SIZEOF_VERSION_1
sizeof(HPMI_QUERY_CAPABILITIES)
//
// IOCTL_HPMI_QUERY_CAPABILITIES - Response.
//
#define HPMI_REQUEST_SERVICE_NONE
(0x00000000) // No Windows services is requested.
#define HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS
(0x00000001) // Battery utilization hints requested from Windows.
#define HPMI_CAPABILITY_NOT_SUPPORTED
(0x00000000) // HPMI supports no capabilities.
#define HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING
(0x00000001) // OEM device specific age balancing SDB support
typedef struct _HPMI_QUERY_CAPABILITIES_RESPONSE {
//
// Set to HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1.
//
ULONG Version;
//
コマンド形式
Windows は、HPMI_QUERY_CAPABILITIES でこの IOCTL を発行します。
バージョンは HPMI_QUERY_CAPABILITIES_VERSION_1 に設定されています。
応答の形式
HPMI はコードSTATUS_SUCCESS返す必要があります。
HPMI は、HPMI_QUERY_CAPABILITIES_RESPONSE 構造体に次の値を設定して応答します。
- バージョンは HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1 に設定されています。
- RequestService に HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS を設定し、HPMI ドライバーが IOCTL_HPMI_BATTERY_UTILIZATION_HINT を受け取るようにします。
- SdbCapabilities がHPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCINGに設定され、バッテリーの使用時間の分散がサポートされていることを示します。
バッテリー使用率
IOCTL_HPMI_BATTERY_UTILIZATION_HINT を HPMI に発行し、最新のバッテリー使用ヒントを提供します。 IOCTL_HPMI_BATTERY_UTILIZATION_HINTは必要な IOCTL です。
HPMI は、内部バッテリーを節約するために「ホット スワップ対応バッテリーで使用する SDB アルゴリズムの適応」に関するページで説明されているように、PreserveNonHotSwappableBatteries ヒントを利用できます。
//
// Set command sent to HPMI to provide battery utilization hints.
//
// This IOCTL may be issued multiple times if HPMI requests
// HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS service.
//
#define IOCTL_HPMI_BATTERY_UTILIZATION_HINT
CTL_CODE(FILE_DEVICE_BATTERY, 0x201,
METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// Boolean type value.
//
typedef enum _HPMI_HINT_BOOL {
// No data is available.
HpmiBoolUnavailable = 0,
// Condition is asserted to be false.
HpmiBoolFalse,
// Condition is asserted to be true.
HpmiBoolTrue,
// Value not used.
HpmiBoolMax
} HPMI_HINT_BOOL, *PHPMI_HINT_BOOL;
//
// IOCTL_HPMI_BATTERY_UTILIZATION_HINT - Command.
//
typedef struct _HPMI_BATTERY_UTILIZATION_HINT {
//
// Set to HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.
//
ULONG Version;
//
// This hint indicates if the OEM Battery Manager should attempt to save as
// much charge as possible in the non-hot swappable batteries (i.e. the
// batteries are generally referred to as "internal batteries", these
// batteries cannot be removed while system is operational).
//
// Interpretation of values:
// - HpmiBoolUnavailable:
// Battery utilization hint is unavailable at the moment.
// - HpmiBoolFalse:
// It is not necessary to preserve charge in the internal batteries
// at the moment.
// - HpmiBoolTrue:
// Every attempt should be made to save as much charge as possible in
// the internal batteries.
//
HPMI_HINT_BOOL PreserveNonHotSwappableBatteries;
} HPMI_BATTERY_UTILIZATION_HINT, *PHPMI_BATTERY_UTILIZATION_HINT;
#define HPMI_BATTERY_UTILIZATION_HINT_VERSION_1
(1)
#define HPMI_BATTERY_UTILIZATION_HINT_SIZEOF_VERSION_1
sizeof(HPMI_BATTERY_UTILIZATION_HINT)
コマンド形式
Windows は、HPMI_BATTERY_UTILIZATION_HINTでこの IOCTL を発行します。 バージョンが HPMI_BATTERY_UTILIZATION_HINT_VERSION_1 に設定されています。
PreserveNonHotSwappableBatteries は、次のいずれかの値に設定されます。
- HpmiBoolUnavailable: バッテリー使用率ヒントを指定できない場合に設定します。 応答として、HPMI/Fimware は通常、デファクト放電ポリシーに関与する必要があります。
- HpmiBoolFalse: Windows がバッテリーの使用時間のバランス調整を行う日和見時間を決定するタイミングを設定します。
- HpmiBoolTrue: Windows が内部バッテリーに格納されているエネルギーを節約する必要がある場合に設定します。
応答の形式
HPMI はコードSTATUS_SUCCESS返す必要があります。
応答で返されるデータはありません。
サンプル インターフェイス コントラクト
ここで説明するインターフェイス定義の完全な (サンプル) API コントラクトについては、HMPI.h をご参照ください。
Note
このドキュメントの内容は、予告なしに変更される場合があります。