#include <iostream>
( [5 Q6 C8 Q! B#include <Windows.h>
6 ^. _ R3 ^- j, K#include "WinIo.h"
( J3 ]+ @) Y0 gusing namespace std;
7 Y* y* ` ^5 F( n! G2 S
- z) H% I' B. @" q#pragma comment(lib, "winio.lib")
0 S7 F, b6 ]$ g9 H
7 H, z f" n- {9 `3 f$ K Y1 w$ |. U3 m/ U3 e
int PMU_SC = 0x6C;//命令端口
! ~# u& ]" k8 K$ H1 C3 d* kint PMU_DATA = 0x68;//数据端口
. |" M8 R% m$ N- J% b! a4 @int RD_EC_SMI = 0x80;//读寄存器命令
2 ~, p; }; X+ g n% |. rint POLLING_DATA = 0xE7;//CPU温度寄存器号
9 z6 Z; `3 O: ]: [; V" A: p! P8 V. Y. m1 r5 N
DWORD dwTemp = 0; b( N: ~ F- d" y6 Y" h/ z z+ S
% D1 |0 N2 Z1 w! Evoid PMU_Wait4IBE(DWORD *_value);. y/ E. `$ ~- F, V! E: m. ^) ~; C8 M
void PMU_Wait4OBF(DWORD *_value);
# w) C t: r2 L, T* m4 h& z! v, r& R' F7 d; w7 ]( [
$ O6 i; m. f6 d8 tint main(int argc, char* argv[])$ S3 T/ V4 ?( k$ d* p. Y
{
~) U0 V# h( I4 z; N if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;8 q$ E' R( x( x" f5 b7 D& j
) Q& C% }3 u' ~4 N7 N& K
2 b+ T9 b" r( b( L1 p& i' ]
//1、mov dx,PMU_SC //
0 R: d# [! I& x. r C. _/ n //2、mov al,RD_EC_SMI //
! S& V; o: p) X- j( k! v+ i* F //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了/ P* ?+ [ P" m4 L
//4、out dx,al //将读寄存器命令放到命令端口中。6 i4 l! A& N t1 U) d- v% i
* s8 a _* D% ?+ _. |* u5 f, ? PMU_Wait4IBE(&dwTemp);
% [5 X! Q' O6 @& R0 W * [! y2 { D! q
SetPortVal(PMU_SC, RD_EC_SMI, 1);
. v! c6 O7 @' U+ X# `$ B! O2 [# I0 w9 w) M' H
PMU_Wait4IBE(&dwTemp);
) M3 V! H; `) W/ H2 b# x1 C3 K5 v + T; W U# n; X Y2 d. w2 J5 u1 @
SetPortVal(PMU_DATA, POLLING_DATA, 1);
& b/ b- E8 X9 s
/ X1 x5 T- w) l6 B PMU_Wait4IBE(&dwTemp);) i) s9 B& `% Q+ f" h
9 P3 @5 n2 v, }: N
cout << dwTemp << endl; 3 Y" d' R1 Z1 q
0 P2 }1 p1 ^1 e8 t x ShutdownWinIo();
% x Y0 u! j0 N! Y# k* j% J7 k6 `$ @8 m- Z
system("pause");, ]" D- D, x5 [1 ^7 n
, J* w# T) `9 w# G
return 0;
% r$ p' C1 d- V- |" T}
: p0 o$ J3 z$ P+ `2 X' [+ I+ {
% ]( W" h% a" j0 @& R' L9 M- Nvoid PMU_Wait4IBE(DWORD *_value)# x/ A/ Q: |( J* K+ N: g; O$ _
{
# Q7 K2 j* T/ T5 q$ n //######################################################### 7 O$ ?2 N H- X3 O$ `
/*0 Q& V5 S# Z$ u# K; Z1 N9 a4 ]0 C
pmuWait4IBE proc
, n+ o) {/ E+ G k# s4 D& V# p PUSH AX % e A4 s% o9 M m& U
PW4IBE:
0 p6 n7 b4 s. W# e5 z IN AL, 06CH //Read PMU status
+ J/ }; p% y9 i8 P2 A! `" N$ X r TEST AL, 2 //Is Input Buffer Empty? ' g: d8 _9 |2 r& q* j
JNZ PW4IBE //Jmp if no ( q# G z1 i9 n/ t0 ?8 `
POP AX , l+ U- M8 V0 `. N6 a% @7 Q
ret
1 \# F, J: B8 z8 |2 N pmuWait4IBE endp //END OF PMUWAIT4IBE
& m9 q3 p5 }; W: ^- M5 c *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
/ z0 w+ l8 W. E* R/ t //######################################################### ( J. m% I# z9 `& w( E
/*do
: d3 R6 o$ w K3 H {; s! q" R- Q B& f4 B; P
GetPortVal(PMU_SC, _value, 4);! z; Z. c( A: h3 n$ m3 V4 A+ S+ m
}1 D5 z9 M3 Y7 b
while ( *(_value) & 0x00000001 );*/8 H, d Z. v6 V% `# l+ }4 I
DWORD dwRegVal=0;
# M- o7 T! S, u4 G- x+ t# y3 v do5 N" r! k4 j* f
{ 0 S- T' G/ @- @- @
GetPortVal(PMU_SC,&dwRegVal,1);
4 Q/ D6 \5 \8 m% _' \' s0 C/ t, J; ]. M }1 q% U6 ?+ W% _3 X
while(dwRegVal!=0x2);. c3 O) T! \' h3 I5 G. Z
7 e, b0 b' k. g! |+ Q
}" u! }5 ]/ M5 e" \/ \
$ U( H7 s/ P7 |' F以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
; b" Z% |/ P8 i4 U) G. u, }所以变成了死循环了。
4 a2 E, a4 e3 _- G& E4 C+ V' N! ^! A7 K1 | m7 D& {4 ~
我对硬件编程不懂。又不知道从何下手。2 T! a% ], l# c5 I# l+ l5 E
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
7 j/ S) ^/ X2 z但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。8 K1 R( U7 Q/ h5 ]. x
: U! U z! V$ ?4 E9 L
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。4 e% e- H3 Y: }) X9 b" d
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。6 n. F" I2 v1 z5 C! o1 v T
1 G6 |1 M3 T$ K1 j+ ^感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |