#include <iostream>
j) X. s, h4 u* t; l7 B2 d& {#include <Windows.h>
# _( v1 s$ a$ }' |. m- R% F) g0 x; P#include "WinIo.h"
: ~; _7 z/ k& H3 E6 r1 o3 F8 Tusing namespace std;) u8 L; t+ t6 ]& \4 s$ |* [0 \
* T! d$ m, c- |9 K% q2 v% S% i& ^#pragma comment(lib, "winio.lib")) A' ^% k! @3 Z. D0 j8 T. }
& Z. b) x2 d* e2 @- R& |$ L) `+ n( V6 z) C: S8 P7 ~$ y; V( |
int PMU_SC = 0x6C;//命令端口
1 J( l, l: a" O- P" w: \int PMU_DATA = 0x68;//数据端口
' E, [0 c+ g6 H! xint RD_EC_SMI = 0x80;//读寄存器命令
4 E' G8 U: T- N, m' lint POLLING_DATA = 0xE7;//CPU温度寄存器号
5 f! _. L! T( V" r4 i* R8 s) \3 w2 d3 G4 w7 J y1 U5 X" W# t. G
DWORD dwTemp = 0;4 g) Q4 b2 T& N: X( `0 w9 H
+ B! X) I5 E5 h8 P P7 y4 Lvoid PMU_Wait4IBE(DWORD *_value);
* [* d' s1 O9 N- y+ Pvoid PMU_Wait4OBF(DWORD *_value);, I: t% `8 ]& H( K( S7 T
$ S" c" \/ @9 ^7 B6 N$ s' \
+ y7 M M% ?: y+ Z- x( Xint main(int argc, char* argv[]); A( w. p }. b7 G6 ]6 E
{. L8 E3 k, J! p/ |; d, j8 D( h
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;$ i2 h$ J% y f( k3 u' x3 g
% O1 p( i" S# G3 D1 G1 v {9 \
+ R6 l( y2 o* c8 M& L //1、mov dx,PMU_SC //
( O7 }3 x5 L" l! F* g- O/ k //2、mov al,RD_EC_SMI //) \4 B3 i1 k6 X) U `1 Q/ [
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
$ M) W, z6 U/ ?$ r //4、out dx,al //将读寄存器命令放到命令端口中。& B% R7 P$ D5 v: Z
1 |# R1 }: l$ A* N( Z l PMU_Wait4IBE(&dwTemp);
7 |* s! B7 y5 w/ N+ R : ^9 A( A$ [" ^/ B
SetPortVal(PMU_SC, RD_EC_SMI, 1);
/ Z4 _+ ?' t9 e; x
) V" G0 l1 ], O- d. c PMU_Wait4IBE(&dwTemp);
& o& \3 Y9 h& M& e2 S! L; P7 d
9 E5 ]$ h* U) \ SetPortVal(PMU_DATA, POLLING_DATA, 1);
, [. P1 p4 e! w' F7 z8 V) e
T& j( `/ ], x6 T PMU_Wait4IBE(&dwTemp);* ~& g* h8 d i) M6 o. q& ?# u( w1 V
& w, t0 |6 y9 l8 O cout << dwTemp << endl;
) p- i; F4 \4 K/ _- [ @ V
" l4 q: H5 f# R: y2 W( P, d ShutdownWinIo();) } l; G/ z9 K8 @% s
% w: K; f7 ]- x6 C3 Z' Z system("pause");
% x. o$ C( a/ z) R4 w
- _) V4 ]4 T0 v3 n5 H- i. Q2 H* z6 L return 0;% h7 r% x5 \( m* A+ D9 f
}% O* H* o; ^) e% U: y# q
) ^2 h# p$ ]( U' X G; E
void PMU_Wait4IBE(DWORD *_value)2 B* t: }3 y$ ]& e
{
: n% H9 [- ?+ @* `8 v //######################################################### # W5 S* v) U' O9 Q) j3 F' U4 J0 |8 [! y
/*
* Z/ A+ \9 x, F0 L: E4 [ t pmuWait4IBE proc / \4 y1 Y: _% m! U# A p/ L9 A* W& Z8 K
PUSH AX $ }1 e! G/ h! s, j6 B1 E$ t5 V
PW4IBE: k2 E6 m/ `7 q |( K6 u
IN AL, 06CH //Read PMU status " c* ~& X, ]' G/ H. h F2 v
TEST AL, 2 //Is Input Buffer Empty?
# z& K+ I9 i! G& J3 a. z JNZ PW4IBE //Jmp if no ; p0 M6 t* O: D9 P2 n" @- e
POP AX
. \) H" O5 H0 E5 I# {* e ret 8 U3 ]7 _, v: m" q. _& k
pmuWait4IBE endp //END OF PMUWAIT4IBE2 y/ \% F1 ~) i* x0 P
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空0 M. ]; g' \5 V/ E8 d) N% R D
//######################################################### 2 w1 i( y( J. U- f$ E4 Z! h! {
/*do ! f- U1 v) b4 N% j5 s3 x
{6 k; c* N; y* A. F& Y+ G0 C4 W
GetPortVal(PMU_SC, _value, 4);4 s6 m5 ]+ x y
}
6 Z$ x7 I4 [$ C. a) K- J while ( *(_value) & 0x00000001 );*/
+ b9 S1 c5 N& x* k# q" _5 N; I" G* ? DWORD dwRegVal=0;3 ~, d& o: M( D, G, W! F! I
do- r& Z$ }% q& _
{ & ]6 b; i8 t/ P" h D$ G* b
GetPortVal(PMU_SC,&dwRegVal,1);1 x5 V0 F/ \% P
}
9 R$ K8 O1 s) A# s" j1 u. M while(dwRegVal!=0x2);
+ o5 ^ p- |3 N9 c: G6 e: k. Z$ H3 }, F B5 J
}
' x( w. N3 L/ n, [0 @
3 z( {' @" L: ?6 A9 n以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。* ?% E' }! A7 O
所以变成了死循环了。
& Y4 [+ D. ^: ^* w7 r0 b% @ E2 Z4 I) k0 Y+ | c+ j5 t5 p( z& b
我对硬件编程不懂。又不知道从何下手。
f- ~9 T2 H# o; b" z% k我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。0 _1 V, y4 v9 M" B3 w' p
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
* m4 _8 X2 { u6 x: L3 t. V6 }
. q& T2 E8 I+ e" K我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
$ N: [' n1 v- w7 J6 Y! T( o并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。$ x# w1 L& n8 e- J( p* w
4 E4 u9 }" u _/ y, ^& v感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |