#include <iostream>! d8 {' k5 p+ s, M
#include <Windows.h>
" \6 [! u9 T9 \* v* q: I) c2 D" w#include "WinIo.h"$ T; k; R) N$ |8 T: F! @
using namespace std;( x" \9 I$ i, m' k
9 C. S8 A+ P7 f% Y2 e. i3 ]) o, s2 N#pragma comment(lib, "winio.lib")
" L2 m- U, K$ ]4 s/ `0 s5 P/ w6 h! u# a
9 N' R, r, c6 g4 e% i( o
int PMU_SC = 0x6C;//命令端口( K" F h/ | O |' A
int PMU_DATA = 0x68;//数据端口
% e) F/ h+ n4 A1 C$ {$ i# g0 uint RD_EC_SMI = 0x80;//读寄存器命令
3 V" v& n u. M3 ^! b+ Sint POLLING_DATA = 0xE7;//CPU温度寄存器号3 j6 ^* P# T8 @5 R
. p8 P. p. d9 i) R4 w7 W0 [3 r' o
DWORD dwTemp = 0;
2 {3 v, F% d0 V* ~+ ~* q) q
7 f6 R7 u7 P4 ?void PMU_Wait4IBE(DWORD *_value);
' S! R4 G6 u9 j3 Jvoid PMU_Wait4OBF(DWORD *_value);
7 g! P- f+ }; F* U( d" X# {' ~% F6 K; j/ Y
6 _ {7 R4 y* \& X; V% R5 D- C# Y0 l
int main(int argc, char* argv[])& {/ p) ]* I8 U7 Z8 t/ U9 E& F: k
{/ v& T3 b" X x3 k/ ~! y
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;& H% V1 S8 g2 ?, c* N/ Y# ]4 a
0 W7 k$ @) |8 } d
. v, X) K6 c- g- Y& R3 a) \* y; B //1、mov dx,PMU_SC //
7 u% ^2 O/ C9 \6 S6 }- B //2、mov al,RD_EC_SMI //
8 C$ p0 ?! F& F2 Q f //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
$ K/ z; u, y0 _" y //4、out dx,al //将读寄存器命令放到命令端口中。( ?+ }' s- p5 L
1 ~) v1 p0 b# Y* x1 R
PMU_Wait4IBE(&dwTemp);8 ~, S, A2 I& A# I6 e4 M0 Y) W1 J" Y
- b- W* d) S" O% |) [
SetPortVal(PMU_SC, RD_EC_SMI, 1);
- X- o3 {; @4 q: l) q) ?- }8 A$ {
, R1 ]# N* I1 c+ d& a5 _/ ^ PMU_Wait4IBE(&dwTemp);- N ~$ \2 H8 m( R6 p; ?' g
6 Q& E6 X% r* u: L5 o
SetPortVal(PMU_DATA, POLLING_DATA, 1);
3 o& n. A! s' U+ @& a' u' A- S2 \$ g% H1 j' s
PMU_Wait4IBE(&dwTemp);
' [4 x' O, N2 @# w/ \
1 Y0 U! v7 H, P' F2 A7 i8 z cout << dwTemp << endl;
5 s7 N7 _$ ^+ t; q z# E7 _
: {0 s2 n2 v+ v1 \0 O/ ` ShutdownWinIo();3 a+ K- T) w8 X
$ E% A" M* N! S system("pause");
0 |) k9 C& G4 ^, C5 ~
8 J0 q7 [4 t% o5 N* x return 0;" k+ A/ a& H8 Y" E
}
8 }" c$ b z0 ?, J
; N/ U( q1 o4 ~$ Rvoid PMU_Wait4IBE(DWORD *_value)
: ~2 W+ i5 ?! m& X6 w/ g8 o{5 f# \4 F' b! K" `+ ?0 \; m* |; b3 l8 \
//#########################################################
/ L0 L/ p+ ^$ V& K9 V /*
) a( J1 |* z# v' [6 ~9 B( P* a! O pmuWait4IBE proc
) z( a* Z" k& a; E2 t PUSH AX : s' s) E- q4 W1 Q. q; q& H+ _
PW4IBE:
3 r7 |+ g: [* ^; Q# ^ IN AL, 06CH //Read PMU status 3 D& g7 Y+ `. o9 {3 `# X0 |, w
TEST AL, 2 //Is Input Buffer Empty?
. j4 y! {0 M0 e% j! r; I' n* @ JNZ PW4IBE //Jmp if no 8 t( Z# ]+ E6 _/ i
POP AX ; [% p+ f; B" ^0 N" Z* y# d
ret 6 Y' a4 |: _1 }$ R
pmuWait4IBE endp //END OF PMUWAIT4IBE- K$ B7 [8 J' w2 x2 ?7 V
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空 c# S( b" r: D3 Z8 A
//#########################################################
7 m" c1 B0 a$ u' o /*do 0 c% b! x& M1 x# F# O5 p( x
{
1 e- P+ ~: l, ]* d/ A9 a GetPortVal(PMU_SC, _value, 4);/ w2 L3 H, [& `+ o! A/ Q
}6 y' R6 A y3 _! r% u! h
while ( *(_value) & 0x00000001 );*/
2 t- O/ h/ |7 q) g' A0 K DWORD dwRegVal=0;# ~5 I6 A# }8 K3 g( i
do/ |; q; x1 n6 Z/ f9 g' ?$ G% x- v
{ & v2 _+ {8 v5 `! }. }7 y+ R `
GetPortVal(PMU_SC,&dwRegVal,1);
: ?1 Q$ v: B1 i; J9 B+ X$ v }' ^; Z( R3 @% v
while(dwRegVal!=0x2);& D1 V" D. [+ {' I' w E
# k3 a; g6 A* _( J}: u; Z1 L5 R; W/ a) Q
G; n) O9 ^+ L1 n! `' g3 L: d! K以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
. \4 j# t+ e+ b; H: e所以变成了死循环了。
2 b' A# r2 q7 ]3 c i
% T1 E% ?1 F) |5 L1 e$ z: G! o我对硬件编程不懂。又不知道从何下手。
# J0 L# z; h: t9 N/ i我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
$ o8 q# a, n/ q$ H但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
: u- }$ v# m) Q4 G( N( Q" t( t9 w# A/ n2 l; k! g9 Q6 a
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
8 h0 |$ I1 z) z4 f并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。$ s4 f& ]& |; _3 w
, l" l" o) x: O: d) F
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |