#include <iostream>
5 z' R, |3 }; o# A3 H#include <Windows.h>
$ n' \! C/ t( d: O#include "WinIo.h"
5 o0 A+ r% G2 v. L) r1 _/ xusing namespace std;
8 i2 D) }- T: S/ @6 D5 }
5 r0 n% ?6 [4 L' B \#pragma comment(lib, "winio.lib")
4 H9 V2 ?2 f; H# Y) A( q) ~- _9 G. b) D$ A4 o5 K
. s7 B0 P6 o/ I6 O4 `4 v2 U9 Pint PMU_SC = 0x6C;//命令端口, {3 ?7 G' H2 _7 p) F# r2 n) e
int PMU_DATA = 0x68;//数据端口) E0 A% ?. G' V e4 R) B! h. ?; S
int RD_EC_SMI = 0x80;//读寄存器命令/ F7 R$ Q# t/ D
int POLLING_DATA = 0xE7;//CPU温度寄存器号
3 r5 n$ v7 R- b$ a# ~
- Q0 ?; @+ F/ Z0 iDWORD dwTemp = 0; u3 k5 B; p' H: d
( t$ d! g4 r/ x' X) x, g! y( W
void PMU_Wait4IBE(DWORD *_value);: m2 D( m3 ^( i7 K/ ^; K3 \$ ~
void PMU_Wait4OBF(DWORD *_value);
/ c: f1 A) d" m k( y, \% Y- |" v6 O( {" H& @7 Z, I
7 L9 U: k* x; @! I: k& k
int main(int argc, char* argv[])
- q. N! Z8 r. V4 i2 i4 {8 s' i{
& F3 D- p' k7 u D. \5 D if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;9 O' } f* s/ _- q5 p
" F# T3 M: J; P' k
7 {9 M8 J/ e- Z9 g. U //1、mov dx,PMU_SC //9 {1 _9 n0 c0 i1 v
//2、mov al,RD_EC_SMI //4 `+ \5 o; w5 w3 Z! J
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了; w# `1 b5 ]/ F& p; N- N- m& j9 _2 n9 X
//4、out dx,al //将读寄存器命令放到命令端口中。) @ m/ v4 f Z7 K+ Z
+ w) _/ u7 R% m% V PMU_Wait4IBE(&dwTemp);9 [. Y. d" Z* D+ D: D- I
7 U- d }1 R& G" T+ T1 @ SetPortVal(PMU_SC, RD_EC_SMI, 1);, `5 t8 h9 @( J H2 z. _7 H
4 ]/ T# M6 X4 {
PMU_Wait4IBE(&dwTemp);
, g: l Y4 |9 A0 T
+ t) E" H6 X0 i1 D4 W0 ~. _4 h SetPortVal(PMU_DATA, POLLING_DATA, 1);
8 K$ ~$ L. H$ O& Z' x/ \- ?
$ H% w. q+ I; N1 n PMU_Wait4IBE(&dwTemp);
0 m. q* r- [* t/ d+ l
) ^3 l# J) s( R4 \$ F$ G; o! s" V. j cout << dwTemp << endl;
9 p" t, F2 y. s) f( U+ k4 K
" d, W) ~/ _: C* l3 Z& r ShutdownWinIo();
T4 D6 n! ]% E8 w F5 [2 W& m# W z3 N: a7 `
system("pause");
7 S: S1 [7 y9 x' E* O( M7 V! s7 v# N" q6 s3 ~# p1 }. C
return 0;
% F+ j% J9 F& o}) e' D5 f* y/ a( q- c! c; p4 J/ @
4 t# t; W7 z8 n$ D7 x J% b' rvoid PMU_Wait4IBE(DWORD *_value)2 E8 S7 u! T0 v& z9 }" C# M
{' L& M0 u% _0 A: y1 y8 [
//######################################################### ! @ H& l+ D4 _6 b. M: Y1 ^
/*
% l( v* e0 Q# b" g% t& B; t8 q pmuWait4IBE proc p- ~; h& b2 _( L# C
PUSH AX
+ Y8 u% O2 D; R h& l! I/ l PW4IBE:
, u" l' i4 n( p8 B! k/ ? IN AL, 06CH //Read PMU status ! n* v9 W+ N( | W" I
TEST AL, 2 //Is Input Buffer Empty? " H/ n/ x( D! M& [
JNZ PW4IBE //Jmp if no
5 y8 i6 I1 F3 C$ M" w3 Z POP AX 8 K. @/ K$ r s9 x
ret
! B4 R) d. B# a; K( j pmuWait4IBE endp //END OF PMUWAIT4IBE8 L5 _6 ]1 k+ _8 }& w* Y
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空$ I# a' q. E0 p
//#########################################################
; m' Y5 I) \6 B1 O" ~0 ^ /*do ; S5 I! U+ i# N# h! t7 D6 g$ z
{, }# A# X$ U; s; a
GetPortVal(PMU_SC, _value, 4);
# }: e$ T* Q1 P) ^- Z' C }
3 M6 @4 Q5 T4 f* @& m# y8 T while ( *(_value) & 0x00000001 );*/6 S+ P9 y+ I& R. @9 L$ h3 t+ b7 t W
DWORD dwRegVal=0;
) @+ A! a6 q2 [: a! g do2 a6 F% M1 A. y) C0 j2 R7 z4 x
{
* r# K/ u# a. j) t- ]2 c& M GetPortVal(PMU_SC,&dwRegVal,1);) I' T' i2 T* z9 m4 F0 g# y2 U0 D
}) ]9 ?. U7 t- l$ l' Q# W
while(dwRegVal!=0x2);
) S9 @! Y' P0 U( c, x2 a* ~' _1 V. H$ O$ n! W* V% C
}
% K f7 S6 A: G& t4 J1 m: J
3 |8 n% R& Q' C以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。& S) _2 u. b, Y/ o" y: `- r
所以变成了死循环了。! C+ L G5 U6 [* V: F- `
/ e U) f3 \4 v) G$ L
我对硬件编程不懂。又不知道从何下手。" t0 D8 q: X4 Q3 q# w
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
/ i* g$ b. V* f3 P9 O+ A) x, |) e但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
( r, p2 f& S8 t0 g7 ~9 K* C/ k! i8 H! ^7 S8 V
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。. m& b5 P# Q( Q% i' T
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
3 r# J8 O- {0 K6 V( t
% a) G# z1 E% @- Z3 |7 r3 B6 m感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |