#include <iostream>
3 G1 h2 [3 U, S0 E! d& O) _#include <Windows.h>" Y! b& o, p# _! v% j& u
#include "WinIo.h"0 h v: l% Z/ j4 A: K" h
using namespace std;
& t0 C' @1 h, @. F; i: J" y m. E
$ `* |" o& ~/ m#pragma comment(lib, "winio.lib"): ]6 D' l" H3 b: B1 P, `5 f0 S
. s0 K4 F2 s" L/ w6 z; H% x8 T' c% [4 J$ Z
int PMU_SC = 0x6C;//命令端口/ q. U6 X( g+ X7 h% {
int PMU_DATA = 0x68;//数据端口0 w! J! ^ j2 f5 b( F; d
int RD_EC_SMI = 0x80;//读寄存器命令6 N l& g( ?! q+ a9 k' @ L, B: n
int POLLING_DATA = 0xE7;//CPU温度寄存器号
5 w" U K2 y7 D$ b0 K" l
' g3 I | @& O$ @1 GDWORD dwTemp = 0;
6 U! K; e1 ~1 C0 l# [2 V
4 O, ? T& j# K" }9 `void PMU_Wait4IBE(DWORD *_value);0 `6 ]5 k5 ?. W, @! \) O
void PMU_Wait4OBF(DWORD *_value);6 F- o. x* ?! u3 `: t
/ V5 k: T9 i5 L& ]/ ]/ ]5 |# [
! Z* N& P$ I1 a/ N1 g# T
int main(int argc, char* argv[])
7 ~7 d& t+ z$ {- `. L{2 J# n( p- N. [- Q1 H7 ?: K
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
/ Z2 ~9 z0 I, n( y9 L: `5 g" L* H' B( |
5 t- r2 i, X7 e( P- L" h3 Q
//1、mov dx,PMU_SC //1 l' K2 a8 t: d7 a+ p. b
//2、mov al,RD_EC_SMI //* {% \9 a6 W+ Y6 n! G
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
0 F; ~2 \: Y) f+ R l/ v //4、out dx,al //将读寄存器命令放到命令端口中。
3 N# i1 C* u$ s
. ^# k& [& Z0 e6 { PMU_Wait4IBE(&dwTemp);
5 A8 c( | F* X# F( e
% o. i2 u+ ]) k5 t" C/ q: x SetPortVal(PMU_SC, RD_EC_SMI, 1);
H7 C: v) o+ T1 S- l
4 z5 N$ I3 \! Q- ] _ PMU_Wait4IBE(&dwTemp);* {% B; ~$ _9 {4 Y4 G* f
9 z5 l" ^2 N% M SetPortVal(PMU_DATA, POLLING_DATA, 1);" l0 v& G( t+ v
' K/ K6 H# M. B. g, O( T PMU_Wait4IBE(&dwTemp);+ k' ~1 ~; P' e) a3 F; n
( s3 e" o, U; q$ l5 V) e' Y6 z5 K0 u9 r cout << dwTemp << endl;
3 ]6 I" b( Z0 o9 Q0 M
' H, V& k* D; v$ d ShutdownWinIo();6 u; A1 @# ~: } Y) ]- Y6 W
6 z! r% y& q, N* R3 J
system("pause");
( f5 V6 K6 P, ~% E
4 x0 o: Y% \- z+ r* U return 0;
$ N% B8 E B7 ~/ d}0 I, W6 Q/ @ ]
! H! B$ h# ~2 P, _+ B8 }; ^# Rvoid PMU_Wait4IBE(DWORD *_value) C: l6 g0 Q z* Y/ T2 e# J! U# W% d1 s
{2 Y `$ A& y/ T
//#########################################################
z- V& o0 q5 O' d: B& y4 J /*
/ l5 o/ w5 d* f pmuWait4IBE proc 4 e' Z9 ]/ v% h
PUSH AX
" ?/ z! `) y, M2 u; F7 i1 O PW4IBE: . L7 P( S6 o9 f
IN AL, 06CH //Read PMU status
! D1 n+ q& _. r; g; _* x TEST AL, 2 //Is Input Buffer Empty?
& J9 P r, M& `; o JNZ PW4IBE //Jmp if no 2 V* M" O* O2 l+ [. W/ Y
POP AX
6 Q& \% e5 \; X' Y" a1 k ret , w" O2 ?4 ^" D8 Q% _: o5 r0 }
pmuWait4IBE endp //END OF PMUWAIT4IBE
2 u" c* ?, U! U. ]! w9 q% U7 J *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空3 y! a5 k5 G, f- {1 g
//######################################################### " U- d g* v2 M3 A9 N- R
/*do - Y, m6 l) f5 g; W- t
{! s X o+ w" _) Q; L5 u! E! N
GetPortVal(PMU_SC, _value, 4);
( k) ]: V5 I( s }' n" m9 ^4 R- t. M# i
while ( *(_value) & 0x00000001 );*/
( x6 I9 B4 v7 e3 y DWORD dwRegVal=0;
" [7 y6 ~3 U& I/ s do
0 {- X5 w! L/ o7 ~ { ( q9 T- W% }& [* X8 }4 h
GetPortVal(PMU_SC,&dwRegVal,1);) a5 u( d' d" d/ f
}% Y* K- m# E6 s! o( y. |& e
while(dwRegVal!=0x2);3 P8 q6 s; a! |3 M
3 t- v. W8 n. H" d: A! L
}
9 F) _3 o! F4 K! }+ r9 f% M) \) N8 S2 i7 M+ l
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。( L/ B3 M0 S" {( Y! M
所以变成了死循环了。: I. c; P- a4 y1 r
: l# [$ S6 F/ U) v* d" u
我对硬件编程不懂。又不知道从何下手。
2 Q% C* t$ f/ P. l; T9 }我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。& y# q7 o* H* h: a) f
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。+ N7 C# H; x4 u0 e# J
) {2 y1 N4 o2 ?1 S% W# B; y/ P4 @. F
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
; h6 k. p' l" ^' q3 w- Y并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
) v! a, {$ K6 b% Y& g% ^- ~( a1 i9 L: |
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |