#include <iostream>
4 E+ c/ g1 e$ O* l+ T. m( w#include <Windows.h>; \# w3 F3 q, q# z
#include "WinIo.h"% ^% ~: X/ C7 }4 A# q( t6 T3 v2 o
using namespace std;
5 m8 m5 U* k, l7 T8 N, _1 { F5 J( c& B6 `; ~7 H: x0 P# ~2 p
#pragma comment(lib, "winio.lib"), g, U% Q$ E7 B2 p8 l
4 i. Y+ I4 k c$ p0 w2 E# v
. O. y" G. i/ z9 y( y7 pint PMU_SC = 0x6C;//命令端口" c) P' m7 }4 m; c" ?0 W* z
int PMU_DATA = 0x68;//数据端口
( w, T' E, l3 I: J; Jint RD_EC_SMI = 0x80;//读寄存器命令 s1 J: g4 ~/ s' y% L, D5 i1 c0 B: W
int POLLING_DATA = 0xE7;//CPU温度寄存器号
|" \/ d( { `: \3 w- L: L7 \+ E* D k8 p$ b
DWORD dwTemp = 0;9 s$ t; e$ F& O u5 S5 b ~
. ^, q: l$ L( S' e$ yvoid PMU_Wait4IBE(DWORD *_value);- g& O: Q8 p9 n
void PMU_Wait4OBF(DWORD *_value);
5 v- O7 f6 D7 _" B" m. }4 L4 k5 g/ Y* X
$ r4 U; l' Y# Y- ~: f+ v, H$ P1 _$ Dint main(int argc, char* argv[]), p6 o$ C- u! V9 C5 ^
{
# A5 V* A4 |* o' ]% X if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;% z8 c$ q0 Y, i
6 a; I- D" a7 g/ T5 X& V4 p8 y8 | , P2 p8 V' k% K! e0 Y
//1、mov dx,PMU_SC //; s- z% K; D' k/ z
//2、mov al,RD_EC_SMI //
, L" ~' K. u1 h //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
$ m, {/ O- w0 ^2 `; p //4、out dx,al //将读寄存器命令放到命令端口中。
0 W$ h) t% F" L+ ^
# {. r) w! U# u1 w: U PMU_Wait4IBE(&dwTemp);2 r7 Y; I0 K+ @0 S R, p% e u' X
8 K3 x1 R, U9 u/ u* q
SetPortVal(PMU_SC, RD_EC_SMI, 1);9 z6 p$ z M- e. R' t
( M" M; @; e7 f, k7 ^ PMU_Wait4IBE(&dwTemp);
1 n. X! L+ i: U# d7 X- A9 P
u; [7 K9 P) q& I8 h SetPortVal(PMU_DATA, POLLING_DATA, 1);
0 `* O/ V' k8 J; [ R9 W+ w/ J6 `# O+ @2 i$ ^! q4 m
PMU_Wait4IBE(&dwTemp);) r% v9 s: |( u6 |+ p% \! Y
+ n' o, L: B, H1 F |+ ~
cout << dwTemp << endl; . l+ f1 C% |1 N5 T
; q0 Q1 [5 [* Q/ D B$ G' x
ShutdownWinIo();; f4 N1 w: X, }7 M: w6 J: Z
# [4 c4 B- T! ^$ x system("pause");
' H& f+ a5 [; x, a' W$ a$ t8 n0 C! N T4 T# G
return 0;
' c% r' a( D* D9 b* ^1 V1 _}3 R) B' q* M* t. `( ~7 F
7 [, S1 F% N) _. ovoid PMU_Wait4IBE(DWORD *_value)9 L C& ^! q- b4 m8 U
{* C3 R$ D$ _2 y8 a' h
//#########################################################
, @# G" U7 Q. B# r7 d /*& i/ t+ a2 _$ w' {& I
pmuWait4IBE proc
( n( l# J( C0 H9 h PUSH AX 3 i1 K a3 J8 L0 t# U
PW4IBE: ; s; G" j+ u- I3 q2 q2 i, y
IN AL, 06CH //Read PMU status
. N8 D- c; H) Z" u0 V TEST AL, 2 //Is Input Buffer Empty? 1 O6 z4 W- P- m( v+ r' K0 `# \
JNZ PW4IBE //Jmp if no
- m. x3 G k" D7 Y# `9 ^6 y POP AX + m) A: c; p. V! K. T5 J8 t' ^) z4 F
ret
( s7 e( }" t6 k( k9 ?: Z0 o pmuWait4IBE endp //END OF PMUWAIT4IBE; F. M0 B8 N0 ` r
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空7 f: r/ V8 n( d n
//#########################################################
! z9 _/ Z; F8 x$ h) b /*do
2 N7 e& L$ b5 e2 ~ {) x! E0 R. s9 s( C( U
GetPortVal(PMU_SC, _value, 4);6 ]( \" W5 G& K) K7 c
}4 C$ F9 `: ~% V2 z$ V* u8 Y; o
while ( *(_value) & 0x00000001 );*/
' _. @* {6 C- [) b+ s DWORD dwRegVal=0;
2 `8 _' i4 q/ @! \! y/ ] do5 V1 D' V3 d1 V) A. P
{
5 s$ E: k/ ~- S1 A9 J GetPortVal(PMU_SC,&dwRegVal,1);( _; \9 C( R, P/ J
}
1 J+ t# q7 U5 ], R/ W2 U while(dwRegVal!=0x2);
% E' p. N1 k: k' o0 l
. b2 U$ h, [$ a$ o* w} @" S$ U1 K1 z$ X, p
, G4 N( v$ F+ `9 _* z) e以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
1 N5 G7 E/ ? s4 S% S9 g. ^所以变成了死循环了。0 F# P9 q4 E; g0 G: A
$ S2 N4 \0 ?" L8 P0 }, V
我对硬件编程不懂。又不知道从何下手。
6 m/ X% t/ C+ a) K' K$ M我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。% \. u5 j1 b7 [! O; P
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
2 a/ j) V& v2 U' s0 A3 V, ~1 p/ y; H+ C
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
1 i' @' H0 L/ M$ H b" S! t并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。9 \7 @. C+ T" G$ J$ s" X3 O8 r$ _
7 y4 P! a- A( a+ j: Y8 {6 o- G
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |