#include <iostream>! M) \# v+ |! ?* [5 M( [
#include <Windows.h>; m5 B+ C3 A& @* ^" O2 v5 G4 b, `
#include "WinIo.h"3 H% s: O8 a( p, i, a
using namespace std;) c( I4 V; i( H. \4 j1 g
+ u* J7 {# X& w0 [
#pragma comment(lib, "winio.lib")- J& ]& A1 D9 Q W }" l6 w1 `
3 l) a+ Q; i: s- G
: ?. r F0 w1 W. A2 |) _% D6 I
int PMU_SC = 0x6C;//命令端口
( }5 i% n, \; N- S( {- f6 iint PMU_DATA = 0x68;//数据端口- }) K6 L3 d0 ~
int RD_EC_SMI = 0x80;//读寄存器命令
! g9 {8 |, d2 \& T/ x% A; J) J z' \int POLLING_DATA = 0xE7;//CPU温度寄存器号* A4 n: z1 i/ | d: W
& N/ F% U6 b8 A9 C
DWORD dwTemp = 0;
" S+ Z2 t; C2 H' o2 F+ ]* h9 W4 w' u+ p; D( q2 l
void PMU_Wait4IBE(DWORD *_value);
2 P, C% q; Y- T! d* C' svoid PMU_Wait4OBF(DWORD *_value);
* h3 K3 j9 @7 ^% n
# W( L8 d9 Q6 v" K- J% ?* O# V+ f; _5 ? A
int main(int argc, char* argv[])
: k ?% u; Q2 ?{: W4 D6 ]$ d( C5 |& v7 o
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
) U9 F/ S; T+ ~- |/ \' H& J0 D8 U0 q1 ?% d6 b% z/ H5 `* o
# F ^3 Q% N; |5 v5 `+ F6 \8 B+ s" m
//1、mov dx,PMU_SC // V! Y( q1 S* E
//2、mov al,RD_EC_SMI //
6 d7 O5 v+ W. M: m6 j //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
9 e' v O3 t' g //4、out dx,al //将读寄存器命令放到命令端口中。3 k' x- V' w! V5 L0 U7 I
/ s! ^. \5 ^/ u2 n5 _. n PMU_Wait4IBE(&dwTemp);( G" I8 R5 t, q5 X" O* N j, }- m* M( w
$ U* l4 t- C+ C0 D) A
SetPortVal(PMU_SC, RD_EC_SMI, 1);
; v b6 ?* t' u# b: L+ I( P
2 I1 c7 t8 q |" V PMU_Wait4IBE(&dwTemp);
, i1 G9 R$ [/ O9 ?6 F4 l
" c4 D2 a5 @1 m" |$ H: a- I% ~ SetPortVal(PMU_DATA, POLLING_DATA, 1);4 ^! N$ L9 s3 [5 A
j& Z$ ]: l5 b, V# V3 I
PMU_Wait4IBE(&dwTemp);
3 o3 [/ D( k V
5 {+ p) X! s" y; C" m9 ~ cout << dwTemp << endl;
% o& B$ |% ?# d# N0 {" p
I. U9 n+ H) Y' @ ShutdownWinIo();9 B* i- F! h% {# k3 b
4 Q5 t! p; A& z" ^
system("pause");
* M+ [5 K$ T) Z" u# \5 g: [* F+ I9 G; u9 T' S* |
return 0;
! D3 r5 ~: _- E}
: \/ M4 {! D4 M+ s; ^1 V
/ w* ?1 Z# K: D4 Svoid PMU_Wait4IBE(DWORD *_value)
/ ^6 R1 Y- ?9 W6 n8 f' r{$ ?. O( {' \' Y, e+ w* o
//#########################################################
( v* R; w$ R! w" w /*! b* Q$ f1 ]+ {3 s/ g
pmuWait4IBE proc ' y) A# b. w) N0 D1 r
PUSH AX / X' N& _5 y% D' u* K- D F, j
PW4IBE: 5 b9 I& }, R- C' |6 f+ s
IN AL, 06CH //Read PMU status
5 v/ Q1 I( P6 U+ S9 C7 u. W TEST AL, 2 //Is Input Buffer Empty? 4 E1 }) m, V) n6 N$ B$ d1 I
JNZ PW4IBE //Jmp if no
* Q8 B) n; J- S0 c% U8 g POP AX
$ Q; I" p: w! r ret # ?7 I4 z7 f5 T, n3 {
pmuWait4IBE endp //END OF PMUWAIT4IBE P" A, w( c/ [! S, i
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空8 q9 e# [! ~8 Z* q" f( H
//#########################################################
6 [. s s, v5 |' Q /*do
5 ]9 s* z. r. z {
0 z4 m% u* N$ @ GetPortVal(PMU_SC, _value, 4);
0 B0 E m4 {" V( i+ E }3 U/ g8 i$ {# j: Z: `
while ( *(_value) & 0x00000001 );*/$ p7 N. U+ ]! P& ?
DWORD dwRegVal=0;. i# T" M! P! J
do
2 G; y% k: X' @1 P6 E" b1 O h {
( r$ L; U( w: u( D, H$ `/ V6 c/ Z; }6 n7 L7 \ GetPortVal(PMU_SC,&dwRegVal,1);
6 o8 {' j2 s v' j+ z3 L } `9 g8 d) z5 c# t* g
while(dwRegVal!=0x2);6 G2 n) Z4 f2 u
3 ^: y9 k) t) |% B}. v$ i* u# V6 ]& I% }) o% y! j9 _8 _
8 w7 N# I: I2 y A4 B. G. r2 I0 K
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
/ p" ?) T0 W% d) ~# h所以变成了死循环了。6 c% t# S" w2 z7 n1 y) V
4 o; N& d3 Y6 Z# {* a' O我对硬件编程不懂。又不知道从何下手。
9 D7 Y# I9 M. M+ R/ Y# f1 Q' S我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。/ g# o7 V, M& ~
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。- P. z- t( h# g+ h8 D5 Z; T, f7 w g
9 h- X1 s# G% B我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。; x2 J( f# W+ x1 a+ f; Y
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。, s4 v C3 ^6 `+ k
6 P1 F K- y9 {+ x' Q感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |