#include <iostream>/ Z1 |# H2 D2 L% E
#include <Windows.h>1 U6 ]: `/ {' a8 W7 H- _ _9 z
#include "WinIo.h"
+ ^8 b0 F0 [) r3 H# s( U" n gusing namespace std;3 d; A8 N/ Y5 |" B
7 J5 _' _0 j6 V7 [5 y1 j2 y#pragma comment(lib, "winio.lib")
5 V1 t* v3 s9 R* v
3 s3 A% `1 y) V# _. W- |& p" S" L7 b4 ]! W% {! x
int PMU_SC = 0x6C;//命令端口) G1 k% I+ h/ D j9 T( K2 b! b
int PMU_DATA = 0x68;//数据端口
' r' p0 w7 B9 v! t+ G! U7 Vint RD_EC_SMI = 0x80;//读寄存器命令
/ L# d! Q- u. f5 N! L8 z0 Nint POLLING_DATA = 0xE7;//CPU温度寄存器号
& {# O& W$ l* B& c$ O: ]: d4 v% `; y
DWORD dwTemp = 0;( w6 |8 k/ ?1 v6 v
4 J$ ^+ Q$ w2 q
void PMU_Wait4IBE(DWORD *_value);- u; J: N/ ^+ Q# F
void PMU_Wait4OBF(DWORD *_value);, E8 W; r# ?0 ?/ u+ I
) V: T0 O1 w/ O' V: r
, g- ^% e' S: r5 H8 N: Pint main(int argc, char* argv[])! w3 I& s8 J9 V" X/ L
{
% [5 l0 u4 K( r if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
- K3 g* l) L! P- x# A' G
7 j) E* F. D# v- Z; B * p5 R! D" {; }# c0 ?
//1、mov dx,PMU_SC //% `' x) d% ~# B" u9 H8 X: B
//2、mov al,RD_EC_SMI //6 N- @7 o* Q/ y. ?1 `: C. x# ~
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
) ^* O5 D+ B' H6 D/ [2 @+ e //4、out dx,al //将读寄存器命令放到命令端口中。
- ^5 ^$ @; M8 d0 X8 R; u# |% a) k# V: s' p7 H J! O' K
PMU_Wait4IBE(&dwTemp);
3 S9 `9 S/ {: y! b F 8 }: t: Q7 t# M' m/ Q
SetPortVal(PMU_SC, RD_EC_SMI, 1);; R$ |* y2 g# j4 d; j
X- u. i9 g8 u% z$ l- A
PMU_Wait4IBE(&dwTemp);6 `" f4 [6 k# L7 f
2 D) t1 [' h+ U( T; v SetPortVal(PMU_DATA, POLLING_DATA, 1);0 L5 Q2 r/ I0 j( C
1 Q, O4 t' r+ J, q T" }1 N- C PMU_Wait4IBE(&dwTemp);
/ `) o1 p; {; u. w$ N; z
8 a8 M0 U; ^/ u6 [ cout << dwTemp << endl; : x. N0 [7 {. y- c
& d/ F# o6 U& ]( m. K% o+ f
ShutdownWinIo();
* q$ r5 I3 |8 |' d# A9 F0 b4 e) S, a
system("pause");& k; ~) n5 x, k0 Q9 W: B9 i
, ?3 d( j; o0 `$ s; b0 T& t return 0;
7 m1 r, B9 O( @8 J& f}: K" K! x% ^2 v. t# G. H
$ N7 B6 m. |' y
void PMU_Wait4IBE(DWORD *_value)
! ^* C2 e; H$ B{4 Q1 O) Q- e' I; O$ S% e$ N& W
//######################################################### R g, M. Y0 X u
/*7 E+ Q" a( l! K: H0 H( \6 S
pmuWait4IBE proc
! W _* P# g& C! B( ~0 ] PUSH AX
; ?. C) {7 X2 U# b) g PW4IBE: ~% |8 V3 b' C i
IN AL, 06CH //Read PMU status
/ I0 c2 K7 M* M6 O5 p TEST AL, 2 //Is Input Buffer Empty?
2 S/ y4 w% ?' m& w JNZ PW4IBE //Jmp if no
* f' m/ V, P, [' O* t. { POP AX + {3 W" _0 r0 u, F E9 f' L. `0 m
ret
i+ x9 u7 h8 I0 D9 P7 ^ pmuWait4IBE endp //END OF PMUWAIT4IBE
7 N. a4 ]* E5 i' e* R *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
' h" W, l: s# m' _7 w' R //#########################################################
$ ?6 t/ ?) }* u n" W+ h3 z /*do
0 ~' @0 D: x- ^5 d8 m, F, Z" B {- L1 A2 V9 `6 ^: ?/ B% Z& a
GetPortVal(PMU_SC, _value, 4);- \- ^% k" C: X+ {& g
}
$ z8 r% s$ G0 H W; p while ( *(_value) & 0x00000001 );*/
2 [$ s, l9 m* a" q, } DWORD dwRegVal=0;) h" F" V, G1 R* s- ? \0 k
do
; D1 F. P, l% X2 n3 X* l {
+ Q6 F( b" L) G, R GetPortVal(PMU_SC,&dwRegVal,1);( C, r& z {1 l
}
: u0 ]( J. u: D while(dwRegVal!=0x2);
2 P1 _0 H R/ X3 \. V& [( @2 n1 }$ }6 F
}# m$ b! P1 G8 v+ m% K4 y
; {2 M8 @8 ?' G; f5 B% {
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
* t4 u( z, Y& c6 d4 ]1 w5 y4 W所以变成了死循环了。
5 `( {; `2 x0 C) f( U. W
! f6 t+ @0 c, a, G! M我对硬件编程不懂。又不知道从何下手。
+ a6 O: d6 n5 L$ m: c我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
& v( m+ W0 L7 v- u但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
- Q& D" n2 }! Z% U- N; j3 A! k+ t
s" [# ~$ S& x2 n; ]我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。( \4 X( n- i D' _; k: d
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。& {' Y4 F, A M8 F" e! R N
- E4 e3 F3 {' m$ H* g9 f% _4 P
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |