#include <iostream>
& K, ]; `6 x/ m/ K8 B#include <Windows.h>2 h. U( c; y( A
#include "WinIo.h"8 r( S4 p4 k7 I! `
using namespace std;
8 A$ Y" r5 ?9 r: ~" q. N, E- e
# C5 j: Y9 d( B% Q; _#pragma comment(lib, "winio.lib")/ f5 `+ N$ ]. H1 L8 L9 a4 D9 x
6 c% V8 m$ h; }1 x0 t1 r2 O" Y
2 o; j9 |3 I( r. X& q p
int PMU_SC = 0x6C;//命令端口* U7 x' z c4 [. L& T$ T
int PMU_DATA = 0x68;//数据端口5 N# Z* ^! h5 O7 X) z( F
int RD_EC_SMI = 0x80;//读寄存器命令0 ~- i8 K1 T7 H+ f8 ?- j' A2 w5 i
int POLLING_DATA = 0xE7;//CPU温度寄存器号+ i/ B! Z1 n& K7 }
' ]+ }3 o8 e# B4 L, Y( p1 m) L
DWORD dwTemp = 0;
8 E" s8 k* F4 W% `' I! i- x& C& S2 B% Y* a! ~1 I
void PMU_Wait4IBE(DWORD *_value);
8 S7 m! u: `& @7 X6 D9 uvoid PMU_Wait4OBF(DWORD *_value);) u, l7 y# C6 @/ C; a2 I' e
$ ?/ E! U# u$ b
) n+ p! y; ^2 k3 e. x iint main(int argc, char* argv[])
) [2 H; D% n5 U{+ J9 A+ j; z2 v2 y7 k
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
" f; {- Y0 i6 W) p$ g/ l; |0 n% a# U* {6 S$ W
# T1 |( T/ {0 b9 M
//1、mov dx,PMU_SC //" }4 K/ l& m6 p
//2、mov al,RD_EC_SMI //+ Q+ {' g5 ^8 W7 }0 O5 b( Y! h
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了, f) N0 j- u# J8 r8 d' h' X, ~2 B7 n" J
//4、out dx,al //将读寄存器命令放到命令端口中。2 h: Q" R* X/ }( V9 D; {
& i9 D. a: _0 h% }" A
PMU_Wait4IBE(&dwTemp);, C% C# e- D+ N0 S
/ z& A$ C) c/ Y
SetPortVal(PMU_SC, RD_EC_SMI, 1);" J. y3 D# O* S
2 x: d+ v: l$ f/ R6 Z5 W
PMU_Wait4IBE(&dwTemp);
! q' C! h. t+ ?2 y' ? " D5 A3 o9 V2 f( u
SetPortVal(PMU_DATA, POLLING_DATA, 1);! x- {7 J0 e! i1 z$ t
* h+ m9 G6 r3 l% {" C5 ` PMU_Wait4IBE(&dwTemp);
( G, _6 g7 k( N/ J/ X) Z h, D6 q3 i# i5 X6 A
cout << dwTemp << endl;
& M1 h2 p# X' S3 Z% I- Y! y$ b$ Y+ t9 e) ^( W5 |$ Z# t
ShutdownWinIo();
; _& v: t6 R9 z3 c& i
1 ]- n. f, z# b# M7 g system("pause");9 I; c3 K/ x+ T
3 O* V- Q# l# J F, m3 B- |
return 0;- I( x; q$ E `" f3 ?$ X6 P- i, d
}7 h2 j1 |/ Z' w3 m' a: W
3 K1 l5 p; P5 q, A" a
void PMU_Wait4IBE(DWORD *_value)
! U6 _7 J: L: Q# i6 l/ R+ w: t7 P{
0 d' b$ ]/ z" q$ A //#########################################################
% ~, A" H: |/ T' G /*
7 E' K2 h3 Z$ ?: q/ V. Z; t pmuWait4IBE proc , P9 c y+ O; Y) o$ M2 U2 r
PUSH AX
# [: R0 ?! ^# q% I r/ G c PW4IBE:
; z6 ?9 B0 C6 Y" L IN AL, 06CH //Read PMU status & w+ R0 h7 ~5 o4 _! J6 k" ]
TEST AL, 2 //Is Input Buffer Empty? ' L! M/ b6 t- R+ @& b/ z
JNZ PW4IBE //Jmp if no
, G2 ^, O$ I* d8 s POP AX - ~" ^0 u2 E, }6 c% Y3 ]( r
ret ) M8 d( R1 {) n1 C
pmuWait4IBE endp //END OF PMUWAIT4IBE
- @7 U/ x* m9 o1 V" ^5 f/ |8 v *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
6 T% b5 p/ V8 A* ?* K //######################################################### . [+ o) F/ Q' G# k0 e$ J2 F
/*do + ~: L0 b* c! M1 `2 r
{8 ]$ Y9 i: R3 s, O
GetPortVal(PMU_SC, _value, 4);
0 P* x* ] Y7 I }8 r+ G z! t; R2 d
while ( *(_value) & 0x00000001 );*/
1 ^- F5 e/ e7 j x& G6 v, u DWORD dwRegVal=0; E) W$ `, \8 a' V
do
" J+ I9 I7 d* }& e; v# V { ' c. R) C* |4 q( ?8 |# l
GetPortVal(PMU_SC,&dwRegVal,1);% S4 q% q& n6 m" M- L6 i* d# D
}# r, @7 ~8 F) }6 m
while(dwRegVal!=0x2);
. V4 q& P& \, E2 z0 A8 ^8 P2 m6 R4 L* c+ `% M* A+ n8 p2 ^& x) J
}
0 h/ e7 H/ u8 l/ [( I! K1 v$ T4 f
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
. d5 k' _* j0 l) v) e3 A; J% D所以变成了死循环了。" d6 R! F2 G' ] O) \# r/ n7 ^
5 w5 k3 Z* d- B+ ]我对硬件编程不懂。又不知道从何下手。
3 S; [5 Y0 f( \我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
$ e/ K% ]% U1 I0 E4 z- y但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
. Z, J" L X- c" s9 N( z
+ L0 w- y+ Y3 {" H4 ~! q: j+ x我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
# H7 |% P4 S/ t并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。, a4 D# M( p! O4 h: [ g
& E8 L/ c, B' r* W1 r感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |