2011-08-22 3 views
5

OpenHardwareMonitorは、私のSupermicro X7DWAマザーボードのWinbond W83793 chipから温度データを読み取ろうとしています。問題は、低レベルのプログラミング経験がなく、オンラインで利用できるドキュメントが気温にアクセスする方法を説明するのに十分ではないように思われることです。Winbond W83793チップの温度を読み取るのに役立つヒントをまとめることができますか?

しかし、私がこの問題に取り組んでいる月には、問題を解決する鍵となるかもしれないいくつかの値と低レベルの方法を発見しました。私は、それらを使って私が望むものを得る方法を理解する必要があります。それが私のところです。なぜなら、私のように、この情報が何を意味し、どのように適用するのかを理解するかもしれないからです。私はすでに多くの青い画面とコンピュータの再起動の結果、突っ込んで私の公正な分け前をしました。十分に推測すれば、私はこれらの手がかりを一緒にまとめる必要があります。ここで私はこれまで知っているものである:それは、CPUID HWMonitorなどの監視プログラムは、情報を取得している方法ですので

  1. チップから読み取るには、私は何とか、SMBusのにアクセスする必要があります。私が知る限り、OpenHardwareMonitorはSMBusにアクセスするためのコードを持っていないので、チップから読み込むことができません。しかし、OpenHardwareMonitorは、Ring0 classに以下のメソッドを含んでおり、他のチップからの情報にアクセスするために使用します。私はレポートを保存するときHWMonitorは私にWinbond社W83793チップに関する次の情報を報告し、他の情報の中で

    void Ring0.WriteIOPort(uint port, byte value); 
    byte Ring0.ReadIOPort(uint port); 
    
  2. :私は私の利点にこれらのメソッドを使用することができるかもしれ

    登録スペース:SMBusの、ベースアドレス= 0x01100

    SMBusの要求:チャンネル0x0の、アドレス0x2Fは

    それはトンのようになります。 heseは重要な値ですが、私はそれらの意味を正確にはわかりませんし、上記のRing0メソッドと組み合わせてそれらをどのように使用することもできます。うーん...そんなに多くの手がかり。他のHWMonitorの値は、実際の電圧、温度、ファン速度、チップのどこかからのデータを表す16進数の配列です。見たい場合はここで再現します。 (あなたが開いている文書を持っている場合)

  3. 最後に、W83793のデータシートには、53ページ、ここでは温度の六角のアドレスは(私は信じて)私が読みたいです:

    TD1読み出し - バンク0アドレス1C

    TD2読み出し - バンク0アドレス1D

    TD3読み出し - バンク0アドレス1E

    TD4読み出し - バンク0アドレス1F

    低ビットの読み出し - バンク0アドレス22

    TR1読み出し - バンク0アドレス20

    TR2読み出し - 私がこれまで知っているすべてであるバンク0アドレス21

。OpenHardwareMonitor、W83793チップ、Ring0コードは上記のリンクから入手できます。私が以前に言ったように、私は1ヶ月間そこにいましたが、私はまだこの謎を解くことができませんでした。あなたが私を助けることを願っています。これらの情報はすべて怖いかもしれませんが、低レベルのプログラミング経験を持つ人にとっては意味があると思います。

私の質問を要約すると、OpenHardwareMonitorがW83793チップから温度を読み取る方法を理解する上で提供された手がかりを使用します。私はOpenHardwareMonitorでチップを作成するための詳細は必要ありません。私はすでにクラスを準備しています。 Ring0コマンドを書き込むためのシーケンスとフォーマットが必要です。もしそれが必要ならば。

EDIT:さらに詳しい情報が見つかりました。私はHWMonitorからSMBusデバイス・レポートを印刷し、そしてとりわけ、私はこのラインを持って、それが0x2F言うのでここに含ま:

SMBデバイスは:I/O =は0x1100、アドレス0x2F、チャネル= 0

これは、I/Oのアドレスと0x2Fのようなチップのアドレスを何らかの形で組み合わせる必要があることを意味します。私はそれらを一緒に追加しようとしましたが、それから私はすべての温度の読み値が255になるので、正しい推測ではありませんでした。

答えて

1

最後に、OpenHardwareMonitorの著者が私を助けてくれて、私のチップの温度を読み取ることができました。この問題の解決法はもう少し複雑で、まだ私を超えていますが、興味のある人はRing0クラスを使った基本的な読み書きがあります。これは私のマシンとチップに固有のものです。あなたにとっては、ベースアドレスとスレーブアドレスは異なるかもしれませんが、レポートを印刷することでCPUID HWMonitorを使用してそれらを見つけることができます。

ここで、最初に使用された定数です。

private const int BASE_ADDRESS = 0x1100; 
private const uint SLAVE_ADDRESS = 0X2F; // as we figured out already 
private const byte HOST_STAT_REG = 0; // host status register 
private const byte HOST_BUSY  = 1;  
private const byte HOST_CTRL_REG = 2; // host control register 
private const byte HOST_CMD_REG = 3; // host command register 
private const byte T_SLAVE_ADR_REG = 4; // transmit slave address register 
private const byte HOST_DATA_0_REG = 5; 
private const byte BYTE_DATA_COMM = 0x08; // byte data command 
private const byte START_COMM  = 0x40; // start command 
private const byte READ   = 1; 
private const byte WRITE   = 0; 

次に、ここではチップ上のレジスタから特定のバイトを読み込むための基本的なコードは次のとおりです。

// first wait until ready 
byte status; 
do 
{ 
    status = Ring0.ReadIoPort(BASE_ADDRESS + HOST_STAT_REG); 
} while ((status & HOST_BUSY) > 0); 
if ((status & 0x1E) != 0) 
{ 
    Ring0.WriteIoPort(BASE_ADDRESS + HOST_STAT_REG, status); 
} 

// now get the value 
Ring0.WriteIoPort(BASE_ADDRESS + HOST_DATA_0_REG, 0); 
Ring0.WriteIoPort(BASE_ADDRESS + HOST_COMM_REG, theRegister) 
Ring0.WriteIoPort(BASE_ADDRESS + T_SLAVE_ADR_REG, 
      (byte)((SLAVE_ADDRESS << 1) | READ)); 
Ring0.WriteIoPort(BASE_ADDRESS + HOST_CTRL_REG, 
      START_COMM | BYTE_DATA_COMM); 
Ring0.ReadIoPort(BASE_ADDRESS + HOST_DATA_0_REGISTER); // this returns the value 

// now wait for it to end 
while ((Ring0.ReadIoPort(BASE_ADDRESS + HOST_STAT_REG) & HOST_BUSY) > 0) {} 

Iドンながらそれはよく分かりますが、これは私と同じような問題を抱えている私よりも低レベルの経験を持つ人の大まかなガイドとなります。

4

IOメソッドが必要です。 x86ハードウェアには実際には2つのアドレスプールがありますが、1つはありません。 1つはメモリを意味し、命令を読むときにチップによって参照され、何千もの便利で便利なアクセス方法があります。もう1つは、外部チップのアドレス指定を目的としており、非常に限定された比較的遅い読み込みと書き込みのセットを持っています。あなたが特定した方法によって、2番目の領域へのアクセスが得られます。

読み出したいレジスタがバンク0にあるので、最初にチップ上でバンク12を選択する必要があります。セクション8.1.2.1のダイアグラムでは、アドレス00に0x80を書き込む必要があります。チップのベースアドレスが0x01100であることをレポートで報告すると、WriteIOPort経由で0x80から0x01100を書き込む必要があります。

それは、私はあなたにリンクする文書を消化するために、完全に時間がなかったなど、

あなたが0x01100 + 0x1cに、0x01100 + 0x1DのからReadIOPort経由で必要な値を読み取ることができなければならないことを、次に可能性がありますそれらは合理的な推測です。いくつかのチップは、値を書き込んで結果を認識しなければならないやや複雑な手続きを持っていますが、ドキュメントにそのようなものは表示されません。また、マルチタスキングに注意する必要があります。バンク0を設定して関連するレジスタを読み取る間にコードが中断された場合、間にあるプロセスによって他のバンクが設定され、読み取った値が他の任意の値になります。私はOpenHardwareMonitorがそれに対処する何らかの仕組みを持っていると想定していますが、素早く純粋なユーザー空間の実装を試み、時には奇妙な結果を得ることに留意する価値があります。

+0

これは非常に役に立ちます。ありがとうございます!あなたの指定した方法でこれらのメソッドを使ってみましたが、最初の4つの温度(1C - 1F)と最後の2つ(20と21)の255のすべてが0になりました。しかし、私は新しい発見をしました(上記の質問を編集してください)。 0x1100はチップのアドレスではなく、SMBusチャネル(または何か)のアドレスであると思われますが、0x2Fはチップのアドレスです。私は間違っている可能性がある。私は想定されたチップアドレスにベースアドレスを追加しようとしましたが、結果はまだ間違っていました。何か案は? – Dalal

+0

私はSMBusの手がかりを見逃しました。私の理解では、SMBusコントローラに、特定のデバイスの特定のアドレスからの読み書きを指示する必要があるということです。 SMBus仕様(http://smbus.org/specs/)では、SMBus上のデバイスがどのように話され、応答するかが規定されていますが、SMBusコントローラがx86世界でどのようにCPUと話すべきかを定義することは避けられません。だから次のものは、あなたのマザーボードのSMBusコントローラ用のデータシートであるか、古いデータシートが実行するのに十分な汎用性があるかどうかを調べることです。私の最初の2つのGoogleは働いていませんが、私は探し続けます。 – Tommy

+0

マザーボード用の「メモリコントローラハブ」と思われるIntel 5400 MCH(http://www.intel.com/Assets/PDF/datasheet/318610.pdf)のデータシートが見つかりました。マザーボードのデータシート。これが私たちに必要なものかどうかはわかりません。 – Dalal

関連する問題