#include <iostream>
9 n4 S/ y# }) A: B#include <Windows.h>
+ V/ R- z& z3 N- x0 f- d! T#include "WinIo.h"* Z, X$ I% n7 }6 l: F, f
using namespace std;2 W& b- p6 A' v! z
( ^" G1 Q! v# X& g; y6 |4 Y#pragma comment(lib, "winio.lib")
) z0 v V$ L9 t4 Y: L3 E/ y" ? T, {( Z- Q3 d
/ H) l1 F4 O3 r) ~
int PMU_SC = 0x6C;//命令端口
/ u, f* Z9 N: N3 U& @: zint PMU_DATA = 0x68;//数据端口6 i$ P9 i7 ]1 z8 u, o x0 r
int RD_EC_SMI = 0x80;//读寄存器命令0 E1 u% s/ y% |3 l, W3 g" O
int POLLING_DATA = 0xE7;//CPU温度寄存器号6 w. K( R- C2 H4 e, E V) @1 [6 }) t
9 h1 z/ Q) I, c3 m5 cDWORD dwTemp = 0;
6 M0 f1 S) q$ h3 N' o
+ ~' Y; [- U6 c+ ?/ Cvoid PMU_Wait4IBE(DWORD *_value);
! r* ?( |* Q# F" y* Vvoid PMU_Wait4OBF(DWORD *_value);
/ \: A9 l* W# ^+ ?( j$ c( R
7 F) k, h( i! H( J( v
) M; A. Q1 ?: b) K* }4 ~& w6 xint main(int argc, char* argv[])
- F5 j# [( H! o: X{! m4 r; ^ g5 W0 q* @
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;6 w+ n& ]2 U& }3 d2 v
1 y9 a! }3 N' F2 F3 _( c9 m; D* R
; U* I9 S" ]- q. n( l
//1、mov dx,PMU_SC //% K- S) p+ b2 }1 f* E
//2、mov al,RD_EC_SMI // a+ z. r" j" ~ c& f
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
* _/ M B$ `0 [+ G7 ]8 q; y& ?) W3 o //4、out dx,al //将读寄存器命令放到命令端口中。' ^+ i3 H1 c+ Q3 W5 d
@) e6 a2 |$ ^+ \ PMU_Wait4IBE(&dwTemp);
2 l5 ^3 r$ _2 S2 z 7 B2 A% r. o% C7 W0 R+ D
SetPortVal(PMU_SC, RD_EC_SMI, 1);0 N# F8 ]' N/ F' o
D* Y. }0 e, F+ u) E' r2 | PMU_Wait4IBE(&dwTemp);" \ g) M9 x l7 _0 h* g
9 `5 c8 b& }0 i8 |9 O
SetPortVal(PMU_DATA, POLLING_DATA, 1);
% a" L' ~: u2 D) L/ ]$ f8 q8 e3 Q% s& f8 Q1 G
PMU_Wait4IBE(&dwTemp);
1 d1 Q- s s/ G X6 v7 y8 D7 h
t/ q$ H" }" M5 D4 V cout << dwTemp << endl; * m' W) A2 ^5 u7 X6 Q+ I Z" e
7 O+ G- M, A5 M8 u' J' O u, m
ShutdownWinIo();
' y- b$ b8 p, B3 O4 ?4 n8 J0 c6 r8 g* w+ K
system("pause");6 Q. h& X+ A) b: {% U
4 Q: F* E* f1 t E/ K: ]
return 0;. z# h/ a# f/ A8 y; b
}
' d# ?/ T" V g8 ^' y0 z% L6 y5 Q# k* S# I g
void PMU_Wait4IBE(DWORD *_value)
' W# b% b+ P/ l$ G{
/ Z4 U: l/ Q/ t% @+ U7 D //#########################################################
: n7 [, M5 L/ i) ^) U /*
a, }% U7 q* b$ q# y pmuWait4IBE proc . n! s( G& F v( R, I- S4 z# [
PUSH AX
+ U% |; `- h0 ?. w% R! { PW4IBE: ' p- ^' D. s1 u2 Y
IN AL, 06CH //Read PMU status
% ~/ ~ X5 f6 m TEST AL, 2 //Is Input Buffer Empty? + h. O8 L) E3 x- m5 R$ z. j
JNZ PW4IBE //Jmp if no ! b% q. R. l, x1 O' H
POP AX % y) P- q9 ~# Y( X6 B
ret
& ]% |$ n2 u' d/ x) y pmuWait4IBE endp //END OF PMUWAIT4IBE- @+ H% v! h8 I& G4 C( J
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空. h/ i3 s _/ D) A5 v5 h
//#########################################################
) k0 P0 ]8 z) p/ K# @2 Q6 N /*do 0 U1 b- ~# }9 ^7 w3 b* z; M
{
+ f7 u0 z& z7 b5 @ GetPortVal(PMU_SC, _value, 4);3 R3 K7 x3 J4 a. m7 i
}
; a3 I* r y; ~" @4 f: X, W9 @ while ( *(_value) & 0x00000001 );*/
; w5 v z3 {( s# v5 L; s DWORD dwRegVal=0;& t" W8 W+ O* Y: l" C3 J8 ]( _
do! x! {4 E! \7 U) t" N" D
{
! O+ m0 j: `1 C# f. n GetPortVal(PMU_SC,&dwRegVal,1);
$ v. n1 W: ~) E) |/ C3 K }4 K7 @" D4 Q; ^0 T5 l) O
while(dwRegVal!=0x2);
6 w4 W/ M& u" K+ U" W4 O9 G9 x# x5 u9 E. k7 L; r7 @$ u
} A6 ^5 q* p+ U' f
$ ]$ l7 ?$ D. \: B O; t' f以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。, t. n: j1 o' r0 b$ j& Z# S" n
所以变成了死循环了。8 j" z; g4 Y. L% z
$ `- F" ~' A5 \我对硬件编程不懂。又不知道从何下手。, G7 D- Y1 _! r4 E1 H+ c- G
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。3 `1 m3 z. `" B
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
0 ]* D' y" [/ y7 [ p6 L- _
2 x! S% D8 |6 m我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。0 P8 v# d, Q) h
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。 u3 N9 F; i2 o
( s9 G) O* l, t+ G' t# d感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |