#include <iostream>$ w* C1 j- ]8 n
#include <Windows.h>
4 s- G( ~* a* b6 r! k#include "WinIo.h"
! {2 N: @5 \ e0 Z1 {using namespace std;% r" h* k( B+ g& y0 F6 v- T* ?
4 X5 K' p* z: W0 V& X9 _
#pragma comment(lib, "winio.lib")8 i5 j+ T5 q: O) I% C ?+ u
: [8 k$ c2 d- s- B" F( f4 J" _0 @$ c5 F+ P) L9 F" d
int PMU_SC = 0x6C;//命令端口# E8 B, a' W$ T+ V9 l: F- c' Q
int PMU_DATA = 0x68;//数据端口; b7 n# D* z+ @) c( D, S% o# W
int RD_EC_SMI = 0x80;//读寄存器命令. t7 ^/ Z5 Q8 K6 ?& G
int POLLING_DATA = 0xE7;//CPU温度寄存器号' e# X) p4 C; h& _0 C
: D8 H6 E% d* P. K$ N
DWORD dwTemp = 0;
% N; R& B8 X5 ]- ~- D
1 ]+ V9 B9 I2 ~" R9 n+ } Gvoid PMU_Wait4IBE(DWORD *_value);
! h8 W: y- ?- a. `5 Tvoid PMU_Wait4OBF(DWORD *_value);' o" u( x6 _# c- P
- F5 z1 l# @, i i0 O; |9 B( q4 l& ]! P& \' n( E1 k
int main(int argc, char* argv[])5 L# y" X a* P- A/ W. S
{: D% k7 c( [ F& D" U
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
( e6 a7 v) y, d9 m! d$ X9 r) _# s$ z, P3 P, V
. @6 g% u! @% G# d
//1、mov dx,PMU_SC //" q9 U- n1 ^/ R8 k
//2、mov al,RD_EC_SMI //6 Y' K9 B- ` g" }) S v7 |
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了/ |( `& s- s7 \
//4、out dx,al //将读寄存器命令放到命令端口中。& m( D7 m8 ?' K9 u% J' T$ k
6 J0 h0 Q! v, T. a PMU_Wait4IBE(&dwTemp);
6 X" s, M) c) i# E1 f
. G/ P: w J6 J' A0 H! F { SetPortVal(PMU_SC, RD_EC_SMI, 1);
+ \! x0 S$ k5 A! { G1 C4 n# i# m5 S; e, ~6 L5 g! {; S: i
PMU_Wait4IBE(&dwTemp);$ ~8 u7 b# t3 `" }, F
2 P; g+ ^# n. o8 f) a4 f" M
SetPortVal(PMU_DATA, POLLING_DATA, 1);
: ^' `! Y5 E5 a" L }. H/ w9 b7 |" P) h0 v
PMU_Wait4IBE(&dwTemp);7 n# w! x: g4 a/ |* f# y
' } K5 u9 t- K5 S$ s5 t% ?9 { cout << dwTemp << endl; 0 i3 g$ q R5 E+ m3 V* Z
$ t9 }9 v* u0 N4 N0 u1 P) G; p
ShutdownWinIo();/ f5 i0 z/ D" w" N
3 Y4 x( A4 Q5 W) s# S0 K! [
system("pause");
" ^8 }: e" ^" s# e- l- v0 E7 z$ G4 p* O2 N
return 0;
: s' a# f0 F% z/ H0 l, Q3 F}
?* ~# R, N" j
; j+ T2 B. t! Cvoid PMU_Wait4IBE(DWORD *_value)+ Y! n& _5 g/ `& Z/ R' O* S5 \5 `
{4 ?4 b9 g' a2 W d: J0 y& A
//######################################################### . A) \( p" X2 k& u7 z6 r% j
/*
( x5 u* N8 X7 w" Z. G0 G pmuWait4IBE proc t( ?7 y$ a4 A2 X, o" s; x
PUSH AX : j/ r& Z3 n4 x4 E/ D6 s( q I
PW4IBE: ( |5 _9 w8 ?- D
IN AL, 06CH //Read PMU status ) u w* F# q5 y. x
TEST AL, 2 //Is Input Buffer Empty?
" |$ T+ H8 m: r. |/ k* B8 s JNZ PW4IBE //Jmp if no
# g1 h* y) b* `% L* y: ]- ]0 m POP AX
9 q! S9 a- P9 x8 z* x ret I$ @2 J- z0 D5 Z) `0 G
pmuWait4IBE endp //END OF PMUWAIT4IBE* Z- }1 Q( B$ z% t
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空- [9 ^6 y' r# Z$ \- i' v
//#########################################################
+ s1 Y) ~8 W4 `) u /*do
; F' u0 }$ l ?/ \: C o) ]9 |7 z5 { {" U# o2 M/ u$ J( p6 C2 h7 F
GetPortVal(PMU_SC, _value, 4);% p8 S' f2 m9 J" F
}4 V S, R' p1 v8 y( E
while ( *(_value) & 0x00000001 );*/
9 j$ \. V% g+ a- f: h4 i$ H% C DWORD dwRegVal=0;
% d/ H7 N! ~* ]& D# i: ^ do
2 m8 Y6 E) @' o9 f$ X) e { 7 v- H* p5 Q& u" \; ]& P
GetPortVal(PMU_SC,&dwRegVal,1);* Y4 A9 J! c1 A# ^- ~6 B( S$ l% P
}
( |+ w* x+ A) l _! ~% @: { while(dwRegVal!=0x2);6 h: N# F8 U* b v' R% R
# n3 J# n3 R8 W+ T& Q7 ~
}
# L$ E m6 N: h) |, q% z5 T- I- L* U- R$ A" R9 z! a
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
% F8 v {- N$ H0 d所以变成了死循环了。
0 o6 ` B( F9 y& R. t6 g% \" }# v9 I! r* S1 {$ t9 g
我对硬件编程不懂。又不知道从何下手。- J& M7 J$ v) K& L6 d1 y( R& ~$ C& T
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
! x8 W7 P3 a( j# k% h+ Q但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。. ?1 z3 K& u2 Y9 [6 T& r
U# d/ U; R# _( K7 x/ a: @# Y我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。* c; e5 s0 S/ d
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。# p" Y: Q! V) E) o2 [/ N8 N g
: {( x; B+ t, W8 D感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |