#include <iostream>3 p) ], `# N$ b W6 H
#include <Windows.h>/ e1 ?: u6 U8 c
#include "WinIo.h"
* _( ?/ r, u2 cusing namespace std;* F, Z( j7 x9 |+ m
t: F7 v# X+ ~
#pragma comment(lib, "winio.lib")
, D( }, }8 J4 F+ q2 I" C3 B1 k
$ p* A8 T/ D8 z$ }4 ^6 W; z7 R% [7 v% j m
int PMU_SC = 0x6C;//命令端口3 d" r3 \/ A& g I D3 ]
int PMU_DATA = 0x68;//数据端口7 `. _- L: G) K. k5 O: j# ?
int RD_EC_SMI = 0x80;//读寄存器命令
* o( U/ z& w" ~int POLLING_DATA = 0xE7;//CPU温度寄存器号
: P# w( w; T3 X; K! j ]9 [+ {; W
DWORD dwTemp = 0;
4 E& s# W _1 z8 s% v, p
9 _& D5 n9 y# |) J6 m3 cvoid PMU_Wait4IBE(DWORD *_value);; G: a; M7 j7 v* O" `0 ^' P
void PMU_Wait4OBF(DWORD *_value); I1 _5 m' ~3 p4 }& ~. s b! _
' n# k U" b. S1 f6 x; A
3 h: q R; j( U: Z9 `9 M6 Kint main(int argc, char* argv[])
; q9 i4 n/ k4 k+ L8 t. U{
: E! x8 X9 x" X. s$ B- l& {1 D if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
8 {: r6 M( F ]7 Y
( b5 V6 Y0 `& g # A, G* G) b& R4 W7 O8 A
//1、mov dx,PMU_SC //! M8 Z0 i0 U6 |! i/ d
//2、mov al,RD_EC_SMI //
! u+ i/ p/ B& R8 Y //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
/ S# H. O4 {* i B, S* _ //4、out dx,al //将读寄存器命令放到命令端口中。
0 _7 x2 u% p1 f" I
; V9 q$ i5 o3 [- I3 Y) b PMU_Wait4IBE(&dwTemp);
/ c/ y4 g3 c& L 7 n; f' I) ^9 a
SetPortVal(PMU_SC, RD_EC_SMI, 1);" B5 K2 E8 G& e2 G6 ^3 I# ~
0 r$ b4 g, s7 a5 T* K. x- x
PMU_Wait4IBE(&dwTemp);* ?( S4 p" m* t. x! @$ j% K
, M; ^0 t) Y2 @+ x' U0 a SetPortVal(PMU_DATA, POLLING_DATA, 1);
6 U' M% }! F" B! o! P8 n% J( L0 Q+ R8 }5 p
PMU_Wait4IBE(&dwTemp);
- A$ W; U7 n3 i# i; W3 r2 i5 x- @. q' D' v& E6 g
cout << dwTemp << endl;
. o) s; m& g" p7 [, R: A2 d6 G
* V6 r6 a8 E9 s4 O ShutdownWinIo();) X, m! u9 m6 ~% I0 T0 n& `/ }
$ G9 z1 D" `4 _ system("pause");
. D7 y. M8 b0 F `3 n
2 z0 |/ {& Z! M3 g. ` return 0;
( G ~; d7 A2 c: D& W5 ^/ C" |}
8 K0 J+ b' s. m: R
8 a6 E i5 L" `- H1 V7 S4 ^# Pvoid PMU_Wait4IBE(DWORD *_value)
+ V5 ~. E" y5 Y7 d* m" U$ M{
3 g" O, }) R2 I: F3 e& i //#########################################################
# A: X5 S( i! G! @# L. \; H /*
4 p" S& ~# i3 j( ^! C$ G. S pmuWait4IBE proc
: ?$ k ^( w; }3 H. [ R PUSH AX & J" U6 y3 ~( d0 `
PW4IBE:
" L0 d# w1 s; \2 E IN AL, 06CH //Read PMU status
- \. S9 b* i9 r' {( l! X x$ { TEST AL, 2 //Is Input Buffer Empty?
0 H# D, H- M* l& Q' a& E JNZ PW4IBE //Jmp if no 5 e) [/ y$ c, B: c2 e) v
POP AX 8 z+ w, Y& {2 x; l8 }, C2 s+ b7 f9 J
ret
: v2 {9 C N5 l' F5 Q; } pmuWait4IBE endp //END OF PMUWAIT4IBE! H4 J+ ~9 M0 A Z P+ H! z
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空 j; P3 v3 |9 K# a9 J2 P
//#########################################################
' k. j: C: p0 e6 a$ X /*do $ S/ Q5 d. a5 \3 ~2 {
{. c0 a" g3 k0 z1 ]
GetPortVal(PMU_SC, _value, 4);6 ?: B6 i* H0 a. c9 r& P
}
9 f3 @9 ^# E- v5 S" \ while ( *(_value) & 0x00000001 );*/+ {/ ], J3 v4 Z7 y
DWORD dwRegVal=0;7 w+ a. j8 |1 }; [/ P# o
do @2 P1 p; r6 @# R/ R
{ ( u/ Z, w3 g% @
GetPortVal(PMU_SC,&dwRegVal,1);
6 f5 k% \6 f5 y }: l# w8 D5 i9 ~: l8 O" W J6 Z
while(dwRegVal!=0x2);$ i: g, a N: J {5 @0 d& J- Y) V
: v) l0 v' V. U' w' a( Z+ Z
}( J1 r8 X( s) q4 |) C) D
7 o, d! k, |) n. Q0 U, x- b
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
' U0 @1 u. v* `* Q" c5 b% j; Q' }所以变成了死循环了。
) O9 C) Q, q( d4 U4 Y
: E8 H; H( C2 E2 @) ], K. i我对硬件编程不懂。又不知道从何下手。7 d: R- i3 J$ H% D
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
, z+ P! P J9 R6 a2 F3 y但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。6 }! C- W4 P* C3 n3 ]) N J4 I7 K' v
6 r H" [+ F9 j5 C! K- J8 J7 U$ f我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。) |! E& }% j; M. T% K. ^
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。8 o. p, q3 [8 n+ |, F( b, x
2 e2 F# T& k/ f+ j. X5 o! A/ a感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |