#include <iostream>% `: V( K: x+ E. C1 [
#include <Windows.h>
7 I' O+ m3 p- y/ L g#include "WinIo.h"( x" L/ n! r' ^, J1 ?
using namespace std;
% Y8 p) B+ ?, o$ \. g$ i/ C
/ R. b) n9 U0 w; P#pragma comment(lib, "winio.lib"): u C0 D' j. X3 _$ M3 z
2 ?$ |1 } H Q3 J, }0 C* ?. t1 ^6 l' f4 `9 e
int PMU_SC = 0x6C;//命令端口
8 B1 |2 {8 L! m& k* hint PMU_DATA = 0x68;//数据端口! U* ]2 A! M1 x0 Y
int RD_EC_SMI = 0x80;//读寄存器命令7 p, W4 Y( a) J' j
int POLLING_DATA = 0xE7;//CPU温度寄存器号
1 M* q, D5 ?' |
; Z9 V3 g+ y8 YDWORD dwTemp = 0;
" d0 J; _4 y9 g/ B( v$ F" A* ?7 b( u& i
void PMU_Wait4IBE(DWORD *_value);* @2 d/ S4 L) [" ~3 D- z( y. [
void PMU_Wait4OBF(DWORD *_value);
$ a1 a8 U- b# w. v j2 l1 i
0 w) x% `' x7 u" s
2 o. S. r1 h* A7 O! w) V4 dint main(int argc, char* argv[])5 o9 \7 C& b0 l$ _1 p
{; O: f% i1 X. m- [3 n- _2 D
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;. P2 X9 z" @" f2 b2 X6 h
% L2 @+ e2 S; L
1 n, l% g( m) h, d" Z //1、mov dx,PMU_SC //
9 A x8 J+ w T( C0 ~ //2、mov al,RD_EC_SMI //
: W4 ?0 J F V; H/ N( G7 s$ l //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了8 o$ N. W {8 e* G. D$ {1 K4 y
//4、out dx,al //将读寄存器命令放到命令端口中。% @" E* P( v% N6 k+ _1 l0 P
8 T, c% z* Z1 J. _; E. D PMU_Wait4IBE(&dwTemp);$ v- a2 a0 \, M4 a/ D/ [
. e5 `: t" B. Y( {' \ SetPortVal(PMU_SC, RD_EC_SMI, 1);8 B5 d$ J: _/ g$ G, y" Q
. S v8 P& o: Z
PMU_Wait4IBE(&dwTemp);$ m) s! Z& d# L" o+ z& c' i
8 h1 _+ ?8 ^; i
SetPortVal(PMU_DATA, POLLING_DATA, 1);
# N/ W4 X* L7 Z
6 W2 [% q# h$ v) B/ U3 T- O PMU_Wait4IBE(&dwTemp);8 Q0 D+ o O* `
& c- q! m- c( c8 n+ e$ U5 {& b* o& ]
cout << dwTemp << endl;
9 q+ @% l3 Q+ B- f4 F; ~; t# I5 O+ ?7 x3 [# H2 P2 _
ShutdownWinIo();
) `% r* ^, }& j. m' G2 I0 x0 x" z/ X, i8 X+ h! \
system("pause");) A; v, @7 J7 n* y
2 V$ }; p: h, r$ e' }. x- T4 C return 0;2 p- `6 C$ G+ X5 m! @& A
}8 a: P' j" o* {) V3 e
1 c2 T( {$ G3 b; lvoid PMU_Wait4IBE(DWORD *_value)' r7 s7 P" u c
{
# u9 a( n) Y& a4 }6 j //######################################################### 3 H, ^ P _9 i0 M; P+ Y( U2 D
/*
6 b1 | n1 i1 I; c pmuWait4IBE proc - A* v2 O: E: y2 t# a( ~3 O
PUSH AX
! c4 n" U6 s! p- V- c' ` PW4IBE:
5 O+ J, F- @$ D h( F6 D IN AL, 06CH //Read PMU status
7 m6 \7 J- s+ V' y TEST AL, 2 //Is Input Buffer Empty? & s6 ?3 G* Z6 K, y
JNZ PW4IBE //Jmp if no ! ~+ W. I$ F* p8 Q( R
POP AX
3 d' c N K/ ~6 S# K) H& n( z ret # J+ v0 m2 G. l5 g2 J
pmuWait4IBE endp //END OF PMUWAIT4IBE
. @: `% W: h4 P" R( m* z. y *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空; W# j# j+ X1 M: }2 j, \
//######################################################### $ O( {) m6 v) {
/*do
9 u3 B) v: m$ G3 _: r {. }( E9 D4 ?; d$ Q4 H9 h
GetPortVal(PMU_SC, _value, 4);- S" y: B7 e4 w7 v" j
}" E& a: N! E# F. Z) a
while ( *(_value) & 0x00000001 );*/
! H$ |- F! {8 P) Z8 j DWORD dwRegVal=0;' X. a8 M) z" D) R9 V; s
do8 G- G. A8 |7 M" F& L' c
{ 1 w% k2 k; b; G: Q& ~
GetPortVal(PMU_SC,&dwRegVal,1);
; {5 X/ W/ n9 m* C! [# r }
# t8 H! I5 \* _/ y8 U while(dwRegVal!=0x2);& m7 |4 Y7 B# M. _, g& b {
) y7 z* t1 v* I& r7 m' w
}
( |; h3 N" }' y6 ^ I( p9 K. q* d( I2 X% T5 @* |7 [7 _" v& R0 o, U
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
" W# a" `6 D$ D- @所以变成了死循环了。) \2 t+ d" a7 S. J2 l
; ~1 q0 V! ?& ]) N, R6 Q我对硬件编程不懂。又不知道从何下手。
^+ |( g- m% O0 p3 I3 X我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
& d7 o. Z6 t3 [7 _% I但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。6 W% J& q( I: t7 ]; |. H/ n, F/ N
9 P& @( Q1 j$ V
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
4 W$ o7 c9 _' n' \& d+ @并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。& |- U9 r! s6 i: z" `2 d! u; s
2 D* M) r8 a6 x9 t3 M7 j2 z感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |