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

解決


2tom  2010-04-21 23:44:35  No: 71569

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

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

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

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


仲澤@失業者  2010-04-22 03:26:49  No: 71570

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

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


2tom  2010-04-22 04:03:57  No: 71571

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

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

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

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


仲澤@失業者  2010-04-22 19:37:33  No: 71572

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

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

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


2tom  2010-04-23 18:00:39  No: 71573

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

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


2tom  2010-05-12 02:24:33  No: 71574

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


subaru  2010-05-12 03:25:25  No: 71575

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


2tom  2010-05-12 18:46:23  No: 71576

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

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

宜しくお願い致します。


subaru  2010-05-12 19:06:15  No: 71577

言語は何でもいいですがまずは実際に取れるかどうか確認してください。
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 18:31:46  No: 71578

>subaru様

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

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

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

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


subaru  2010-05-13 19:51:55  No: 71579

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

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

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


2tom  2010-05-14 20:19:29  No: 71580

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

SMBusについて勉強します。

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加