embeddedなブログ

組み込みシステムに関することや趣味に関することをダラダラと書いていきます(^^)

Windows CEにおけるパワーマネージメントの実装(その2)

2011-11-07 09:10:53 | Windows Embedded CompactまたはCE

前回は、デフォルトのデバイス電源状態に関する定義について説明しました。 今回は、デバイスに例外的な電源状態を持たせる場合の定義方法について説明します。

その方法には大きく2つの方法があります。ひとつは予め大きなクラス(カテゴリ、またはデバイスのグループのようなイメージ)を定義し、そのグループでの電源状態を定義する方法。もうひとつは、細かく個々のデバイス毎の電源状態を定義する方法です。

まず、クラスによる方法について説明します。Windows CEでは標準で、Generic(汎用)、block devices(ブロックデバイス)、NDISミニポート(ネットワーク)、display(ディスプレイ)の4つのクラスが定義されています。 それぞれ、下記のようにGUIDで定義されています。

;
; Power Manager interfaces.  These list the interface classes that the Power
; Manager will monitor for new devices.
;
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\Interfaces]
    "{A32942B7-920C-486b-B0E6-92A702A99B35}"="Generic power-manageable devices"
    "{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}"="Power-manageable block devices"
; @CESYSGEN IF CE_MODULES_NDIS
    "{98C5250D-C29A-4985-AE5F-AFE5367E5006}"="Power-manageable NDIS miniports"
; @CESYSGEN ENDIF CE_MODULES_NDIS
; @CESYSGEN IF CE_MODULES_GWES
    "{EB91C7C9-8BF6-4a2d-9AB8-69724EED97D1}"="Power-manageable display"
; @CESYSGEN ENDIF CE_MODULES_GWES

実際の電源状態の定義方法について説明します。 例えば、システムアイドルになったときに、ブロックデバイスの電源状態はD0を維持させたいとします。 このとき、デフォルトではデバイスはD2状態となります。 これは前回の記事で以下のように定義済みです。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\State\SystemIdle]
    "Default"=dword:2           ; D2


 しかし、ブロックデバイスについては、D0を保ちたい場合、以下のようにブロックデバイスのクラス({8DD679CE-8AB4-43c8-A14A-EA4963FAA715})だけは、SystemIdleでD0と定義します。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\State\SystemIdle\{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}]
    "Default"=dword:0           ; D0

更に、実際のブロックデバイスのドライバも、そのデバイスがブロックデバイスのクラスに属しているということを定義する必要があります。 それは下記のようにデバイスのレジストリIClass値を定義することで実現できます。

[HKEY_LOCAL_MACHINE\Drivers\SDCARD\ClientDrivers\Class\SDMemory_Class]
   "Dll"="SDMemory.dll"
   "Prefix"="DSK"
   "IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}",
                     "{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}"

また、レジストリを使用せずに AdvertiseInterface というAPIを用いてデバイスドライバのロード時などに自分自身が関連付くクラスを宣言する方法もあります。

以上が、クラスによる方法です。 次に、個々のデバイス毎に定義する方法について説明します。 この方法はとても簡単です。 例えば、Prefixが"COM1"というデバイスのみ、システムアイドル時にD0としたい場合は、以下のようにデフォルト定義のレジストリに"COM1"の定義を追記するのみで実現できます。

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\State\SystemIdle]
    "Default"=dword:2           ; D2
    "Flags"=dword:01000000      ; POWER_STATE_USERIDLE
    "COM1:"=dword:0            ; D0 for COM1

このように、Windows CEは複雑なシステムとデバイスの電源状態の関連付けをレジストリだけで簡単に定義できる仕組みを提供しています。

 


最新の画像もっと見る