#include <iostream>
; |2 s/ y9 N" D/ Y2 }#include <Windows.h>
0 `+ ^3 k. r# S1 V( _0 W#include "WinIo.h"- }) h- k1 }% N G1 s
using namespace std;
: T m/ N$ g" W# R h3 C5 @# p5 H+ o4 M, x% l( {
#pragma comment(lib, "winio.lib"): V# V3 W* N B: |2 Y: o
0 Y+ F' ]/ T! A$ K# k' {7 X/ o$ f+ q. B; I
int PMU_SC = 0x6C;//命令端口/ m: f% f2 A: [2 [
int PMU_DATA = 0x68;//数据端口! e2 j4 ^! u7 f' T, m/ Z/ U6 R
int RD_EC_SMI = 0x80;//读寄存器命令9 r. {# j7 C- f: c) `, K. p! R
int POLLING_DATA = 0xE7;//CPU温度寄存器号" O- q: |& u5 L! `, U
, ^) E+ g, V* A5 c. {) V7 J
DWORD dwTemp = 0;
" j! n' D" ^% Y9 v9 K% v7 I# H( e2 }
void PMU_Wait4IBE(DWORD *_value);
$ z! ?5 ?" l! d9 b$ i; L; }- [0 ?5 |void PMU_Wait4OBF(DWORD *_value);$ o7 c2 k! a" l
+ O5 `2 z4 H. O( }) ^5 p2 T; [) Z% p6 i
6 l& m" p# y# S) y' Yint main(int argc, char* argv[]); f4 t2 W5 c: H: D& [% N( x
{
% i5 B2 K6 h; h& J; h1 A if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;9 Q0 g" L0 d7 x2 q; V# p9 V( N9 s
' H+ z( V" L" |& x [ , p5 f1 [! s% C m+ |5 Z( y3 x
//1、mov dx,PMU_SC //
' y: i3 B7 C; _2 l( l. f* ?8 b //2、mov al,RD_EC_SMI /// g5 _; T5 H' v
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了+ X9 U* W# j# n% b4 ?
//4、out dx,al //将读寄存器命令放到命令端口中。# n L/ H' s9 R- U: R! W
; W) O6 s4 R4 O% W' O7 v PMU_Wait4IBE(&dwTemp);3 ~: Z# I$ k5 w6 Q% w, ?. _, z( q
- S0 r$ I. c& V, d: b8 v2 j( n SetPortVal(PMU_SC, RD_EC_SMI, 1);
& p) H" o8 K% q! h- y" c7 N" G
# K, b; v' P# y2 ~# B) ~* q PMU_Wait4IBE(&dwTemp);, P- q7 b7 `$ p2 \" Z$ A
( t2 Y; `1 O( n! P5 x/ h v
SetPortVal(PMU_DATA, POLLING_DATA, 1);0 U7 j# v9 g5 F& b" \# w7 e
3 s+ L- b% p4 k' q: ^ PMU_Wait4IBE(&dwTemp);
, q& M% V3 V5 @5 {" f% U) e
: g3 d4 v8 w/ Z5 t* @0 n cout << dwTemp << endl;
. Y: N9 P, ^4 F6 @" @& ~! Z1 [2 z9 I+ p1 \& W* t* c+ P3 ^) u9 |: n
ShutdownWinIo();
2 P4 L1 U+ C8 F7 D5 E# N, i8 Z2 D" {! Z! W9 M9 k& C
system("pause");: V1 N1 ?0 B; R" v. Z3 T5 |
, z2 y' ~# U0 k return 0;; c' H M8 Z d9 l- S! c6 L
}
" k" j" w! S" k. u4 r) a" h2 r# H
void PMU_Wait4IBE(DWORD *_value)
# J& ]' b. G( g# H1 |{
' T& `6 D) w- P //######################################################### ) W5 _- f+ A- p% X1 U9 D4 A
/*
! [3 S7 F2 R8 h$ r pmuWait4IBE proc
% F9 P ?# s+ J' g) S6 J PUSH AX 5 r0 d: L2 Z; k. d* y
PW4IBE:
9 I" @5 n) e+ g l8 u, Y IN AL, 06CH //Read PMU status 9 E' c* s1 ^- A" ]
TEST AL, 2 //Is Input Buffer Empty?
. H+ m/ Q, x3 V: R% ] JNZ PW4IBE //Jmp if no 9 @: z0 M# p% Q9 x
POP AX
0 F& J4 q1 `6 k+ ^* @8 E, k ret
" b+ v' v& [% J4 z% v pmuWait4IBE endp //END OF PMUWAIT4IBE a0 x8 c" y# f9 D* d* ^( j
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空6 ^ J9 F; t$ r- ]& z/ S
//#########################################################
5 u7 k2 H- W, E# F P" w; x /*do
" W0 o" q/ I8 G4 k8 s% | {
& W" w8 z% {: |- X; z- k; M& H GetPortVal(PMU_SC, _value, 4);1 ]/ {3 R( f$ x, J! m' k8 g
}
9 J/ s: i3 @+ o9 t while ( *(_value) & 0x00000001 );*/6 k8 G1 c7 u, Q: `
DWORD dwRegVal=0;3 p: Z3 b, y8 g/ |7 n u2 S
do
8 C1 s* T4 H& c' q; N6 N, V _$ L {
( C2 Y+ Q/ d8 F3 b+ ? GetPortVal(PMU_SC,&dwRegVal,1);( D" c& n+ \7 o6 B0 i4 D
}' N2 U+ K% F) E+ u1 S% E
while(dwRegVal!=0x2);9 t* d4 f/ [# ~; O9 l6 t2 a
- a" w, w3 E- k6 o! `+ i- z, ~& X}3 e( H0 Z" c- K9 y$ r3 ^. ^
3 G# f4 u& E* c, n. y1 F
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。6 {* P: _6 I- j8 ~
所以变成了死循环了。4 G' H( ^' z& G' O+ e) g
7 r* q+ F- A0 Z4 |- N
我对硬件编程不懂。又不知道从何下手。
& L( ]) G4 r* U5 {' R我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。1 n. o$ x7 H) `( w8 I I
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
2 m9 c3 p5 m* I
6 B9 M$ f: X4 l* l% z" A9 Q6 \6 `我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。+ Z4 h% Z& j! _. j& T+ S. f& `/ M# G
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
) m E3 | L. ~% S3 [1 z
! ~$ a) R. F3 O2 R; l# n4 k% ~感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |