#include <iostream>) A, x% y% L1 B/ D
#include <Windows.h>) {, E% r6 f" R
#include "WinIo.h"1 }( H% c& J. i: C9 `
using namespace std;
* _! d" G! J& i4 t7 n9 P* J$ P& q* U' U
& q* ~6 W! E$ z4 B#pragma comment(lib, "winio.lib")* M9 `, P2 J6 z8 Q v
O b! s- b% O3 Y2 f
& W0 D) C$ a m, S% {
int PMU_SC = 0x6C;//命令端口, P" k9 k1 j8 c- \7 O
int PMU_DATA = 0x68;//数据端口1 s( n, x/ I/ y0 j" L
int RD_EC_SMI = 0x80;//读寄存器命令
7 w; E0 g+ j) C( y) rint POLLING_DATA = 0xE7;//CPU温度寄存器号% K, f* q- B8 x2 f: ~+ L
" m* m Q0 T8 B* G3 X3 i) ~DWORD dwTemp = 0;( F; B& M `$ S& g6 F
( `6 R& X2 P# j }$ Z2 Svoid PMU_Wait4IBE(DWORD *_value);
7 k- S8 t" ~- ]+ mvoid PMU_Wait4OBF(DWORD *_value);
# N; g& [1 M- Z7 U3 i6 {. d4 R% [% n5 t4 \
, j8 [+ T0 b; F! ?5 h
int main(int argc, char* argv[])9 R4 r& G4 U: Q* h- T
{3 @) c- D* i# V7 T5 G) @
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
* o. x; c( ?6 N
- V! @! A- L9 b) l5 Z0 \7 k
1 c( T/ D, @! ]& O' i0 f7 ]& X //1、mov dx,PMU_SC /// k4 m* t) m0 Z3 p2 v
//2、mov al,RD_EC_SMI //
) j" e3 R" @$ y; e. d //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
* d! p9 p- l0 @- ~" o //4、out dx,al //将读寄存器命令放到命令端口中。* f$ y4 t7 i: F7 e2 Q/ t2 V
$ F% U3 x' ?7 Q9 H PMU_Wait4IBE(&dwTemp);
% G+ \ ?6 N% Y + r# b$ f3 z; x6 o. A& {
SetPortVal(PMU_SC, RD_EC_SMI, 1);% _) z9 K% k9 Y& [
; W; n. h5 u# V! q
PMU_Wait4IBE(&dwTemp);' R" _# P1 P: o% f2 ]0 w0 a6 V
3 a2 p- Z" Y1 R. z% X
SetPortVal(PMU_DATA, POLLING_DATA, 1);1 B$ E n. ^/ B" n$ \* c& C
( W- c, D8 C; S) o S* X. }3 E1 l% k PMU_Wait4IBE(&dwTemp);5 @; W- |1 s4 w% _* J- u; Q/ U
2 t8 b( o) G( }, ?# }/ F. _ cout << dwTemp << endl;
! Q- p8 u. o- I* I# ]
) S+ b" i5 b3 I0 Q: M4 @# L. R+ a ShutdownWinIo();
; ?1 F) ]3 B) |9 c- p0 W5 c3 Y4 ^8 ^& ?: U9 H; h
system("pause");" Y% S) R' ~3 y9 b
' d5 m2 c( r# ?( }5 M
return 0;
( b& C' u Y* u. F}: ]0 w. F7 Z3 P5 o
0 Z8 N" ^# f, j4 {void PMU_Wait4IBE(DWORD *_value)
; t* Q* }1 V& \{
" x/ O; U* B4 X3 G* b //######################################################### + m: Z0 Y% M, T
/*
% J$ x2 }5 i) n5 G r$ k% z pmuWait4IBE proc
" T: y x( @- l2 v/ V PUSH AX
* M7 z* i8 I# k# s$ I PW4IBE:
; h, f# q& h( s" w* r8 a- C* N IN AL, 06CH //Read PMU status ) i, ]+ `. o; J* ]& J! p( {. \. S
TEST AL, 2 //Is Input Buffer Empty?
. U3 U5 d# v' R8 i% L4 @. N JNZ PW4IBE //Jmp if no
! r8 O% Z) i+ s' @2 J# \- p; p s POP AX 7 u' H2 S# l' @ v
ret
/ E5 ]+ c7 F5 j+ d pmuWait4IBE endp //END OF PMUWAIT4IBE
7 T1 \8 b8 ?& Q# w *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空/ F# w. d- [' k0 w4 L# E7 \ o
//#########################################################
! K; Y3 ]8 E9 p2 ~0 m6 P /*do - E0 T6 r' n. k0 u" b# p/ o7 y4 }
{
4 m3 v9 x! C& f4 x7 L GetPortVal(PMU_SC, _value, 4);
% C' u( u3 f0 w0 a! l- c8 ^ }
+ l1 N4 K! k* [* p) B3 q+ F2 [* ~& Q while ( *(_value) & 0x00000001 );*/ l: t' L, V6 _- T& e" z
DWORD dwRegVal=0;& B' b& g+ N8 F4 j2 ^* z8 P3 }; H6 I
do* I0 p- F$ t9 @5 {$ Q( J' Y
{ 9 \7 W4 l! l. \6 N1 J5 }7 a+ U
GetPortVal(PMU_SC,&dwRegVal,1);
* @4 {7 g/ m. F( w9 o# Z) b }
& J7 U2 C" M" t+ d9 @ while(dwRegVal!=0x2);9 }3 F% y; [+ c
' r, a) g D1 }' J
}
0 c- u; W+ w( N! Q) m" Z1 w3 Y, J. q+ ^* b$ n! ^8 i
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。: A" R) \7 T5 L$ b) H% x0 A5 M
所以变成了死循环了。
# H# B5 m; N' y. A1 q. ^1 M) f- p4 h! {! e6 `
我对硬件编程不懂。又不知道从何下手。
6 N) \( K W4 f4 Q6 l3 z: P/ Y i我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。6 f; j% F$ }1 ^3 A; Z/ K, W
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。! x8 D0 e2 s/ B" D$ k
: }/ i5 ]8 V! k, Q- ^8 n
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
! i) p2 s4 I. j6 n并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。( z8 k# Y' ]+ c7 ^3 z
! K5 {/ R# {' \: C感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |