#include <iostream>
" ^3 y# l& }* E% q#include <Windows.h>' _0 G2 k! S7 S( f4 p# F
#include "WinIo.h"" X! a: i' Z# R4 O# C
using namespace std;2 ]- h$ M' `* G# t' F9 K
6 w9 _) M7 ?9 Q1 y
#pragma comment(lib, "winio.lib")
D* _& R4 w! E, @+ }. _% @7 `8 q" G/ @. u
' D9 @7 z3 E; [8 Fint PMU_SC = 0x6C;//命令端口
2 y. [% S# D7 j7 V2 ~0 p6 j* |$ iint PMU_DATA = 0x68;//数据端口( g7 _6 I0 N; ^8 H: N; P. o
int RD_EC_SMI = 0x80;//读寄存器命令
; ]7 O8 B3 W5 C/ [1 |int POLLING_DATA = 0xE7;//CPU温度寄存器号
' s5 k/ x" {: r0 ?( Z+ R2 x: S4 x, U/ k
DWORD dwTemp = 0;
' _+ b+ p6 u: y( R1 Y1 y
6 C# r2 X& ^3 F5 \: ~! Rvoid PMU_Wait4IBE(DWORD *_value);- p, g9 U/ |1 y6 a, p6 t7 ?" a) T; X
void PMU_Wait4OBF(DWORD *_value);
" T q! V7 _0 x- Y- \) ^4 ^% D. G/ f7 M! I& c+ V- R, R- O' G
& N6 h5 e$ [2 n g1 ^: o/ i
int main(int argc, char* argv[])
1 M- @/ N$ Z2 }; L{
0 d: L6 c( n+ s' x6 i5 f5 ~6 k' Q if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;: X- i6 a3 R+ [5 {2 R$ D V/ Q5 F/ X
- {0 [# C/ ~! i$ [, ]) |
`( E0 V6 V3 Z2 r: p //1、mov dx,PMU_SC //# \3 y. N3 L6 C" R
//2、mov al,RD_EC_SMI //
9 f: Z5 b) A8 C+ K( R //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了 i* I1 D+ n _4 h9 y
//4、out dx,al //将读寄存器命令放到命令端口中。$ n# G6 o: G; V0 R/ o( J
* U& M2 h- B, J2 M; f$ o PMU_Wait4IBE(&dwTemp);
6 X6 N i) X" z. m% [, R9 g 9 x! l- m* B& y0 f I( m5 Q
SetPortVal(PMU_SC, RD_EC_SMI, 1);
6 n$ M( u4 }/ E* c0 ^* h3 J. B7 |9 k9 K+ c* S
PMU_Wait4IBE(&dwTemp);3 f) @ X- h; w; ?
. E0 P- ` d1 X4 A1 i+ D
SetPortVal(PMU_DATA, POLLING_DATA, 1);
1 P% J# j' ^. f7 X7 e
, G+ ~8 E( p; W, u PMU_Wait4IBE(&dwTemp);
. T3 A: t% E, J7 Q# }0 R+ \# E0 L' J/ j5 i+ Y. E1 t2 L
cout << dwTemp << endl; 4 d+ s2 v4 W" k( |
. u% n( W: j2 [& E ShutdownWinIo();" o$ O" `4 {" k- D2 C% H
) M1 }4 M8 s c$ g4 m system("pause");" J: Z% m2 Q1 a/ C, Z7 ] T
2 K* B: K' h2 x* z
return 0;3 {1 V# S, f" Y7 c3 l4 C
}4 _$ @& m2 M @0 \; _
2 m. _. S2 E" E+ X' y. Nvoid PMU_Wait4IBE(DWORD *_value)9 `/ I5 z8 `% ?- d) Y
{. u% u( f: t% B+ }# \. x
//######################################################### : x% X7 H6 T" A
/*
- z( ?, n C' i+ ` pmuWait4IBE proc # }* c2 N* `+ _$ I
PUSH AX
+ K0 h& F3 X, `" N/ s PW4IBE:
% p7 ^1 Q& G2 A% X# X IN AL, 06CH //Read PMU status
8 B# @; @9 ~0 e& p+ q5 G n! n TEST AL, 2 //Is Input Buffer Empty?
; x2 l- j: E4 r. A! f( [ JNZ PW4IBE //Jmp if no * l' z5 M% [1 A7 w
POP AX
! a8 j% B$ B; R ret
$ U0 x" _9 c- s% W5 r- q) ?, p pmuWait4IBE endp //END OF PMUWAIT4IBE
4 Q% O2 X; K6 n% r *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空& t- v1 C6 o( i( u: s
//######################################################### 8 U; [ s; F3 P0 C3 [& x
/*do
6 e' M4 E4 E9 g' e5 z+ I# @ H {
' t# t2 Z" r2 o2 `! V GetPortVal(PMU_SC, _value, 4);6 y& v Y7 N2 y, S8 R a d
}
& X7 A4 c% G8 H while ( *(_value) & 0x00000001 );*/ t( @7 s6 @$ @. ^3 r4 F& x
DWORD dwRegVal=0;
8 w7 }" r# ?1 e7 M do. ~ I! V: D9 F& r1 J8 q% W
{
# X9 U" u( t* |0 @- q, x" y9 h GetPortVal(PMU_SC,&dwRegVal,1);8 z+ c' |% k( h; S3 s3 H) h, x
}2 I6 ^8 I0 `9 c& e" q5 E: h
while(dwRegVal!=0x2);
- q W) w) s* A/ f* w. g
8 q0 z7 w8 h6 o) I6 {}: C0 Y3 E. l( C$ _' i: S* U1 e
; X) t, q0 x N+ V以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
9 s& J# o8 D7 _1 J2 X* c0 A所以变成了死循环了。
* v' w( U- @( u. y( y2 C- a
' K6 v* S% }* \0 }我对硬件编程不懂。又不知道从何下手。
; [+ E6 a9 c. o2 h! E4 ]; m. B2 `7 ]我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。. g% ~) ]" _% R$ X# Z
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
! A1 R, O; ?; S* j
( U3 S6 A$ x7 A# U9 }我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。- U8 _, ~, x8 E
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
+ _; b7 k4 z4 D9 {. W& c; k/ U9 r: X5 D v, S& d3 N+ ^
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |