#include <iostream>
: ~8 ]9 Q, \9 |8 v#include <Windows.h>0 z; e. j0 @: `9 r2 M1 F
#include "WinIo.h"* F1 X& f3 ` T1 ?3 @
using namespace std;
# [# D0 H; j% a( _5 V2 v% ~, h% j" L7 k7 ]
#pragma comment(lib, "winio.lib")
+ V; V% z7 t. t- j( }& q2 V8 ]2 w& L9 i$ A. p
8 r% a8 ?% \$ V% q O2 m
int PMU_SC = 0x6C;//命令端口
- f9 |. k" {, n0 Mint PMU_DATA = 0x68;//数据端口
/ X* o; J3 @" d3 L8 n9 uint RD_EC_SMI = 0x80;//读寄存器命令
* t* j# `9 F; p5 p& y% Fint POLLING_DATA = 0xE7;//CPU温度寄存器号+ m1 ~3 c' L# u
) A* [* S2 D1 A- @, Y8 O+ N/ U2 z
DWORD dwTemp = 0;
; E1 m! ^$ w) D" P4 q# f* Q0 w0 r) I" B
void PMU_Wait4IBE(DWORD *_value);+ b+ H, N2 y5 {# x8 G1 \. d7 ~
void PMU_Wait4OBF(DWORD *_value);
+ `- d: {$ v+ h" b8 T) `
8 {1 K; j! t8 u# P
, f. n g0 o! o" g+ A0 d4 sint main(int argc, char* argv[]), q: w, ?4 K( v7 a
{8 @& M" g6 H! E
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
. k. K8 Q2 t& B+ n6 H3 X) n/ `4 h0 l Q4 B5 ]1 [" O
' q }8 Q X; @) b' i
//1、mov dx,PMU_SC //9 Z5 b4 C+ M4 J' a/ u( x
//2、mov al,RD_EC_SMI //" @& x/ c B: y! U3 a9 p
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
3 }' i3 M' q8 Z8 X5 ?+ c( F //4、out dx,al //将读寄存器命令放到命令端口中。5 t8 o' ]! t" a2 g4 Q7 s- X2 ^; d
4 i5 M$ E* W1 L3 b; `! Q2 W PMU_Wait4IBE(&dwTemp);
! R6 J5 R/ [' E+ t$ |' @5 c$ Q : n8 c% i7 @, ?6 G* }
SetPortVal(PMU_SC, RD_EC_SMI, 1);
) k' Z- ^6 D( x
, m5 ?1 l3 u8 m) W& I9 R# H PMU_Wait4IBE(&dwTemp);
0 R4 V9 D9 s' ?" i+ h 2 u, ]* `& U8 p, N6 a* ~
SetPortVal(PMU_DATA, POLLING_DATA, 1);4 f# S6 D0 G% Y) q1 G2 ~& w
+ X" T. ~, m- Z$ C, ^ PMU_Wait4IBE(&dwTemp);' l% e* b" y. y: B5 s
, n, Q& x) @: a- S: J
cout << dwTemp << endl;
. T7 z9 Y5 o1 _$ y2 d% C$ L3 ^6 d
' C0 M/ ^* |9 p: x9 ] ShutdownWinIo();# W' i2 t. [* s
3 w+ Q0 t6 v0 k: [; @* ~% @) z& I system("pause");
- ?* |" a( A9 J' W. Q9 ]% Z, u+ C+ j7 j5 P# d" c3 z5 e/ g' m
return 0;6 _7 O5 o/ f* {6 |( R" M) ^/ W
}! v( I a X! V/ C' E* b) N: B
+ n1 c+ Z! A* n% g+ O9 jvoid PMU_Wait4IBE(DWORD *_value)8 R7 W. ^+ T" T6 y5 t& v
{
4 n, j, K& F2 ?4 L //#########################################################
& l9 h! l- K& ]; w0 F V /*
3 A; t+ S9 P) P& M" h, x4 W pmuWait4IBE proc 4 T6 S. E; ^6 N* J Y" I h
PUSH AX 2 H* I! Z8 A& z, \+ }% {* W# Q2 B- |4 k
PW4IBE: ! h% G7 J7 k3 S8 o2 F
IN AL, 06CH //Read PMU status 5 @/ \" }" c4 @4 y
TEST AL, 2 //Is Input Buffer Empty? . M6 }& w$ k( b( d$ n
JNZ PW4IBE //Jmp if no
. _ p; s4 ^4 c: d- B; g POP AX
b3 M8 m0 B- ~% ?! s ret " E6 K0 F4 N' a4 H( u$ \- i; Z
pmuWait4IBE endp //END OF PMUWAIT4IBE, t. G0 I7 o5 Y
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空2 B& M$ L2 Z0 z( O7 W
//#########################################################
) r" w3 f/ M$ F; D9 c /*do 3 X3 e- t' ~( F& o2 W6 ? z
{ Z- B0 F: Y7 k0 }9 V
GetPortVal(PMU_SC, _value, 4);
4 X, i3 p! B4 n/ E5 ~7 n5 f }
' S4 `+ V( \# J; m8 p4 t while ( *(_value) & 0x00000001 );*/
! { f! z! J+ @. [ DWORD dwRegVal=0;. v/ K- K/ ]4 n# w+ _3 \
do
% k" f- Y6 M* ? { ( S+ A/ P; P9 L$ U
GetPortVal(PMU_SC,&dwRegVal,1);1 x2 H1 M" r8 t8 c" }3 c: F
}
. k. U9 F; t, w4 f% `; a* [2 I while(dwRegVal!=0x2);8 E3 l+ @ ?/ t4 ^) o
" K L4 C# z) e z7 T}
2 i" Z' c( n: @& _8 l. R
- M2 A. G2 }0 k! N以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
# }% R$ v' z9 a/ E0 G) [- Q$ y所以变成了死循环了。( ]; _9 a Y& z9 U# A
d0 Q6 C; |! F3 R0 a我对硬件编程不懂。又不知道从何下手。
( q. A4 a$ e, @% R: I我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
2 w, e# s" i9 Z0 t: Y但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。8 _# o2 w. ?) X9 N) S/ |" A6 N% P" s
- N" \0 M) ]; a/ s' G) f" ~+ D我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。9 H+ ?9 A/ U$ f7 e i1 a: Z i) e2 x
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
1 A/ i2 l/ e* `0 X3 Z B
) R* n5 L* Y( z- o) Y9 x7 ?9 @8 }0 {感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |