#include <iostream>
. t1 o% H" e' \#include <Windows.h> w: \1 N7 D' O% g0 W6 R8 S
#include "WinIo.h"# b: L; z# |4 u% r7 d7 s! M
using namespace std;
; W6 P: U8 p6 v- Y |3 R/ W9 @6 Y; h/ h0 @" A' y
#pragma comment(lib, "winio.lib")
# W( _- d. \! U8 v6 g5 F( I/ ]* l6 s& J& N
/ ~- h+ a- p' v8 q
int PMU_SC = 0x6C;//命令端口% z; p( f! J) c( U$ P! o' _
int PMU_DATA = 0x68;//数据端口# N* ^ z) O6 N! ?6 x3 [
int RD_EC_SMI = 0x80;//读寄存器命令
- | G2 B6 l" S& }/ N8 g6 dint POLLING_DATA = 0xE7;//CPU温度寄存器号
0 F% v5 ]$ [, O
; H& R2 ], I8 ]7 l( d8 `8 MDWORD dwTemp = 0;
5 x! G5 U m% \! w4 s6 ~: Z0 }! e! d( a% s: I2 x0 o
void PMU_Wait4IBE(DWORD *_value);
( g% u# G% a/ C+ t# a9 rvoid PMU_Wait4OBF(DWORD *_value);
$ g" P4 N0 d% ~% @
, o+ K% x! M- s I! z* U) Q5 d9 P6 W; y
int main(int argc, char* argv[])
8 A4 }# S& V6 v: T$ H4 F{
0 [ Q3 z9 j6 c& ^ if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
, H. ]5 c P- L, G% _4 _" I3 p5 U4 ?) @* P* n
; g' F5 e# a, X3 B {( A
//1、mov dx,PMU_SC //6 `7 H- F& I4 ]' ~( H
//2、mov al,RD_EC_SMI //) @5 C6 V- R" D
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了) v" k D. \0 `
//4、out dx,al //将读寄存器命令放到命令端口中。6 l; ]8 k) ?+ [- k6 q0 b
, I0 ~- @. S6 O. z
PMU_Wait4IBE(&dwTemp);6 ~4 o7 M) d! O7 n
* F* S0 {6 y* ^+ C4 \
SetPortVal(PMU_SC, RD_EC_SMI, 1);
7 g3 W9 Y* O; N" _ J( U4 s+ S
. g! l( u& ^! Z% m PMU_Wait4IBE(&dwTemp);
& s& f0 r z4 P5 N7 I - ~# t1 K+ h8 }" {* n
SetPortVal(PMU_DATA, POLLING_DATA, 1);
9 t& A. O& j- x' Q, \/ v o5 ^
+ V/ e, A% |5 I T PMU_Wait4IBE(&dwTemp);3 r; }; J5 m2 s2 W3 W+ U3 t8 G) ]
5 y* {0 z, E/ F2 \
cout << dwTemp << endl;
' E5 h" l! A" f
# u8 j# @7 z# u8 M$ A4 x& t ShutdownWinIo();0 r( f4 Q3 y2 P
: b8 {9 }3 p* z: P' V system("pause");
1 _ J1 A; f, g* ?* W0 d; ?$ y# X! C$ B$ Y" c: D
return 0;8 w0 c7 D. P; K
}/ x; W3 A @+ _% K7 B* K' K
; Q1 j6 t) ?* j9 |
void PMU_Wait4IBE(DWORD *_value). V2 g8 G; m, a
{
0 n2 M7 G" F0 V4 L //#########################################################
( s3 _ e( |3 a0 k2 X /*
0 V( K4 {* b3 w9 s) B5 z5 o7 Y pmuWait4IBE proc . H4 S4 n8 f% l- m7 }
PUSH AX
2 J O. Y8 `. p# t PW4IBE:
% T; ?/ v t+ g+ Q3 d/ x IN AL, 06CH //Read PMU status 1 S+ a3 o% T" @4 \6 w! S
TEST AL, 2 //Is Input Buffer Empty?
9 l0 u5 V' R. N7 R1 e" B0 ? JNZ PW4IBE //Jmp if no ( W& F+ u# \- B7 W
POP AX
6 }) z6 M; V+ m6 T& y ret 7 b: _7 g* |0 c0 _
pmuWait4IBE endp //END OF PMUWAIT4IBE
" X) f% c4 B- A *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空, p+ @$ t7 }3 n& D+ `0 |) {
//#########################################################
0 U3 e% ^" o# E( X /*do
" o& O& J0 p! K0 { {; Q/ s" o3 n4 ]6 X6 O( m I# h
GetPortVal(PMU_SC, _value, 4);
4 \ C3 S# U# Q2 l; Z }
2 S. I6 z' `2 f* n% ` while ( *(_value) & 0x00000001 );*/1 f$ G) J1 L4 N, z
DWORD dwRegVal=0;
5 x$ f2 Z% S( Z. Z m z3 [ do* ~6 I2 Z& ^5 F
{ ( k8 E' [8 @% `& y
GetPortVal(PMU_SC,&dwRegVal,1);
$ ~; z* u: C1 B! V+ c0 ` }; m$ I" t; z& E, p* g* F, t
while(dwRegVal!=0x2);
3 h7 d6 R: g8 c. Z) G
: H8 ^/ l" ?4 L/ _9 Q" J}
4 h9 i% V$ L! T3 @# L; E5 j _: [
4 f8 D2 ]! ?9 K$ _$ R, m, g以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
( o: K/ j" e2 M* E所以变成了死循环了。
, v: l$ H7 _) ]4 l* i/ w7 n" }
1 _# t' @2 `9 R i$ k, |! g我对硬件编程不懂。又不知道从何下手。1 M' _8 K7 J. }" d& g3 Q3 g
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
; d; j5 o4 E3 ] F, p( q/ T但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。6 D% ~& l9 h& c. E5 X
3 f: H k# C+ Q$ V, \+ {
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
; T1 T4 b: L; [- L: x并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
+ {9 K; c8 a" t6 R( n
8 t$ ~* F5 T: C/ |6 W8 q感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |