#include <iostream>
- K& L: U" z, ]) { Q* [- f" Q#include <Windows.h>; E/ w- P( n4 r
#include "WinIo.h"
8 X. {) `" E8 U) X6 xusing namespace std;
* G: I: Q7 D, {4 J9 G% D# w
$ k9 c* F O4 q1 b" E6 J#pragma comment(lib, "winio.lib")
+ f5 O+ @+ R, q3 | d e0 d3 o Q
6 b9 Y# ~# t" m
$ F. H/ T) z8 N( a/ pint PMU_SC = 0x6C;//命令端口
' a- |8 h% U( F( `int PMU_DATA = 0x68;//数据端口5 d( S9 N, t! Q( F, y# P
int RD_EC_SMI = 0x80;//读寄存器命令" j, k# S4 i' P/ _+ W1 W" ?$ L, L
int POLLING_DATA = 0xE7;//CPU温度寄存器号: n& S2 f' ^ _
e, Q5 k& `8 p( ?# _3 Y9 G+ m
DWORD dwTemp = 0;1 D4 _8 f/ [0 n6 X
! B2 a% e% R! u0 V) `9 `
void PMU_Wait4IBE(DWORD *_value);
+ e4 B4 y$ G0 C7 K+ bvoid PMU_Wait4OBF(DWORD *_value);% h4 j+ c# T. m2 _5 ? t
3 n/ b7 v5 d) L( r
5 S. H' C! ?; h K- |int main(int argc, char* argv[])
2 j9 _( b6 {& D: ~% b$ f{5 Z2 o( e% Y; q, ?" q* p
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;1 R0 ^/ o% @- A2 K) q' e) ^' t
* a- p& \4 a' W* u |, S# W 9 q. L1 ~/ t! K7 e$ U
//1、mov dx,PMU_SC //
; d# ]# m6 A- |% s6 O/ q' V3 x% x //2、mov al,RD_EC_SMI //) R! p! V: k6 B- v% y+ {) h9 w) [# ^
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
! b- N- F7 X' s( W8 } //4、out dx,al //将读寄存器命令放到命令端口中。; ~9 X" {$ t. M* i1 B8 ^$ B7 b$ j+ l
+ G/ J) J( S5 f
PMU_Wait4IBE(&dwTemp);+ y7 B! d4 j$ N2 P$ B
9 f1 R0 f# c/ r2 R3 m1 p9 P9 f
SetPortVal(PMU_SC, RD_EC_SMI, 1);
/ W! x4 N# F: f% Q" L& ~0 h* I8 b4 Z% A$ I4 W2 g0 y! Y; T
PMU_Wait4IBE(&dwTemp);3 g5 }! q( |2 [
9 ~! P7 E: T; I3 u1 y% N SetPortVal(PMU_DATA, POLLING_DATA, 1);) k/ d( Q# _ X- W. D: y
. c5 I# w. @1 r. \7 k$ s: |, x PMU_Wait4IBE(&dwTemp);
% m) H' n: j* E# U% j% X7 M
0 q7 S! Q% j; Q& T: g cout << dwTemp << endl;
; |2 y' r. g6 r$ d' h, t- p2 J4 t4 }
ShutdownWinIo();
& D$ P1 y- i; p0 B g1 g/ E! a
% W$ c8 Y5 R5 s, B/ E) c9 v system("pause");
2 x: A' n3 O: }7 |7 H- } |2 b7 h4 j8 c
return 0;
7 A0 ?$ O/ x8 l; H* r$ U}. l* x/ w/ ^/ `3 {$ x4 H& o6 G
! q) Y6 Q. i5 Bvoid PMU_Wait4IBE(DWORD *_value)3 \0 r" l" R* W: a1 |8 ]2 d
{/ d/ h5 v. R4 q* Z
//#########################################################
& t! J) Q6 C4 k2 l5 t1 n /*
O+ ?6 u' c' j) ? pmuWait4IBE proc $ W' T0 t1 u! M) K' q
PUSH AX
' o% d* }: i a3 K% l( b PW4IBE: ( L- m M# B1 n& M6 `1 m8 M
IN AL, 06CH //Read PMU status ( ?) n9 I+ B& z1 w
TEST AL, 2 //Is Input Buffer Empty?
" n: L4 o7 E5 c7 o5 m" |2 D JNZ PW4IBE //Jmp if no
0 ~& d2 B' @4 x* j3 q( X POP AX ) f( ^- ]! b& U
ret
$ A* R0 w& h5 c$ i; x w pmuWait4IBE endp //END OF PMUWAIT4IBE
- ~/ B. s9 d+ T# k' d, F *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
$ Z# T% S+ q9 E' k, Z D0 o //#########################################################
" l6 g, ]# t! g3 R6 [. D2 @ /*do / r# x9 B$ W0 K1 z* m2 b2 z
{' D5 Z9 N+ Q( i, s9 o
GetPortVal(PMU_SC, _value, 4);8 ^1 T& P' ^, c6 |$ C9 ^3 D( j
}, ?+ H0 B! _1 L" x1 `# T: D4 U
while ( *(_value) & 0x00000001 );*/- s7 K4 M& d- |8 Q" I4 ]
DWORD dwRegVal=0;) c& x i# {6 z' ^+ [" @
do) ~$ K% S/ x0 d
{ : R; X2 Y- o! I* N6 }( k3 `
GetPortVal(PMU_SC,&dwRegVal,1);
( j% N3 Z3 W4 D, z- r! F4 v; U }3 ?1 z2 F7 L, F. }6 E
while(dwRegVal!=0x2);: f5 @" |- r0 e1 p
9 K" @+ U/ }8 I! T2 w}# D- S1 \7 ^( f1 f- F' C) _: c
2 f0 L8 H6 `+ P; a! V1 w0 j( t9 E以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
8 x! L4 p" m* n1 H0 D所以变成了死循环了。6 i* [. a2 \$ m, F; s! y+ y! W
# X8 H7 U& D2 i我对硬件编程不懂。又不知道从何下手。
9 U0 L2 ?8 q% i D" S我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。, ^* T/ C- r; j$ T; Z
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
4 c; i- L. i2 f/ D' [ l8 c* |" g/ \% a: |$ |' q/ ^: s5 C
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
% B* W2 x+ U* {+ m+ Z& E并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
) Z3 H/ `) u% U( F& f4 m8 [
. L7 m0 t/ J( R# y% o5 F3 g感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |