SMBus接続のバッテリー情報を取得するには?

解決


2tom  2010-04-21 14:44:35  No: 71569  IP: [192.*.*.*]

PCをバッテリーで動作させようと考えています。
バッテリーの情報を取得するためにバッテリーとマザーボードは
SMBusで接続してします。

バッテリー情報を取得するWindowsのAPIとして
「GetSystemPowerStatus」
があり、この関数をコールしてみましたが、AC接続と判断されてしまいます。

この関数はSMBus接続されたバッテリーとは通信しないのでしょうか?

SMBusを使用した通信はどのようにすれば実現できるのでしょうか?
(COMポートの様にOpen/Write/Readの様にできるのでしょうか?)

編集 削除
仲澤@失業者  2010-04-21 18:26:49  No: 71570  IP: [192.*.*.*]

あんまり詳しくないのですが、まず、SMBusでメインボードと
対象バッテリーを物理的につないだけではだめかもしれません。
SMBusはACPIデバイスドライバが管理しているのですが、
そのドライバがSMBus経由で対象バッテリーと通信し、認識
できなければ無視されるでしょう。認識はできたが、話が
通じない状態なら、デバイスマネージャに何らかのサインが
でるかもしれません。

ちなみに当該のバッテリーにはACPIかそれに準ずるデバイス
ドライバや、テスト用アプリケーションなどは付いていないので
しょうか。そうであると手に負えない可能性があります。

編集 削除
2tom  2010-04-21 19:03:57  No: 71571  IP: [192.*.*.*]

>仲澤様
本件でもお世話になります。

WindowsAPI→ACPIデバイスドライバ→SMBus→バッテリー
の順で制御されているという認識であっていますでしょうか?

デバイスマネージャには何も表示されていませんので、
無視されていると思います。

当該バッテリーのWindowsドライバが無いか確認してみます。

編集 削除
仲澤@失業者  2010-04-22 10:37:33  No: 71572  IP: [192.*.*.*]

>WindowsAPI→ACPIデバイスドライバ→SMBus→バッテリー
>の順で制御されているという認識であっていますでしょうか?

その通りです。実態はACPI(Advanced Configuration and
 Power Interface)がSMBusを利用して所定の機能を実現
しているという意味にになります。

ACPIはドライバーなので、IOCTL系関数、つまり
DeviceIoControl()でアクセスはできると思うのですが、
役に立ちそうな知識はありません。

編集 削除
2tom  2010-04-23 09:00:39  No: 71573  IP: [192.*.*.*]

>仲澤様
返答ありがとうございます。

DeviceIoControlを調べたところ、SMBusにアクセス出来そうです。
しかし、問題なのがハンドルの取得です。
CreateFileでハンドル取得すればいいことはわかったのですが、
第一引数に何を渡せばいいのかがわかりません。
Aドライブの場合、「"\\\\.\\a:"」ですが、SMBusの場合は…
もう少し調べてみます。

編集 削除
2tom  2010-05-11 17:24:33  No: 71574  IP: [192.*.*.*]

>仲澤様
バッテリーメーカーに問い合わせを行ったところ、
ドライバもテスト用アプリケーションも無いとのことでした。
自力でアクセスするしかなさそうです…

編集 削除
subaru  2010-05-11 18:25:25  No: 71575  IP: [192.*.*.*]

WMIのWin32_Batteryでは取れませんか?

編集 削除
2tom  2010-05-12 09:46:23  No: 71576  IP: [192.*.*.*]

>subaru様
ありがとうございます。
Win32_Batteryについて調べてみましたが、VBやC#での使用方法
は見つけることが出来ましたが、VCでの使用方法を見つけることが
出来ませんでした。

VCでの使用方法をご存じでしたら教えて頂けますでしょうか。

宜しくお願い致します。

編集 削除
subaru  2010-05-12 10:06:15  No: 71577  IP: [192.*.*.*]

言語は何でもいいですがまずは実際に取れるかどうか確認してください。
WMICodeCreatorを使うと楽です。
http://www.atmarkit.co.jp/fwin2k/win2ktips/756wmicreator/wmicreator.html

VC++での使用方法についてはこちらを参考にしてみてください。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+201002/10020012.txt


役に立つかどうかはわかりませんが一応APIの関連しそうなとこのリンクも書いておきます。
http://msdn.microsoft.com/en-us/library/bb204769%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/aa373163%28VS.85%29.aspx
http://www.codeproject.com/KB/vista/VGPowerMonitor.aspx

編集 削除
2tom  2010-05-13 09:31:46  No: 71578  IP: [192.*.*.*]

>subaru様

回答ありがとうございます。

ターゲットPC上でWMICodeCreatorを起動し、Win32_Batteryの
コマンドすべてを実行してみましたが、値は取得出来ませんでした。
(Let's Noteでは正常に値の取得が出来ました。)

やはり、Windowsにバッテリーのデバイスドライバ的な物が無いので
取得できないのでしょうか?
(おそらく、バッテリーと通信し、Windowsに通知する箇所が無いと思われます。)

チップセット(ICH9)のSMBusレジスタを使用して直接通信するしかなさそうです。

編集 削除
subaru  2010-05-13 10:51:55  No: 71579  IP: [192.*.*.*]

>ターゲットPC上でWMICodeCreatorを起動し、Win32_Batteryの
>コマンドすべてを実行してみましたが、値は取得出来ませんでした。

仲澤さんの説明でそんな気がしていましたがやはり無理でしたか。

しかしデスクトップPCをバッテリーで動かすってことなんですかね?
デスクトップPC向けのバッテリーってなさそうなので実現可能かどうかもわかりませんが、
できるとしてもハードやドライバの知識まで必要っぽい気はしますね。。。

編集 削除
2tom  2010-05-14 11:19:29  No: 71580  IP: [192.*.*.*]

>しかしデスクトップPCをバッテリーで動かすってことなんですかね?
デスクトップほど大きくはないのですが、Mini-ITXのPCをバッテリーで
動作させたいと考えています。

SMBusについて勉強します。

仲澤様・subaru様ありがとうございました。

編集 削除