#include <iostream>
; D/ y" l8 e* r% d) {) ^#include <Windows.h>
! W' f4 K3 d* U8 u1 Z+ Q8 E/ v#include "WinIo.h"3 Y- N5 G" G9 G
using namespace std;' z! c/ w, l# [
3 j. E7 o- D8 P# d. t: _" E, M/ i: v
#pragma comment(lib, "winio.lib")
( W8 D* C5 ~8 U' N' [) R
5 z% T3 d6 F% n2 I& @; t4 M
- V# r; n" E% T$ W Uint PMU_SC = 0x6C;//命令端口' v- L8 W- d z9 m0 s: c* N. F: y
int PMU_DATA = 0x68;//数据端口. R+ y: \" p; Y, w* i! B: h
int RD_EC_SMI = 0x80;//读寄存器命令
9 Y) E# r8 F I+ Vint POLLING_DATA = 0xE7;//CPU温度寄存器号 I/ e) p& a* e: Y3 l' U
0 I: M* |$ W: l3 \* LDWORD dwTemp = 0;
8 U# x, E7 }2 _! N4 i3 T
: B# X* \! f7 fvoid PMU_Wait4IBE(DWORD *_value);
6 K3 M! f( z/ K8 Zvoid PMU_Wait4OBF(DWORD *_value);7 M$ P' u, p R: r. }% v1 n6 u
4 F/ q ~ j+ L! z& v" X1 O& b$ B: ?6 Z. q+ P+ t3 ~ r' P$ f
int main(int argc, char* argv[])
4 ^& y1 \4 a6 z1 J$ I{3 c6 o' U7 d0 O: J8 @" e1 M3 W
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
}1 n) p y( T8 H! ?% V6 y# F( O+ a6 n C: o7 I0 H
9 t+ I1 j& q/ v/ D% E5 w: `
//1、mov dx,PMU_SC //
$ C2 ]( f" _$ l1 e- n. k2 ^ //2、mov al,RD_EC_SMI //7 \5 r" c" h' O. b5 F
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了* f) G6 Q5 [5 j8 n
//4、out dx,al //将读寄存器命令放到命令端口中。
5 }) R( b, @# l9 C7 p7 `9 C+ H" x9 s3 G
PMU_Wait4IBE(&dwTemp);
# N4 h$ V3 b5 [- B. g
) C# P) b- _! W SetPortVal(PMU_SC, RD_EC_SMI, 1);
4 y/ B9 ?, e2 d3 O$ A
% S8 F" A) e1 j" _ PMU_Wait4IBE(&dwTemp);
, ?4 W" ?* p6 e" _0 s- H4 U! F
1 x& M* |$ o ]+ ~8 t SetPortVal(PMU_DATA, POLLING_DATA, 1);! R. S6 W$ |* a$ j* w$ r p8 H/ j: n
1 [) ~& t( e t5 J) l
PMU_Wait4IBE(&dwTemp);
' o# R* S# t- X V4 ?1 P- j! _- T4 V. @1 j u- l' B
cout << dwTemp << endl; . _6 b9 Y. J, `& u9 d) F1 Z
8 p' x4 Z: V0 _( X9 u+ j ShutdownWinIo();+ h& O& Y+ Q: b7 ]9 S. `
! M) t, |& X9 w' t$ @ system("pause");! f1 y* i, j7 q# n5 a6 L& f) \! h
7 S( H! E; b8 W" C% c G
return 0;
; ?* v. W2 W* \/ `3 C- `}
- B' t1 W/ z+ h, e( c
! g. T# m) l K4 j" [( fvoid PMU_Wait4IBE(DWORD *_value)
) t" t: G( s4 s, o% K{; [ M* q1 d! [3 s h
//######################################################### 4 E& Q* ]) n) P8 ?( D
/*( S- _# I/ u/ b) E( c& n* ]
pmuWait4IBE proc
+ U/ r2 w8 O7 k0 x0 N5 n w+ x$ v1 J PUSH AX & `. g1 j* |0 g& Z. w5 b# `
PW4IBE: L$ [6 m! B3 I9 D7 _+ c7 s% U% E
IN AL, 06CH //Read PMU status 1 C) }0 L4 C6 C' R9 W% j
TEST AL, 2 //Is Input Buffer Empty?
1 r" c1 l4 a# L JNZ PW4IBE //Jmp if no
; V; u' D0 G3 M! b$ L. p POP AX # K2 d2 P. R/ k/ a
ret H4 F; B! Q, v" E
pmuWait4IBE endp //END OF PMUWAIT4IBE
& c& z& @$ }' R- j1 u *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
/ @4 d, K" K! q3 Y* t% t //######################################################### " V2 w. L, B3 o C/ b( o
/*do / U% P" Y! U9 n
{0 S# {; U# z0 `8 J. @! I. ]
GetPortVal(PMU_SC, _value, 4);
2 l9 `& Q$ z: l, O- _- S- W* e5 i# Y }
2 X+ m, S. `) h. L& f while ( *(_value) & 0x00000001 );*/- l5 @8 k" E+ l, k+ y7 H9 D
DWORD dwRegVal=0;: l* s1 w2 k p' I w! o$ C
do
& c- s: l# i$ n, } {
: a! f3 s2 o; r. ]$ |7 I GetPortVal(PMU_SC,&dwRegVal,1);
3 }' ^1 X: G' B }$ i; r: Y! ?+ [
while(dwRegVal!=0x2);" Q' }$ j8 h2 y& D0 M
' D6 M! b0 O3 K9 k- l5 d
}2 Q4 ~. q6 \" o0 u
6 \* i: n! Q, x7 d. j5 Z- p. ]
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。/ L0 K% X4 s2 w. Q
所以变成了死循环了。
6 {4 B: i! v" O; e# V% @7 O) B9 N2 T8 s& \$ \
我对硬件编程不懂。又不知道从何下手。) K% \, t# T3 K! |
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。2 n* N$ e/ i: B7 ^) E
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
" e6 i. m; A, ^$ ^; q* O+ ?/ U5 ^, C4 C! ?% K* }* W
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
9 i+ W6 a: Q% D' n0 G" Q1 v8 H+ v! V并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。7 p9 ~$ H% ^- u/ K p9 v9 U
7 n6 ~5 K! N3 M. k! A9 d. h/ ^感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |