#include <iostream>
. G& i" X& e# J" q: G#include <Windows.h>$ u- H D) p- o7 e; j5 b% n5 D
#include "WinIo.h"
! }! Z1 p+ Q- i+ R9 I1 F1 H3 Kusing namespace std;9 {1 \9 J5 T: R5 t
. n4 a. \! G7 t6 o#pragma comment(lib, "winio.lib"). U( G. ]& w8 X. ~& R
( j' i% n/ @7 l0 f; k7 C2 R+ u
x8 o. H1 m2 s* Rint PMU_SC = 0x6C;//命令端口( v4 ^! {3 i! K4 l
int PMU_DATA = 0x68;//数据端口
" k, q& R( u9 A: V* iint RD_EC_SMI = 0x80;//读寄存器命令
4 t# f' A* ^% o9 r1 w0 U0 n7 O3 {- Wint POLLING_DATA = 0xE7;//CPU温度寄存器号
; k) w4 y% `* w. e' h0 Y" F" P, R7 S8 O& Y9 h
DWORD dwTemp = 0;
c! C; A# b; E+ [% c$ T* `
) P) `# }; K: ~' A+ s$ ^void PMU_Wait4IBE(DWORD *_value);
; Y- ^0 V7 v7 D2 Fvoid PMU_Wait4OBF(DWORD *_value);; x5 Z/ K. j0 t5 O
: u; }1 c* h( `; k) I# g! d4 r; ~; n
8 @1 M& i3 A' R0 U4 b* qint main(int argc, char* argv[])8 X+ T0 J. L h2 }
{" R S$ T6 l; @
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;) @) n3 D* E- J
0 k. j4 |7 `0 ]) `# B7 b) t : l, o1 }9 g2 W% R% b
//1、mov dx,PMU_SC //: w u0 a+ {+ q: U l
//2、mov al,RD_EC_SMI //- E" a& K2 h+ ` w8 F
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了, _/ l9 H* p5 W/ J0 S& r
//4、out dx,al //将读寄存器命令放到命令端口中。
) f$ w4 \: e9 X
~' m: Q% [' C4 J0 f1 o7 ? PMU_Wait4IBE(&dwTemp);1 \* C1 t' F8 a: ~' w
- S3 R! Y$ v U. n3 d5 [7 I SetPortVal(PMU_SC, RD_EC_SMI, 1);! m' ^, a u& t) |9 S4 d% q
" H1 ?# s! {7 ?, Z; H
PMU_Wait4IBE(&dwTemp); A5 N# }7 E0 G1 s+ I& {9 l8 O6 _
7 J4 @ f# ?0 d, r) ]
SetPortVal(PMU_DATA, POLLING_DATA, 1);2 p5 r! p, V, Z9 R& o7 s
, C% J6 y3 y& { PMU_Wait4IBE(&dwTemp);
Y! R0 S9 k8 j1 C, ?7 x: P, G B% i; Z; b/ N/ `
cout << dwTemp << endl;
6 y; n+ d- o8 i9 {* P, U+ {( {: M9 O) E9 j+ q
ShutdownWinIo();! i1 a; R) o6 L' `
8 D$ x/ p v# @2 z \& b system("pause");
& R2 O+ c$ Z6 P E3 _* ^( k! d/ _, T0 K
return 0;
9 G: T c& f6 |9 \* N! H}
7 D7 J) i# L3 ?9 V0 s# F" Y% Z# f* s
void PMU_Wait4IBE(DWORD *_value)
( ?" }) _0 `: G" z T. ~3 Z{
, f( R- v" o3 \ //#########################################################
; x0 h' x# w5 k8 S; D0 p7 {0 @/ V /*
6 L9 y; [+ U& u2 H( s pmuWait4IBE proc - _: s' }$ |# c/ f) k$ r) i- j
PUSH AX
7 }& ]7 ?- s! B PW4IBE:
, ~$ ?- o$ H/ E$ C, b/ @* I$ t IN AL, 06CH //Read PMU status
: N2 q; ^* W& C% } TEST AL, 2 //Is Input Buffer Empty?
% `* ]6 L7 {; T4 E) _3 ^$ ? JNZ PW4IBE //Jmp if no 7 h5 K- F" v0 X
POP AX
5 K7 e% N. v X5 C* U% [% Y ret 5 S% O W1 t4 ?( {7 c+ Q
pmuWait4IBE endp //END OF PMUWAIT4IBE* R& F4 x1 }, E k
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空: Y4 A' ?8 K+ U' ^) U
//######################################################### # U; c$ }0 Z- ?8 z
/*do 6 N s4 K+ A7 y- N* q9 A
{
5 j8 \$ }% C9 v: R7 Q GetPortVal(PMU_SC, _value, 4);
# {1 U @, [; F% x8 r$ A4 F }. z. C8 C/ d9 R) a: A$ z% ~6 z
while ( *(_value) & 0x00000001 );*/
' M, z, A+ ]! V. l DWORD dwRegVal=0;" R3 x6 Z2 t; _% L& P3 \
do
5 F3 A$ b9 {: M) R* P& c) Z { 1 x' ], R$ a0 o3 I
GetPortVal(PMU_SC,&dwRegVal,1); j# A/ |' N8 X% Z% J8 q8 ~0 m: W2 D$ ^
}
. {( v8 x; ?, Z8 L8 | while(dwRegVal!=0x2);7 ^6 X7 J j( E0 z- ~
- z# `4 E0 o0 K Z0 ^+ G9 V
}, U" z+ h% r: N
" f- d* u4 @5 i4 X/ B: M b. t$ c以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
- U) L! b0 Q4 q- j. y所以变成了死循环了。
$ y2 O9 ]0 O; [' m
1 v1 U: w3 H6 a我对硬件编程不懂。又不知道从何下手。
% T) k9 y, T. ], {% I我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。6 m6 v/ F: \: [. E6 ]: {
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
& ]8 L, ?6 J! `8 o' i8 l6 @( k" f0 Z9 c
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
" o, x& m6 y! F8 t, c2 M2 E并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。, X+ }5 h# P4 F0 }3 _2 ~. F
3 [6 X4 T3 z* W2 p5 a% n感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |