#include <iostream>
7 Y: R" f6 `& x2 u( b* r#include <Windows.h> `: ^& _7 U L- c* i" ?# X# J
#include "WinIo.h"
" s+ f: p( R2 P6 kusing namespace std;
3 ^3 X* S6 O8 f, I6 l3 x* R; q8 } G0 Y' K5 |" f) ~. p
#pragma comment(lib, "winio.lib")& P5 I2 ~$ E, V: |3 u
7 D1 x- ^% O6 \5 B
; N; Y( |. H8 N' g8 lint PMU_SC = 0x6C;//命令端口" o5 l; ^8 B# E% a
int PMU_DATA = 0x68;//数据端口$ D0 k3 ^3 {: r- q
int RD_EC_SMI = 0x80;//读寄存器命令
q& I) x) F# e. J% C3 fint POLLING_DATA = 0xE7;//CPU温度寄存器号
0 y3 s# s' v# T C5 G
# U c' Z! T$ fDWORD dwTemp = 0;* x+ O7 u/ |5 b$ z1 g; ^: P
$ a$ U4 n5 j$ s/ C5 _& ^# g
void PMU_Wait4IBE(DWORD *_value);! {! O4 W w( I
void PMU_Wait4OBF(DWORD *_value);1 k/ v" \3 W1 n. N) b
4 I: x/ j8 @5 c, [- a2 y$ W, w
% @( D. T4 P3 G$ Q8 O6 R- ~int main(int argc, char* argv[])
% G- K+ C/ e3 a{
. p4 Z/ _! N0 u( K+ D if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
& g W3 X& ]8 M- h( u; v$ Z7 J& a: n, S- e1 b# b6 U3 i7 m
3 z7 f$ T- o. w& _0 ^
//1、mov dx,PMU_SC //3 h$ j b. X3 Y+ L% ?
//2、mov al,RD_EC_SMI //1 N. M0 Z* E: l1 Y
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了8 u4 D, \; a0 f3 J7 `4 {
//4、out dx,al //将读寄存器命令放到命令端口中。. I. i# s( t b; {( |4 D! A
- @9 p( {' l) m3 n+ ?0 H PMU_Wait4IBE(&dwTemp);0 W( C4 e4 S8 c; _
+ p7 B2 M9 {2 u* e- o
SetPortVal(PMU_SC, RD_EC_SMI, 1);
8 Z4 i( o) u3 o! A8 x0 _- B. {5 p1 ^# t' E% ?
PMU_Wait4IBE(&dwTemp);- a' f: @8 V$ m/ z
' N# m$ j1 Q! H9 j& E2 P6 g9 J* y. t SetPortVal(PMU_DATA, POLLING_DATA, 1);
* d- s, \- w4 c3 [, l9 l) F& d
7 e/ ~3 i' Q, G/ z PMU_Wait4IBE(&dwTemp);8 G" Q5 U# k% j( s+ d$ n0 `: f; k
* Z h0 E, B! w/ _0 O: x* h' S$ N
cout << dwTemp << endl;
% \# s7 R- e* _3 [. n/ J
6 v1 z2 r: X( a- b- H2 n4 A ShutdownWinIo();6 A: i4 F3 ]' ~" n7 g+ p
- j" |4 [. B6 ` system("pause");
; V( d$ O/ w, h* X& G* _. Z9 o5 D& u0 W$ Q8 M1 r
return 0;
; Z. m6 S$ e2 t% v" d}
0 |+ z# T. |7 P) V) }
( A3 D/ i+ p" R G1 rvoid PMU_Wait4IBE(DWORD *_value)
& a; R9 z |* G2 \0 M* ?{
$ {$ N: F, ]( @. \1 [; b4 }) i" u //#########################################################
* r$ H! B) N/ Z /*
9 @$ t! x: S3 {) k% \ pmuWait4IBE proc . a7 |6 {; Y, S' S9 j
PUSH AX
; c: R8 B6 S" r) K PW4IBE:
* m+ E# b: h( H/ L IN AL, 06CH //Read PMU status
0 V1 s% q% I- F* l$ g TEST AL, 2 //Is Input Buffer Empty?
' B% |. K6 V2 h8 _% B% } JNZ PW4IBE //Jmp if no e3 \& f# }( t, g1 D3 O. t+ k
POP AX
& i+ h7 H; ?7 i1 U, V ret
) V: l( S% n; f pmuWait4IBE endp //END OF PMUWAIT4IBE, T* n/ B2 [1 U+ d
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
& z0 u$ t7 f& a) K //######################################################### : r# f- R9 s6 @) V1 l8 g
/*do ; ?8 h& {1 t/ P) \5 z$ q
{# f5 M/ S- g, g/ P3 a
GetPortVal(PMU_SC, _value, 4);" H7 U6 k: A3 o! @: | M6 q
}
5 c$ o/ w! m0 \9 v5 _* r; F, z; a. x while ( *(_value) & 0x00000001 );*/ ?) R* U w' X0 n# u* s0 K
DWORD dwRegVal=0;) P' z( [5 ]% S% x
do1 O; b8 J5 ^5 q) G |; B8 j1 Z
{ " _ W. n6 y* [4 w J
GetPortVal(PMU_SC,&dwRegVal,1);
( _: A+ W) E5 i0 S ?! D }
$ T i1 j- I! b5 [% i/ j# F while(dwRegVal!=0x2);
7 T1 W$ ]8 u. d0 @; Y) G$ l/ F3 T! B) m
}: L$ ]# O" O$ e
/ Y" y% Y& P' _, X n6 N* ~$ u
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。 a. }2 C- A. o& R( k: |8 h
所以变成了死循环了。) K' u+ }: R; |) _; I+ J( s
; M7 f6 w" D9 O6 y
我对硬件编程不懂。又不知道从何下手。4 h; e$ Y. G( M5 F: y$ R
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。* Z5 H: D! i ~ S, |0 l K
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
% D7 H2 M. L+ J7 x7 z3 t$ a& N5 k/ Q3 _( D
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
+ V4 A3 t# D3 D" d& [: n并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
9 Z( q; y3 ^' ^3 }9 s' k1 O& v3 h# r _0 N: E
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |