#include <iostream>' {5 V. N* N) ^
#include <Windows.h># E3 H( q+ T# e$ [5 }8 Z. b
#include "WinIo.h"
9 [& h5 O" M% q1 \/ b5 _/ o, fusing namespace std;) a1 z& d- q6 L8 |+ b
4 a( |2 b8 i" J9 t; \( h$ B#pragma comment(lib, "winio.lib")
! m0 T- V: t! K% c d/ u6 }4 F5 k1 A& q$ O( N
7 d7 T; S; t! f& Q U9 n0 T5 g
int PMU_SC = 0x6C;//命令端口* v! ]7 z) q+ Q+ U7 s/ l
int PMU_DATA = 0x68;//数据端口8 C2 t4 E: P V9 n5 j! i
int RD_EC_SMI = 0x80;//读寄存器命令
, o2 M6 `$ ?; k4 \: Sint POLLING_DATA = 0xE7;//CPU温度寄存器号+ P+ ^% G. M1 |+ b( d, ^
3 J# B9 l1 U5 ^' B' E
DWORD dwTemp = 0;
9 f" x/ T% e$ s( r. z' s5 C9 K2 J6 F
void PMU_Wait4IBE(DWORD *_value);4 s8 {9 @/ q" m* o# S
void PMU_Wait4OBF(DWORD *_value);- T, q, C% G- p6 M" e3 `/ G
" Z4 R; b; F6 w; w) |2 ^ x
6 x% F& n: K6 U g7 fint main(int argc, char* argv[])
2 c7 r3 k- o; \{' r: q. O, o2 a. H/ `# N
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
* H% b; s/ \4 _- s6 [
- m' x, p: n0 R) @) z. R- S
* K+ T( V- E, s$ _' b' ~% O5 G- f //1、mov dx,PMU_SC //
, I( Q3 q( u2 y A3 k //2、mov al,RD_EC_SMI //
& _, l0 i. y) Y# L5 T //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了* R! `4 i$ u% ~1 U: J+ F
//4、out dx,al //将读寄存器命令放到命令端口中。$ ?2 Q0 O3 E! p8 Z5 i
. }9 v( F8 D" ~3 C
PMU_Wait4IBE(&dwTemp);
3 |- Y0 G/ h8 [3 _ s3 k / s$ `' t5 R9 K! U" f, s* U
SetPortVal(PMU_SC, RD_EC_SMI, 1);
& U& a4 v/ N, V* T3 {6 K, J, L6 z" O A! \- v
PMU_Wait4IBE(&dwTemp);+ C# ]1 M) A' }" g; ^, L
+ H1 g) d) \5 b+ @) Z4 N SetPortVal(PMU_DATA, POLLING_DATA, 1);6 m. q' ?. j; r) _" O+ ]; b* x
) R8 ?1 a* G( i' `& _ PMU_Wait4IBE(&dwTemp);3 L+ Z+ d) d3 Z4 o7 ^. E3 S5 Q% r
7 q. m! G. @) O0 p. r; e
cout << dwTemp << endl;
, I0 r+ j1 { m x3 U, H9 Y+ j% @
ShutdownWinIo();( p5 S1 h8 ^& n: i
" Q: u" P; K" {6 s7 G( K system("pause");+ P+ K4 s' k" O! z, z: K, b$ s9 ]
% w; x6 C8 t( G/ A
return 0;. W& L% ~9 a) l
}
5 w3 P. G! A' a1 s h
$ S+ b2 j7 x3 o5 |3 k `void PMU_Wait4IBE(DWORD *_value)
5 A% [$ Q& ^% r, K{4 R% {& q" b; ^* ?1 R% |' g
//#########################################################
4 g+ L2 e' d, B4 P) u, O( @$ P /*
7 m7 C* y. s- {1 p# O+ j3 } pmuWait4IBE proc 4 u& G/ U" k, {! g9 u
PUSH AX * o) G% S3 g" V; Y8 \& }2 _3 I# x4 P
PW4IBE:
& O' j0 J; f' G, l+ g; V1 T IN AL, 06CH //Read PMU status : b, h& _9 N, E/ c# r8 t3 P
TEST AL, 2 //Is Input Buffer Empty? + c, N1 q6 l. L1 S* U( J
JNZ PW4IBE //Jmp if no
5 I8 p x2 [' M POP AX
, T0 \- ^+ J! E8 [: `4 J8 v2 T/ I ret * s$ j x% [9 m# I+ i
pmuWait4IBE endp //END OF PMUWAIT4IBE
3 u0 ?& k9 R% K# q \8 k *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
+ h/ c/ l v4 D) O. i1 w3 R# N g //#########################################################
6 A- w& N1 [) T /*do
# _$ |% b- x4 R: r, `! u9 a, y {1 j" y \! K$ P7 b* I$ L
GetPortVal(PMU_SC, _value, 4);
/ \% S# a6 a. \ j. \ }7 } L$ ^4 r1 I
while ( *(_value) & 0x00000001 );*/. z+ O9 g7 O p8 x7 W: r; I
DWORD dwRegVal=0;
: L+ q$ F* f% \ do
1 g* _: Y! s! W/ ^+ d( Y1 j {
0 V l M- x; |) C1 t GetPortVal(PMU_SC,&dwRegVal,1);
- A) M K) g3 J' j4 |% f# p }
- L9 J0 V* x% q5 V! U* F- U$ h6 ^+ _ while(dwRegVal!=0x2); `; M3 y2 q) X7 B
h: |' r: A" ?" U$ @6 p}
h: y1 w, Q, v1 p% X0 h# O& F& C( K3 [0 n7 o
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
0 G( r, x) P" D" K7 y6 t" j( j+ l所以变成了死循环了。$ h8 Z9 ]+ ?8 x% |% u, _1 ~
7 H* G7 t& M" @- @0 U. h$ B/ D% y% w
我对硬件编程不懂。又不知道从何下手。
5 ~% B6 I: j4 C! C( x+ Z我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
, t* _+ J4 L/ w$ K+ G$ M; m但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
' n' g9 J4 Q" f3 F/ }) @$ V* k7 u$ {& l: U' k) }" Z. G
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。- x5 I5 m' z2 E( \5 M! B
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
p/ }: n( Y: b& H9 S4 ]% t* A9 y/ m$ _' N; n+ u
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |