#include <iostream>' D( K$ B+ `, w2 M% i i4 _5 [: S
#include <Windows.h>
3 j @1 }& r- N7 _. P8 ? q#include "WinIo.h"
9 c3 |1 t Q, F4 h$ R7 U, h2 Y" `using namespace std;: \( f* W/ T- x9 |6 g
' s4 H1 k" ]: h" L3 X! w9 v#pragma comment(lib, "winio.lib") I& ]5 a2 t# u! D) K" J; L
: s2 |5 i2 T# D `3 X# x4 {. z7 l' H' s' D, l) f7 p/ L, m
int PMU_SC = 0x6C;//命令端口# {2 o/ B" S) b" x6 f
int PMU_DATA = 0x68;//数据端口
4 c+ x0 J* r3 t' Qint RD_EC_SMI = 0x80;//读寄存器命令4 C& f& Z6 O, g* \
int POLLING_DATA = 0xE7;//CPU温度寄存器号
?" L/ d% d/ l8 R" N& z" M, L8 m7 a1 J+ [- K) ^
DWORD dwTemp = 0;. U0 r7 }9 p; T
+ s: [% u" X% p2 W% f: K
void PMU_Wait4IBE(DWORD *_value);' S/ k# L+ Z9 w& D
void PMU_Wait4OBF(DWORD *_value);
& B2 J1 @+ v! ~' b! p, p+ R0 R& Z! h2 t8 w4 q7 a
) {/ d) E) H2 Q) n5 w& h( s5 F: M3 d0 W
int main(int argc, char* argv[])4 A! t9 [, X% Q, {4 {4 `" S' b2 E
{
( O! m2 w& o. H, A2 k5 C* V if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;. U0 F- n& B! k/ t7 Z" ` z
5 O5 p, R) d( r% ]0 `
' p8 l2 D% g& p! T2 N: P //1、mov dx,PMU_SC //% p7 f0 y9 l8 O ~+ ~& v- S
//2、mov al,RD_EC_SMI //
% b R% e7 ?+ e6 J/ u% z( u: S) E# p //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了* F# ?' s3 s, V, r0 k$ O( [1 [
//4、out dx,al //将读寄存器命令放到命令端口中。
* f3 a3 Q, Y# L9 J0 d7 _7 I! p3 b8 i# y
1 w8 x- F1 @- \ PMU_Wait4IBE(&dwTemp);
1 @# n& `$ {& p
% ?% L: d( n% d( k1 z( m: R SetPortVal(PMU_SC, RD_EC_SMI, 1);7 E8 c7 ^% k) }& q6 S$ D3 i
: K) Q. q' ~! I& U$ L PMU_Wait4IBE(&dwTemp);7 P! U. q6 d6 J% V! J( U
, h9 @2 S+ K C7 H4 z
SetPortVal(PMU_DATA, POLLING_DATA, 1);
% `3 F1 W% B6 s B
2 \% Y% g% [) {: I/ [ PMU_Wait4IBE(&dwTemp);* Y) ~$ K. K5 \* Y+ L; U( I0 u
+ A: ~- z) v* k" k4 X
cout << dwTemp << endl;
) }& o, W O: l* Q. ?" e
: {/ w6 G B# s7 A; j ShutdownWinIo();8 T' j- E& N$ Y* B1 |' ^* J, ]
" r6 M4 _( A" B$ O7 P/ V. W( p system("pause");
( h+ M3 J1 O4 Y5 d Q+ }7 e8 K/ [$ s$ E7 f* U
return 0;3 h; Q$ x+ B h- X* k
}
2 j, P6 L) G3 x" Q% O" _
" e" i9 E1 G" c% \. j7 `1 Jvoid PMU_Wait4IBE(DWORD *_value)! s ?' a; V+ x0 u; P2 m: K
{% L( O% p. O+ B. q$ w* j: i
//######################################################### 9 d$ |' t" j5 {. _# C
/*
& B: ?" u) \9 d' d& {/ W$ q pmuWait4IBE proc & z( l. F9 q9 M/ ?) n. e
PUSH AX 8 a0 g0 k' \9 t e: m; v. _
PW4IBE: / J4 Y) V7 P3 ]8 R# A) A. c
IN AL, 06CH //Read PMU status 4 ?6 e. W( r9 Q
TEST AL, 2 //Is Input Buffer Empty?
7 p2 W2 k' N, F7 B; s* f: ] JNZ PW4IBE //Jmp if no
/ D( O3 K# h, [ POP AX
. L+ x" ]; q) Q7 B ret % k# [- U: q& \3 l
pmuWait4IBE endp //END OF PMUWAIT4IBE
4 f, F5 I6 F3 l, e& b *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空% ~/ O$ @4 i' J, b, _! C
//######################################################### ! b: g4 j0 j( H. O4 ~& ?) B
/*do
# b- H4 T% Q4 I# {% {* p4 N) }& p {: h) |8 c' l& x" M4 Q/ b
GetPortVal(PMU_SC, _value, 4);0 n; s. t9 Y7 T& ]* D
}
5 \% P9 h$ ]2 X0 p$ S3 b5 b while ( *(_value) & 0x00000001 );*/
0 e( d* K. x1 \8 W8 G" P1 z DWORD dwRegVal=0;$ w! t. B; `) J* y1 Z9 i2 P
do4 A1 A$ F! q' } P7 I
{
$ B- T9 p, s, [' M: b GetPortVal(PMU_SC,&dwRegVal,1); j- v$ i6 P, q, ]2 ?2 N7 O
}* R# M6 b" ^# I$ e7 n. i. O
while(dwRegVal!=0x2);9 R7 O$ T7 D- H; B
. e! w% `; M; T* C) f! u2 k. z
}* C# J- E+ X4 v: b" p
# [' T# ]. v2 E5 M以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。 {0 z, k3 u+ T& c
所以变成了死循环了。" k: r% ~$ o: y
/ z1 k6 E/ P* Z7 D) y5 [! G2 N8 m我对硬件编程不懂。又不知道从何下手。+ B+ j S: D: m. w( `2 ~
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
9 _, P1 F( P6 S" r但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。, {8 W/ q: p, \- M( G
5 k/ K$ k( S- @" A1 T+ W. q我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。/ k( w- I' Y: Z0 ^5 G& I
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
4 k! F7 r* r% M( I/ i: E4 T. z# B) c7 i4 s( _4 _& L: ^
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |