#include <iostream>
5 X: j% @& ]$ [; n#include <Windows.h>
' ^& H/ z' T8 ]7 S- x: ~4 t#include "WinIo.h"
2 i G/ T. @9 u7 k9 qusing namespace std;0 Z' S3 K4 ?! g L, }/ V
5 m7 R( P6 R! p+ U* k& h5 ]5 g#pragma comment(lib, "winio.lib")
0 i7 P: H& u2 e; P1 j1 v
- P* z' ~/ e8 r0 s& L8 g
% t$ e$ Q5 R' |4 M) lint PMU_SC = 0x6C;//命令端口3 c4 y# e2 e! V$ @5 P7 h7 a" ~
int PMU_DATA = 0x68;//数据端口
! \: Z( A1 I) }, F3 G# Nint RD_EC_SMI = 0x80;//读寄存器命令$ }6 D/ ?8 k2 d% o2 j+ H7 g$ `0 w* t
int POLLING_DATA = 0xE7;//CPU温度寄存器号
' `& U7 M! U9 R4 M9 z6 H
R e4 B l5 M3 t IDWORD dwTemp = 0;
" u$ d* Y5 ]& j- [2 |) R# G+ k# {5 P+ t" u$ k
void PMU_Wait4IBE(DWORD *_value);% Y" `5 [& K7 u
void PMU_Wait4OBF(DWORD *_value);1 ~+ D& H4 D; D
9 ^7 R$ V" c9 y( x% O+ |. \; c0 Y2 F
& u( ~5 w% ~0 M# r' l6 x- J) z$ }9 Lint main(int argc, char* argv[])* H7 K: B4 [1 C# A4 w" I
{ \' X4 n- [& ]; I+ q9 z% B& V4 ^* L
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;- G' r5 g2 p1 D, |% X l9 c
* }$ @& C. _9 i2 b
. E; i4 z9 r( e* _7 z! x
//1、mov dx,PMU_SC //5 g7 d" R! V D
//2、mov al,RD_EC_SMI // {8 m, m$ h/ _. p. W O/ t5 m$ s
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
/ n1 P# V" e4 F //4、out dx,al //将读寄存器命令放到命令端口中。) @* v K* p+ D: {8 d. S! U/ P, ^
6 p# m* b; z, r: p; }/ b PMU_Wait4IBE(&dwTemp);
# b- U" \& e+ [- ^
* v8 J" S! }! b# B0 k+ z SetPortVal(PMU_SC, RD_EC_SMI, 1);! j( ]+ n" X4 {# l
2 R3 Y }2 r4 Z4 S
PMU_Wait4IBE(&dwTemp);
! n5 ~ C5 n1 p : G! f W5 X5 i( ^/ j
SetPortVal(PMU_DATA, POLLING_DATA, 1);
# f. G& I0 n4 M
# R& u6 Q$ S4 d$ r+ k( [ PMU_Wait4IBE(&dwTemp);4 K7 S! v3 ~& m: f# I
- {, l8 W# ~6 g: s3 P4 @
cout << dwTemp << endl;
7 d9 p; x% l _
0 H! X; [5 |2 p' j- u7 u" \ ShutdownWinIo();: `8 {. T1 U1 {" m/ X, G1 D
/ m. c" j! N* i2 T& p system("pause");
0 C/ y: z! ?" ?5 |7 H' A; a, [, v z2 i' P: T- ~
return 0;
' h9 Z" F, v7 Z3 j; X# a}
2 b" P% ?) X- z; r3 e3 w) x- }) r. M, j. t1 z
void PMU_Wait4IBE(DWORD *_value)
! R4 u" G* G- p' R( i2 Z. X{6 {5 @* @/ B; o3 V2 |9 k9 i5 c, w
//######################################################### 2 m+ q: A& R& Q1 y* K' x
/*& L3 x' G M6 b& R L# v
pmuWait4IBE proc 1 O4 f1 _7 W% y2 z) G
PUSH AX
% J/ w! G" v# t ~2 c PW4IBE: - Y0 Q0 I2 O, W" V! y. y4 l% c% k
IN AL, 06CH //Read PMU status c' i; S6 R( ~, J" n8 k! e
TEST AL, 2 //Is Input Buffer Empty?
& i" ?4 G$ d) m' T# I- d JNZ PW4IBE //Jmp if no
1 r* e0 \4 ]0 E; ]4 j POP AX
5 W. K+ d0 ?5 i* t ret - F' s# b# v) q! D8 v
pmuWait4IBE endp //END OF PMUWAIT4IBE/ b: o8 }9 }% L" u2 u7 A% r
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
, \0 q( ]' p2 M //#########################################################
* {/ S- t$ {9 b' Q2 A /*do
3 R6 v) i! d0 U3 a7 I" ^ {( G2 ]" o I$ ~" d. }7 b$ _. B
GetPortVal(PMU_SC, _value, 4);
! M) q4 ], K; o9 e }" s. P) P2 a4 q7 D
while ( *(_value) & 0x00000001 );*/' x) c$ ^2 R9 L5 f, M
DWORD dwRegVal=0;0 d2 n) p( C% F4 O1 e( N5 B
do
6 S/ d5 V% @8 C# R( u* K9 C { 0 h$ @( ^ o6 ]
GetPortVal(PMU_SC,&dwRegVal,1);+ }7 M, i+ s" L% R
}- j$ l6 U# d, J- Z+ T( s
while(dwRegVal!=0x2);$ ?) I8 T$ e: L
! q1 U! T, D7 l1 r}
, c+ m: k7 g( a; X( |* J7 Q) K' D3 e4 ~4 ^" T2 \( n2 k9 ^: ?% `# b
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
U7 g9 X1 i) _- f% N1 F所以变成了死循环了。$ U& k: M0 q2 a ~! x# K' W
# s; U$ ^" x/ ~/ W- z6 U我对硬件编程不懂。又不知道从何下手。
+ b1 m" ?+ a! |3 g我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
' M/ @1 J) u$ t8 k$ S8 b7 m: T但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。1 A7 E1 s6 b g- @0 W* A
6 W7 ^- Q/ {7 B* `, X我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。+ G1 Z/ F: Z) q+ Q
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。 o% b7 I( A, ?7 [- k4 R
! Q) h+ c+ R. D% I) }# h感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |