#include <iostream>
2 F# D* X- f; ~#include <Windows.h>) ~$ a2 W: X! ^7 q7 h4 G3 y) O4 x
#include "WinIo.h"
9 f5 S- E' \6 u. Wusing namespace std;" b1 }7 p0 E8 {# Q- m! B8 ]
* S4 W6 _* Q a1 N0 w& V#pragma comment(lib, "winio.lib")7 T+ j, Q# k8 o" P- q3 c3 j }
: D5 ~. r0 G" h0 J; t4 k
9 V- k# l% |" ^) L9 Yint PMU_SC = 0x6C;//命令端口
3 A# F4 R6 L5 L/ \8 U5 V2 _8 {int PMU_DATA = 0x68;//数据端口
6 J+ T, ^4 W1 I, z0 n2 b8 kint RD_EC_SMI = 0x80;//读寄存器命令! r0 ~, \/ L- ]8 k! c. H( p1 X% t! a
int POLLING_DATA = 0xE7;//CPU温度寄存器号; y: k, i% X% `: S
' f& j, N1 U% |+ s7 x( JDWORD dwTemp = 0;
4 O6 f; P! o' v& Y
9 ~. u9 v0 F: Q: u+ f& Y) e qvoid PMU_Wait4IBE(DWORD *_value);
4 f9 d+ e9 P5 v: qvoid PMU_Wait4OBF(DWORD *_value);
% y7 ~" S9 H. m; \3 ~3 m" Y2 Y+ h. {- n9 j; M a
1 G# a4 N: h- _# b0 Xint main(int argc, char* argv[])
. ^! _: e" w, y( h3 j{
. O% K. M6 J# ` if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;0 S8 \/ C1 {4 e6 Z* [3 X4 `
: `3 a# F; [9 T$ G
- Z6 |2 D# _; w, N- v# ^; m //1、mov dx,PMU_SC //2 C* J; m+ B) x& M% Y, A O; M
//2、mov al,RD_EC_SMI //
& U( D6 [4 G/ P% n# K0 [& W7 R# R //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了+ P1 s w3 E$ o0 b! B4 v% H
//4、out dx,al //将读寄存器命令放到命令端口中。( J! }: N+ W; z- S& \5 l
, ~; C( {, }/ v" r PMU_Wait4IBE(&dwTemp);) ?2 A- [' @3 `" e: g. ]
$ o7 X$ p+ A! [' K SetPortVal(PMU_SC, RD_EC_SMI, 1);
% e" T5 M& Z3 ]" z+ {& g3 Y, q
1 ]9 R" G- a0 k' Q# x* {1 L PMU_Wait4IBE(&dwTemp);4 W6 [ v5 `& }2 i7 D
3 H1 J) G) H( p; U& h SetPortVal(PMU_DATA, POLLING_DATA, 1);8 t p/ G& x8 o. m: I" j# b
; K" r9 @" v7 x8 u6 @0 q PMU_Wait4IBE(&dwTemp);2 V) A* V- U0 `1 H) f& U) K# ]# _
! g& d( P% }% t7 R% C) D
cout << dwTemp << endl;
; H. H7 D4 h9 G, Q. T; c7 ?- T
- a- p8 p g$ z6 v ShutdownWinIo();& L8 I& h) A( e I: O
4 \5 o8 c6 t/ j c, Y
system("pause");
: d* e) x/ w6 X
* m$ q6 a I. l" K return 0;
$ O0 b& H7 S5 m' Z}; o7 X4 P) Y3 Q- o
# \6 k; y! M7 ]void PMU_Wait4IBE(DWORD *_value)
+ T( T, l6 r: f' U7 u{
y. Y1 R2 K" k3 v: i f //######################################################### 9 P( Y1 i2 j0 B1 g
/*3 Q0 S" D8 Q3 Y* g4 Z$ l$ ^
pmuWait4IBE proc
( t* i- h% x& d* s0 m: q PUSH AX % l: B( w: E4 t$ S+ J
PW4IBE:
n7 z& r( n h9 _. K3 Y IN AL, 06CH //Read PMU status
T9 Y/ k( E0 l& ? TEST AL, 2 //Is Input Buffer Empty? . B" Y2 `6 p% m) m# k0 M! M
JNZ PW4IBE //Jmp if no
+ T6 \" m. t! `: M! H POP AX 4 ?/ n4 z$ u* m% ?, U8 W, X
ret % {( ^+ h- Y( M1 k
pmuWait4IBE endp //END OF PMUWAIT4IBE
' B* ]' l& C: T7 o *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空) _/ A! J. u, T! {- l G6 |
//######################################################### 9 d5 H2 t3 Z9 `0 d' b/ [7 b
/*do ' j- ^0 `! U/ }+ O; U" d) ~+ q
{ r. n* C/ \- ~- m& u* k4 }
GetPortVal(PMU_SC, _value, 4);
: z% {. d$ a, F: [2 A0 f: i' @ }& [# `1 A6 f$ r5 i: C' U% `6 E
while ( *(_value) & 0x00000001 );*/% T: [9 b, K* f3 C l
DWORD dwRegVal=0;
3 P( K! l5 M! j! f7 E5 r& M1 q% u. H$ Z do
8 p$ v5 f; s% j* T4 U* V' D {
' D. E0 a7 y; e8 b* V, \* ] GetPortVal(PMU_SC,&dwRegVal,1);
7 M9 O: a1 `/ P6 B2 P8 ~ }0 e4 ~! ^- G. k, N' f3 q$ D
while(dwRegVal!=0x2);
% ^6 G! S" N1 l! [9 P7 n
{- f: V2 z2 R0 `3 }}- j/ _, _$ n* x/ ~
$ L/ [( J5 ^9 c$ }0 D
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。0 e$ Y! y M2 c W% ?# e# c, D
所以变成了死循环了。
+ F$ @( ]# l) n b, u
* G: i3 u- c% i我对硬件编程不懂。又不知道从何下手。% ?* F! e- L4 K: v: c6 y
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。) d8 O% h9 ^. y( i. A% ], {
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
2 ~2 t) E8 L! O, @5 y3 T7 x/ Q! I7 _& m* g5 W1 o* V
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
) o3 w4 ]3 l/ e; _: R并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
# k& A. X, M" k# u6 V1 B
1 A5 O2 o9 O, d" |/ Z" W: ]感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |