#include <iostream>7 ~' P0 Q& G. M8 p& D l4 y3 E) ]
#include <Windows.h>$ M! K4 Q0 K. V4 f
#include "WinIo.h" b( ~5 m6 C/ O) x* D( D
using namespace std;
& {& o5 `& w+ A! C* w5 ? s7 M) a6 G6 @; Z# Z7 N5 ^- X, c
#pragma comment(lib, "winio.lib")) |! o' f' U [4 m: q
+ o; R# F' A* l: X% c
" W- Q2 L- X6 ^; [7 S- zint PMU_SC = 0x6C;//命令端口4 H. D% T7 Z7 h7 h$ W( w- H
int PMU_DATA = 0x68;//数据端口
/ K; \' s# E3 ~2 _3 l: B4 x( T8 j) z- }int RD_EC_SMI = 0x80;//读寄存器命令3 A0 X, S6 q @# h
int POLLING_DATA = 0xE7;//CPU温度寄存器号
& ?2 r. r0 z, Q# N5 S. E& C( s S4 e( m4 p2 \3 S, G
DWORD dwTemp = 0;# P1 J+ S" L% O6 c
k! ~3 M. w2 B7 [ bvoid PMU_Wait4IBE(DWORD *_value);/ K+ q9 ?+ }* m- J( X6 c
void PMU_Wait4OBF(DWORD *_value);
" T, p, B0 Q3 ^% ^1 g8 Y8 \4 r
! Q* T/ t( s; D7 z) z" p$ pint main(int argc, char* argv[])
s- t* v6 o) ]9 s# Q# C0 y, T{$ n& N/ c, b% U. `
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;% _) h0 |' X5 r3 {* a2 r+ t
0 y1 ?; s4 d9 {+ Z. Z! A+ M0 ^* V
* ?# l8 `1 j) L2 d //1、mov dx,PMU_SC //1 {6 C6 ~* }0 Y6 a/ T: w5 F' K7 C
//2、mov al,RD_EC_SMI //0 h+ H7 t: \6 c9 o4 T1 V
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
5 B' b( ^9 k7 ~ //4、out dx,al //将读寄存器命令放到命令端口中。% A" Y, i! M3 F0 o
- g: h$ p/ [- J2 E+ C4 r8 S0 F' y
PMU_Wait4IBE(&dwTemp);/ W3 Q& A0 _+ D4 C/ K* Q+ b
# _2 S, w8 c# j8 P" ]" Y5 K
SetPortVal(PMU_SC, RD_EC_SMI, 1);, K8 t F @8 B3 G& _8 b
( R: [! n# J" ^, {5 J" ^1 {3 ? PMU_Wait4IBE(&dwTemp);
4 h- B% u% M* B( O' z2 K
7 k* @$ H/ n$ B- Z, l# g8 V) [ SetPortVal(PMU_DATA, POLLING_DATA, 1);
2 ^6 _) b" T( {# M/ M( S+ ~0 H$ T% X0 I* ]
PMU_Wait4IBE(&dwTemp);+ }, `7 @- @" F8 |8 R2 k
$ q6 e2 h: o+ z) X" F: a U
cout << dwTemp << endl;
) H. j2 A5 Z) F# x
. h/ S: k8 w( `: N+ _" W% R- P7 j& t; [& C ShutdownWinIo();$ m& D: ]/ D6 Y0 l
0 c. Q* t: G0 g i5 m
system("pause");9 b1 K8 j+ ]& ^% O
# a5 L- e, r6 D0 D3 l5 O7 M i) m. a return 0;
2 L" S. N( i y}
( c2 W8 l, j; T8 Z; D! P
9 r6 }* j0 e; k6 dvoid PMU_Wait4IBE(DWORD *_value)* [" A. g& V. s! B/ Y& I
{
# D9 t0 l6 O* f4 m8 H3 T //#########################################################
% ?9 j6 G7 A; [# C8 V /*
' v% y' Y& ?9 f pmuWait4IBE proc . g5 y- }$ ~# Y {$ R
PUSH AX ' Y3 ]2 `, U: G& a! M& E
PW4IBE: 5 d5 p! w: V0 f: f* I m2 N
IN AL, 06CH //Read PMU status " ^; w% s: x, O: H+ v
TEST AL, 2 //Is Input Buffer Empty?
) |* a' Z/ m4 M7 m JNZ PW4IBE //Jmp if no
) _. v" R8 h7 @7 ~ POP AX
& H% q$ f, r$ c* X7 S' Y r ret
' u" _; \! M4 h pmuWait4IBE endp //END OF PMUWAIT4IBE2 L1 {2 e, U: o0 w. e9 a8 ^
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空1 u; g/ j2 b8 t4 u
//#########################################################
) i1 V( ^7 s; o' K /*do # p" l ~' C) U9 P; w( Z8 q
{; r3 @, A3 Z) W+ p* J" O% S" [7 w
GetPortVal(PMU_SC, _value, 4);
* h; z( X4 a x( ~! _. ]1 A }# z6 Q3 _2 f; r8 M
while ( *(_value) & 0x00000001 );*/
' b/ Q8 e/ {% G6 W7 y* O. N DWORD dwRegVal=0;# O. t- n m' h
do
) h4 n) Q, t2 a8 ~* L" [ { - N* D! o$ f; l9 Q5 ^% }3 a
GetPortVal(PMU_SC,&dwRegVal,1);
* |( P7 [1 p8 s( w! }5 Z }
( j i% o4 Z3 b N* s9 x, R- l while(dwRegVal!=0x2);( V; O, U4 }. C/ i
+ d( x. ~, y6 j2 M}
! i* Y5 q0 \: g8 P- K* _. u+ N0 P# I: H# Q; R* A
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。; o+ L3 E( G& R" |+ W5 o, K
所以变成了死循环了。
- b3 R/ Q+ G5 Y( A5 {( X/ h& P5 D8 j
我对硬件编程不懂。又不知道从何下手。# s# [- m0 q4 p' }( V
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
0 F8 I1 y2 S# \; K1 L! a但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
4 c- f& Y# J/ \
$ H; E8 R, A% c5 S7 V我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
7 Y ^( @ m/ ~% p+ N并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。. {' T3 { Y! a
, @2 M# V2 s9 _% L, n
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |