カメラの電源管理
電源管理モード
カメラ サブシステムの off-System on a Chip (SoC) コンポーネントは、2 つの電源管理モードをサポートする必要があります。 カメラ コンポーネントは、カメラ デバイスがアクティブにコンテンツをアプリケーションにストリーミングするアクティブ モードをサポートする必要があります。 さらに、カメラ コンポーネントは、カメラ デバイスの電源をオフにし、電源を除去し、カメラ デバイスが電力を消費しないための電源除去モードをサポートする必要があります。 次の表では、カメラ デバイスのアクティブ電源管理モードと電源除去電源管理モードについて説明します。
モード | 説明 | デバイスの電源状態 (Dx) | 平均電力消費量 | アクティブまでの終了待機時間 | 切り替えメカニズム |
---|---|---|---|---|---|
アクティブ (ストリーミング) |
カメラ デバイスは、コンテンツをアプリケーションへアクティブにストリーミングしています。 コンテンツは、フルモーション、プレビュー、または静止画像のキャプチャです。 |
はい |
センサー、AF、およびフラッシュ固有。 |
該当なし |
ソフトウェアによって開始される D0 移行。 (アプリケーションが、キャプチャ ピンの状態を KSSTATE_ACQUIRE に設定することによってストリーミングを開始しました)。 |
電源 - 切断 |
カメラ デバイスは、いずれのアプリケーションにもコンテンツをストリーミングしていません。 コンテキストがカメラ センサー、フラッシュ デバイス、自動フォーカス エンジンに保持されていません。 |
はい |
0 ワット |
< 最初のフレームまで 200 ミリ秒 (次の表を参照)。 |
ソフトウェアによって開始される D3 移行。 (すべてのストリーミング ピンの状態は、KSSTATE_RUN 以外の値に設定されています)。 |
注 Windows は、アクティブ モードから電源削除モード (オフ待機時間) への移行時間を 100 ミリ秒未満にする必要があります。 ほとんどの電源管理作業では、電源除去モードからアクティブ モードへの移行時間 (待機時間) を短縮することに重点を置いています。
同じ 2 つの電源管理モード (アクティブおよび電源除去) は、on-SoC イメージ処理ユニットでサポートされている必要があります。 SoC ベンダは、イメージ処理ユニットを構成する個々のコンポーネントとそれぞれの電源管理の状態を定義します。 1 つのドライバーで SoC イメージ処理ユニットを制御し、カメラ キャプチャのすべてのイメージ処理ユニットを 1 つの電力管理コンポーネントとしてパワー エンジン プラグイン (PEP) に提示することをお勧めします。
ソフトウェア電源管理のメカニズム
システムがコネクトスタンバイ状態でディスプレイがオフになっているとき、on-System on a Chip (SoC) イメージ処理ユニットと off-SoC カメラ コンポーネントの両方で電力が消費されていない (ゼロワット) 必要があります。 電源管理の主要なソフトウェア メカニズムは、カメラ キャプチャピンの参照カウントです。 この参照カウントは、AVStream ミニドライバーというカメラ コントローラー ドライバーによって管理されます。 この基本的電源管理メカニズムは、システムの電源がオンになっているときはいつでも (システム ディスプレイの電源がオンになっているときも含めて) 使用できます。
カメラ コントローラー ドライバーは電源管理状態の移行を、カメラ センサー、オートフォーカス、フラッシュなどの off-SoC コンポーネントを制御するドライバーに転送する必要があります。 これに対し、これらのデバイスを制御するドライバーは、電源状態を変更し、電源を取り外すか適用するための特定のアクションを実行する必要があります。
推奨されるドライバーのアーキテクチャ
カメラ サブシステムは、カメラ コントローラー ドライバーと呼ばれる 1 つの AVStream ミニドライバーを通じて Windows に公開される必要があります。 カメラ コントローラー ドライバーはハードウェアに直接アクセスせず、ハードウェア コンポーネントを直接電源管理しないようにすることをお勧めします。 代わりに、カメラ コントローラー ドライバーは電源管理およびハードウェアの要求を、カメラ サブシステムを構成する他のドライバーに転送する必要があります。
on-SoC イメージ処理ハードウェアは、SoC パワー エンジン プラグイン (PEP) によって電源管理する必要があります。 イメージ処理ハードウェアは、Windows Driver Frameworks (WDF)ドライバーによって管理される必要があります。このドライバーでは、WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 構造体の IdleTimeout メンバーを SystemManagedIdleTimeout に設定することによって、PEP との連携を可能にする必要があります。 この設定により、PEP は、SoC ハードウェアに固有のすべてのクロックおよびパワー レール共有トポロジを制御できるようになります。 SoC のイメージ処理ユニットを制御するドライバーは、イメージ処理ユニット全体を 1 つの電源管理コンポーネントとして表して、電源管理の既定の WDF 機能を使用できるようにする必要があります。
off-SoC カメラ サブシステム コンポーネントは、1 つまたは複数のカーネル モード ドライバー フレームワーク (KMDF) ドライバーによって管理される必要があります。 off-SoC コンポーネントのドライバーは、コンポーネントがカメラ キャプチャに不要になったとき、電源除去 (D3) 状態に移行しなければなりません。 さらに、off-SoC コンポーネントのドライバーは D3cold を有効にしなければなりません。これにより、基になる ACPI サブシステムは電源を適用や除去するために GPIO 行の状態を変更できます。 詳細については、「ドライバーでの D3cold のサポート」をご覧ください。
次のブロック図は、推奨されるドライバー アーキテクチャを示しています。
カメラ サブシステムを構成する—ドライバー (カメラ コントローラー ドライバー、画像処理ユニット ドライバー、off-SoC カメラ コンポーネントのドライバーなど) は—すべて、同じドライバー インストール (.inf) ファイルに列挙する必要があります。 すべてのカメラサブシステムドライバーは、イメージング PnP デバイスセットアップクラスのメンバーである必要があります。 イメージング デバイスの ClassGuid は {6bdd1fc6-810f-11d0-bec7-08002be2092f} です。
1 つのカメラ コンポーネントを表す各ドライバーは、ACPI 名前空間で 1 つのデバイスとして列挙する必要があります。
アクティブおよび電力が削除された状態
カメラ コントローラー ドライバーは、カメラ デバイスからコンテンツをストリーミングしているアプリケーションがないとき、カメラ デバイスを電源除去状態に移行する必要があります。 アプリケーションは、ユーザーによって閉じられたか、バックグラウンドに移行されて中断されているため、ストリーミングを停止することがあります。
デバイスが電源除去状態になっているカメラからアプリケーションがストリーミングを開始する場合、カメラ コントローラー ドライバーはカメラ デバイスを 100 ミリ秒以内にアクティブ状態に戻さなければなりません。
さまざまなカメラ サブシステム コンポーネントの電源状態を変更するために、カメラ コントローラー ドライバーは独自のインターフェイスを使用して、カメラ サブシステムを構成する他のドライバーとやりとりします。 適切なインターフェイスを照会するには、カメラ サブシステム ドライバーで標準の方法を使用する必要があります。これは、一連の関数ポインターを取得する IRP_MN_QUERY_INTERFACE I/O 要求を送信するためのものです。
カメラ コントローラー ドライバーは、すべてのストリーミング ピンが KSSTATE_STOP 状態になったときに、カメラ デバイスを電力が削除された状態にする必要があります。 ユーザーが電源ボタンを押してシステムがコネクトスタンバイ状態に入ると、Windows はフォアグラウンド アプリケーションを自動的に中断します。 キャプチャ アプリケーションが中断されると、Windows ランタイムによって提供されるカメラ キャプチャ API が通知され、カメラ キャプチャ ピンの状態が変更されて、KSSTATE_STOP の状態になります。
最初のストリーミング ピンが KSSTATE_ACQUIRE 状態になると、カメラ コントローラーのドライバーは、on-SoC イメージ処理ユニットを含むカメラ デバイスをアクティブ状態にする必要があります。
関連付けられているカメラ機能
カメラ センサーとフラッシュ デバイスには他のプラットフォームレベルの機能があり、それらはドライバーで管理しなければならないかもしれません。 これらの機能として、以下が含まれます。
- カメラ センサーを I2C バス上で有効化、無効化、および構成する。
- フラッシュ バースト率と明るさレベルを I2C バス上で構成する。
- フラッシュ モジュールから SoC に至るまで、フラッシュ モジュールから温度条件を、GPIO 行を通じて検出する。
これらの機能を実装するには、カメラ デバイス ドライバーの開発者が次の表にまとめられている方法とガイダンスを使用する必要があります。
関数 | 説明 | ハードウェア/ファームウェア接続 | ソフトウェアのメカニズム |
---|---|---|---|
センサーの構成 | カメラ センサー ハードウェアの機能を列挙するか、現在の操作モードを構成します。 | I2C バス上の通信。 I2C リソースについては、ACPI 名前空間のカメラ デバイスの下にある _CRS 方法で記述されています。 | シンプルな周辺機器バス (SPB) の入出力 (I/O) 要求インターフェイスは、I2C ホスト コントローラーおよびカメラ センサー デバイスとの通信に使用されます。 |
センサー イベントの検出 | カメラ センサーから SoC までの GPIO 行を使用して、イベントを発生させたり、状態を示したりします。 | カメラ デバイスに提供された GPIO リソース。 これらのリソースについては、ACPI 名前空間のカメラ デバイスの下にある _CRS 方法で記述されています。 イベントを示す GPIO ピンを、GPIO 割り込みリソースとして記述する必要があります。 | 割り込みがドライバーにより、GPIO イベントに応えて処理されます。 SPB I/O 要求インターフェイスを使用してセンサー デバイスと通信して、割り込みの原因について調べます。 |
フラッシュ構成 | フラッシュ デバイスのバースト速度、接続 LED の数、または他の特性を構成します。 | I2C バス上の通信。 I2C リソースについては、ACPI 名前空間のカメラ デバイスの下にある _CRS 方法で記述されています。 | SPB I/O 要求インターフェイスを使用して、I2C ホスト コントローラーおよびカメラ センサー デバイスと通信します。 |
イメージ処理ユニット ドライバーとの調整 | SoC のイメージ処理回路でキャプチャを開始して調整します。 | 該当なし | プライベート インターフェイスが、イメージ処理ユニットを管理するドライバーによって公開されます。 |
カメラ デバイス列挙
プラットフォームでカメラ デバイスを識別するために、通常はアプリケーションがカメラ デバイスのインスタンスについて、プラグ アンド プレイ (PnP) マネージャーにクエリを行います。 各 PnP インスタンスが、1 つのカメラ デバイスに対応します。 このようなインスタンスを識別するために、システム インテグレーターは ACPI 名前空間にカメラ デバイスを定義します。 カメラ デバイスがコンテンツをストリーミングできるのは、一度に 1 つのアプリケーションに対してだけです。 ただし、アプリケーションは複数のカメラ デバイスから同時にストリーミングできます。
カメラ コントローラー ドライバー (AVStream ミニドライバー) によって表される各カメラ デバイスは、ACPI 名前空間で別個のデバイス、グラフィックス ドライバーの子として列挙する必要があります。
特殊なケースとして、SoC プラットフォームが、プラットフォーム内のすべてのカメラ デバイスからコンテンツを同時に、報告されている解像度またはモードの任意の組み合わせでストリーミングできない場合は、代わりに 1 つのカメラ デバイスを列挙できます。 ただし、この実装には慎重な検討が必要であり、Microsoft と直接連携した場合だけ行うようにしてください。
カメラ サブシステムの残りの部分 (on-SoC イメージ処理ユニット、—off-SoC カメラ センサー、自動フォーカス、フラッシュなど) を表すデバイスは、—ACPI 名前空間内の 1 つ以上のデバイスとして列挙する必要があります。 on-SoC イメージ処理ユニットは、カメラの off-SoC コンポーネントを表すデバイスとは別のデバイスとして列挙する必要があります。
カメラの電源管理チェックリスト
システム インテグレーター、カメラ センサー ベンダー、System on a Chip (SoC) ベンダーがこの記事のチェックリストを使用して、システム電源管理設計が Windows 10 と互換性を持つようにする必要があります。
- システム インテグレーターは、カメラ センサー コンポーネントを選択してカメラ デバイスを統合するときに、SoC ベンダーとコミュニケーションをとって共同作業を行う必要があります。
- カメラ コントローラー ドライバーの開発者は、次のことを行う必要があります。
- アプリケーションがカメラ デバイスからコンテンツをストリーミングしないようになったら、カメラ ハードウェアの電源をオフにします。 (これが起きるのは、すべてのキャプチャ ピンが KSSTATE_STOP 状態になったときです)。
- アプリケーションがカメラ デバイス上のキャプチャ ピンからのストリーミングを開始するとき、カメラ ハードウェアの電源をオンにします。
- on-SoC イメージ処理ユニットを管理する 1 つの KMDF ドライバーを開発します。 カメラ コントローラー ドライバーは、カスタム ドライバー インターフェイスを使用してイメージ処理ユニット ドライバーに、カメラ キャプチャを開始や終了するよう伝える必要があります。
- かならずイメージ処理ユニット ドライバーを Windows 電源管理フレームワーク (PoFx) に登録して、SoC ベンダー提供 PEP がイメージ処理ユニット ハードウェアの電源管理を制御できるようにしてください。
- カメラ センサー、自動フォーカス、オプションのフラッシュなどの off-SoC カメラ ハードウェアを管理する各ハードウェア コンポーネントを管理するための 1 つの Windows Driver Frameworks (WDF) ドライバーを開発します。 カメラ コントローラー ドライバーはカスタム ドライバー インターフェイスを使用して、off-SoC カメラ ハードウェアのドライバーに、カメラ キャプチャを開始や終了するよう伝える必要があります。
- カメラ コンポーネントの電源をオフにすべきときに off-SoC カメラ ハードウェアを管理するドライバーが D3 移行を開始して、ACPI に D3 移行が通知されてコンポーネントから電源を除去できるようにします。 • カメラ コンポーネントの電源をオンにすべきときに off-SoC カメラ ハードウェアを管理するドライバーが D0 移行を開始して、ACPI に D0 移行が通知されてコンポーネントに電源を適用できるようにします。
- カメラ センサー ハードウェアやフラッシュ デバイスの構成を管理するためのドライバー コードを開発します。
- カメラ センサー ハードウェアやフラッシュ デバイスを管理するために必要な GPIO および I2C リソースの予想される順序について、システム インテグレーターに知らせます。
- カメラ サブシステムを構成するドライバーはすべて、同じドライバー インストール (.inf) ファイルに列挙されるようにしてください。
- カメラ サブシステムを構成するドライバーすべてが、イメージング PnP デバイス セットアップ クラスのメンバーになるようにしてください。 イメージング デバイスの ClassGuid は {6bdd1fc6-810f-11d0-bec7-08002be2092f} です。
- システム インテグレーターは、以下を行うためのプラットフォーム ACPI ファームウェアを設計する必要があります。
- 各カメラ デバイスを ACPI 名前空間で別個のデバイスとして列挙します。
- ACPI 名前空間の各カメラ デバイスの下に _PLD オブジェクトを含めて、カメラはコンピューターの前面にあるのか背面にあるのかを示します。
- 各カメラ デバイスの ACPI 名前空間のルートに電源リソースを含めます。 特定のカメラ デバイスのすべての off-SoC ハードウェア コンポーネント (センサー、AF、フラッシュなど) を、1 つの電源リソースに入れる必要があります。
- 各電源リソースの _ON および _OFF 制御メソッドを実装して、パワー レール切り替えハードウェアを駆動する SoC の GPIO ピンの状態を変更します。
- 名前空間内の各カメラ デバイスの下に、各カメラ デバイスとその関連ハードウェアの電源リソースを参照するための _PR0 および _PR3 メソッドを指定します。
- ACPI 名前空間の各カメラ デバイスの下に、カメラ センサーとフラッシュ ハードウェアの GPIO および I2C リソースを列挙するための _CRS オブジェクトを指定します。 GPIO リソースと I2C リソースは、カメラ センサー ドライバー開発者が指定した順序にする必要があります。
- システム インテグレーターは、プラットフォームのハードウェアと電源ルーティングを、次のように設計する必要があります。
- 各カメラ デバイスにあるそれぞれのパワー レールは、他のカメラ デバイスのパワーレールとは無関係に制御で、SoC の GPIO ピンによってオンとオフを切り替えられる。
- システム インテグレーターは、以下についてテストと検証を行う必要があります。
- カメラ デバイス ハードウェアは、カメラ デバイスがアプリケーションで使用されていないとき、電力を消費しない (電力ゼロ)。 システム インテグレーターは、インストルメント化されたハードウェアを使用してこの電力消費量を測定する必要があります。