#include <iostream>
2 E% x$ i4 L6 B3 {#include <Windows.h>( R- }" v( x7 t; j- H) X3 T
#include "WinIo.h"
* _2 F- Q: v# C; {- J t# V/ ousing namespace std;9 x0 I0 |( v. r5 g6 j
9 u8 s; p( v y3 a
#pragma comment(lib, "winio.lib"). n7 H1 [% D1 H l8 y3 F5 Y
* I2 X: B- N* \ n8 _ t9 z9 C. i/ L' p- h2 F) N
int PMU_SC = 0x6C;//命令端口7 {. a1 }8 R7 T+ c8 c* c
int PMU_DATA = 0x68;//数据端口8 a( `2 u1 s5 G& U5 |. n
int RD_EC_SMI = 0x80;//读寄存器命令+ m4 H! j7 B5 s9 Y4 n
int POLLING_DATA = 0xE7;//CPU温度寄存器号# ]8 S! t$ Q- Y
8 }" t* R @3 s. C! HDWORD dwTemp = 0;. o6 p: q3 M3 t4 y
( g5 b) t) r% w8 ]: Z
void PMU_Wait4IBE(DWORD *_value);2 m5 z: z$ E8 v1 i3 f
void PMU_Wait4OBF(DWORD *_value);
0 I$ x) E' ?! a3 f) D9 ?. E! `- u) I+ y
2 F- ^, j) X4 ]+ M f4 hint main(int argc, char* argv[])" M. E7 R' `( ?" m
{
: m9 N& l& G3 ?# W0 Z if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;6 n8 @- B8 R. k
& q3 h |. o4 `
9 e% Z, |, T1 h6 R8 G. A //1、mov dx,PMU_SC //! U# X( A m' i- v' O b
//2、mov al,RD_EC_SMI //
* T5 z; Z' V% |0 G7 r& O //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了7 H) r$ e5 p; X+ ~
//4、out dx,al //将读寄存器命令放到命令端口中。% S; T& H7 Z+ Q# W$ e6 C
* t* X! j9 k- {2 b* L! A5 @( W1 p
PMU_Wait4IBE(&dwTemp);
: p" s F ?8 ~& G. m) E
* T$ L) e E& c SetPortVal(PMU_SC, RD_EC_SMI, 1);
* y% p1 Z# q6 b6 B8 ?) a5 ]0 B8 g4 f8 Q2 P
PMU_Wait4IBE(&dwTemp);, p3 |" i% K7 b/ F$ V( v( V" S5 Q
* [; n4 }0 Z o$ f8 d
SetPortVal(PMU_DATA, POLLING_DATA, 1);
8 O) I) n. R: u# ?, g: W+ z1 b' ^, e6 |7 X- x. v1 e" n/ A3 Q: A2 ]
PMU_Wait4IBE(&dwTemp);
/ X2 @ @2 i) A/ L/ O
, q* _* b2 g! V$ _3 ^0 w9 Z cout << dwTemp << endl;
( s8 V; G1 }# ~5 C4 K' ]
' b( H) t9 E0 E6 z# b& f. y ShutdownWinIo();4 F8 j v* N j- i; r* l& ?/ L7 a
2 y% U& z u P& r+ Z5 P# x: v system("pause");$ a1 h/ b$ P7 p _3 H
4 e5 u8 _8 A% ?/ N return 0;4 T4 j$ b# l3 b$ i/ `/ i
}7 [5 O" i: ?5 a/ V. U& k) Q
& }, B* P/ U @; W! Avoid PMU_Wait4IBE(DWORD *_value)
% ~8 I5 z( J- I! ^ q9 h R{% Y2 c' f& s! U' M2 c) p& D
//######################################################### " I: n$ D" w* Y# o9 q$ C
/*7 {6 a. q3 A# C# h, @. b6 N! j
pmuWait4IBE proc 9 X+ R0 Z' ]; B7 S% {
PUSH AX 6 T, T: N9 f; t, `( T3 x) @
PW4IBE: 0 H) x% b3 k4 |; ?
IN AL, 06CH //Read PMU status
+ D8 |* ~. ^! V# b TEST AL, 2 //Is Input Buffer Empty? - I: p1 ^- M1 f7 s9 W& A
JNZ PW4IBE //Jmp if no ; c# j8 b7 w$ k5 ^4 O/ N
POP AX
+ f4 H% x" d$ c3 {( T ret
* e0 a+ @# H9 i, d3 I8 v! o& N pmuWait4IBE endp //END OF PMUWAIT4IBE
( D! X: \" M+ v# x4 |6 t% J5 A/ I *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
+ @' ^9 P2 |/ @: k" v6 ^ //#########################################################
4 _/ ]" c% r9 f- b) R /*do 6 A; E4 l0 `1 O3 I9 Y# `
{$ V7 a8 S$ |& ~8 c0 E
GetPortVal(PMU_SC, _value, 4);
9 u$ P- V* o4 Z }
0 k8 W! M+ q+ v/ O1 D# ` while ( *(_value) & 0x00000001 );*/5 w3 a! W! P% v& l5 \2 d# r+ r# Y
DWORD dwRegVal=0;- ?# t7 A3 k/ S6 s6 Z
do
+ G: B) g8 p& g {
6 d+ w+ T3 m, z3 {0 O. i' h GetPortVal(PMU_SC,&dwRegVal,1);
$ ] x/ G# \, \% H }$ F( ~& ^# k! U" s& _# Z! r& f2 G
while(dwRegVal!=0x2);2 B' p6 V2 n1 I- Y" H" K
- h, _; X+ \8 B# l+ v- r}
; S8 n3 }' }7 i L8 i7 Y8 b
/ g5 l! E/ s7 [9 j$ A# A以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
9 l2 A6 V6 `& |( {0 ~; E$ C* |所以变成了死循环了。; h" A& m: j U0 i
4 M! d& W7 @4 m3 I; h4 e* s! l# P我对硬件编程不懂。又不知道从何下手。
& _' O) u7 U6 @3 i# r) H我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。& _% G; k* ~* M1 H4 r N" P
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
" n/ _& |& }5 w0 J6 Y- [- X6 X5 Z5 Q, g" ], W# Z
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。+ O7 s0 d6 {& A4 A O$ X3 T
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
- K d& z) b/ l. X# I6 @4 A
5 a' G: I8 \9 X+ w感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |