#include <iostream>
- K! b" s2 D/ m) D4 E& r% ?#include <Windows.h>$ r) C* b! k8 |' p$ Q+ w: x
#include "WinIo.h"$ Z4 v B6 ~3 x: ]
using namespace std;) P) s0 W9 i% ], k# s
0 @" {3 c) x0 C1 D& {( i#pragma comment(lib, "winio.lib"), m: `- l$ G! W
/ \0 M: B9 ] F7 r9 J; ?) g
, m4 Q5 ?7 s0 sint PMU_SC = 0x6C;//命令端口+ \6 X0 j4 i, d( B' x
int PMU_DATA = 0x68;//数据端口
$ {! O9 e# f7 v$ O9 S. m3 l% X; qint RD_EC_SMI = 0x80;//读寄存器命令; y% w1 u7 o: d3 s
int POLLING_DATA = 0xE7;//CPU温度寄存器号
. n6 {7 r5 r" p9 N8 u& `( x
8 O% P' s7 b( qDWORD dwTemp = 0;
3 G3 {- Q8 I' |5 I! j8 u# |2 @) v' o4 Y7 Z
void PMU_Wait4IBE(DWORD *_value);
" m W0 d3 x) ivoid PMU_Wait4OBF(DWORD *_value);3 p+ k- s5 B/ n4 {9 t
! t+ s0 _5 I4 r' p& U+ Q2 p: v. ]* y/ w- |$ j* H
int main(int argc, char* argv[])2 M; L8 s6 p) v
{/ X' d/ f* L, Z) {5 i
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
- Z# P# k) j# z( G. L" [' ^- ~& W) q
. f* u0 k4 l0 A- t9 { //1、mov dx,PMU_SC //
$ c% I0 D: P3 w& z //2、mov al,RD_EC_SMI //
, m6 `# k, E2 i! `7 ~ //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
% P, E/ f7 K1 D, M: G2 H" e //4、out dx,al //将读寄存器命令放到命令端口中。
. X: z* ^) R$ e( z1 a- W6 g& s& M/ e- _* f) F" K2 O$ g# h
PMU_Wait4IBE(&dwTemp);& o7 }2 e @6 }/ p% _
+ H) L( p: D( j3 { d( _- y* p" K SetPortVal(PMU_SC, RD_EC_SMI, 1); Z* U& j7 I% X3 A3 S2 V. H2 M3 S
- c8 @2 @1 P- C3 u PMU_Wait4IBE(&dwTemp);
/ A V$ C$ z5 e. o9 n * H- e3 g& ]8 i5 O
SetPortVal(PMU_DATA, POLLING_DATA, 1);
9 E" M' U& u) q; U$ m7 ~* Z0 b# A8 F$ |2 \8 U7 t- l2 Q
PMU_Wait4IBE(&dwTemp);
, f% C! N! Y9 Z+ T* b. K4 H* u- V: V1 a) l5 b( \8 o4 s9 [
cout << dwTemp << endl;
3 W3 T2 m3 B; T
$ z& ^* l8 x( z/ K. X9 |& [ ShutdownWinIo();
) e- w% P4 M/ s: d; W1 e- n# X- \0 z+ u8 V. {
system("pause");
2 y7 l; X7 C$ Q( n, c
4 j* l& u6 y: d O2 m return 0;6 O$ h' T6 \9 ~/ @
}! U( q. M4 ?- t
& A; P3 M9 y7 j K
void PMU_Wait4IBE(DWORD *_value)
5 W3 E; z0 M! M5 V7 ~{
8 P9 |( L/ f# s4 E& k- j1 j //######################################################### 4 v0 J2 q |& [) h5 c& H4 q
/*2 @5 f5 Z, s. ^0 c0 n) M
pmuWait4IBE proc 3 j, r K4 g. ^1 _
PUSH AX * ?0 e* |6 E j$ _2 C- h
PW4IBE:
0 U0 }0 d& [, i Z IN AL, 06CH //Read PMU status / v; c% }( R& k @0 a
TEST AL, 2 //Is Input Buffer Empty?
2 s( Z8 L5 a8 ^5 ?) `1 I JNZ PW4IBE //Jmp if no
% T# ]# n( N2 N$ K/ c. S1 Y% s POP AX - |, v8 D. P. E: w2 f k: _6 ]
ret # a# c- @# f m( Q
pmuWait4IBE endp //END OF PMUWAIT4IBE
2 l5 r, Q1 G) U3 @, v) k) v *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
8 \- I% F7 x% T //######################################################### 3 _! w$ @ t. e% @% I9 S+ ]8 S
/*do & h: {9 I5 }3 s/ m, s
{
$ v. c$ P( c7 |; z6 J! U GetPortVal(PMU_SC, _value, 4);% `: y5 g( J+ s; d# b) E
}
* k) @; T' p/ k' }. a9 X5 A5 S while ( *(_value) & 0x00000001 );*/0 w0 e! J1 G3 y, n+ [) U" @
DWORD dwRegVal=0;
* }! @' D1 r# ?8 ?) ^# ? do. k2 L7 }% J: a
{ + K) A( p3 s" _ \9 }- y8 V) A
GetPortVal(PMU_SC,&dwRegVal,1);1 n2 G, V6 l' L* l5 R3 S# ~- F
}+ P* `" Q* j4 M% U; I) G5 C1 I
while(dwRegVal!=0x2);, a, e8 U/ `0 L: P5 q3 ]4 q
* Y, }# E- O; ^7 p}6 F M+ ^/ H$ I2 M4 f
& y) S. e- n4 y) R以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。& L, f) n% l4 S- `
所以变成了死循环了。
) T \5 G% m' V i
: B& n4 r7 V9 v我对硬件编程不懂。又不知道从何下手。
% q- U# g- a: ]( P我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
/ B" X) g5 V* M但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。2 ] G' A2 r t
9 L% o8 ~" x7 Z5 r# x# H: m
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
& `9 t: p' k$ M6 ^/ Z并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。% j1 z9 k b2 U+ ~+ ?/ q
$ E9 _! o% w+ _' m
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |