#include <iostream>
( e2 {/ h, c& W5 e1 z#include <Windows.h>6 P1 S$ Y- K- P% `( D4 ]
#include "WinIo.h"' ~0 J2 q; S$ y5 U6 M
using namespace std;
. d% t: P* f1 ^; @; y, V8 _1 P! B" k2 J5 w8 Q& E
#pragma comment(lib, "winio.lib")
, }, ^+ X" J% X' V% o* n7 C$ ~# M3 Y1 _& n
% i: M2 |6 [# p6 m$ Y; q& Q4 tint PMU_SC = 0x6C;//命令端口9 |6 }. k* h( R3 U' } C" Y3 L8 C
int PMU_DATA = 0x68;//数据端口
/ G" P& N$ {- I2 T1 n- G9 o; V+ Rint RD_EC_SMI = 0x80;//读寄存器命令
5 d V7 {: I( y7 X- lint POLLING_DATA = 0xE7;//CPU温度寄存器号
+ i, i3 l' i# J' w" j( [/ `
& C, r, Q. Q7 j3 H2 tDWORD dwTemp = 0;
* ?9 ]( G0 M* }% C
1 M2 V [% H9 T3 c; i- U! J8 y* Gvoid PMU_Wait4IBE(DWORD *_value);
% A, R0 o! |- _$ ^void PMU_Wait4OBF(DWORD *_value);+ \: k& D" a# |
8 f' g3 ]: R- w" {9 n9 w6 T- H
' i, g) b4 K$ F4 fint main(int argc, char* argv[])9 L' s; X! T+ }
{6 Y# y, o8 N0 |* b' v0 E- Q
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
) {" _4 V8 w& T0 ~1 o2 w7 Q. \+ S$ y% Z9 w$ v7 ~8 B5 j' h' z
! Q* M6 o: D8 H: X7 x# P O3 e
//1、mov dx,PMU_SC //
( ~' ], b; U# T7 q- w, J' |" z, e //2、mov al,RD_EC_SMI //4 p4 {, E, f! }- d* _, Q( Y
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了( ?7 E! g8 x) o3 Z
//4、out dx,al //将读寄存器命令放到命令端口中。
6 _1 o; r# H: h w/ e2 G* Z
6 I- ]8 | I4 B7 E6 a PMU_Wait4IBE(&dwTemp);
; w4 W1 q( f4 V( _ j/ ` ! V2 ^, [/ c* F( f' ?! w
SetPortVal(PMU_SC, RD_EC_SMI, 1);
, e9 v0 `# r! z* T) N0 v' L
# K. o4 X0 R. _& F# g PMU_Wait4IBE(&dwTemp);
# Z6 V! n: b( ~( w* V
" p6 A6 }2 ^4 G5 g; j SetPortVal(PMU_DATA, POLLING_DATA, 1);
0 f; E) n' [7 L; f @. G. {3 [/ A o* w
PMU_Wait4IBE(&dwTemp);. g `& n6 m1 e' q
: |# d- N v9 o6 ^7 U: G, M
cout << dwTemp << endl;
7 E6 I' O( h# N' s4 ~
+ L p( K, u1 L( Z9 p0 D& M ShutdownWinIo();0 s% T6 d# g( W; J. Z" j* j
1 k, `1 S6 V F8 S1 C8 p system("pause");5 X3 ~ c8 Q! `+ y+ R
& H& n7 y/ C7 K9 m% g9 d
return 0;, c; e% [1 w2 F/ ?! t+ J
}
( t& Z3 O/ \! m$ F. X* q2 V4 s: J
void PMU_Wait4IBE(DWORD *_value) i" y( o4 S- R1 v
{7 {7 e3 Z" k7 I: r- s
//######################################################### 6 Y$ F0 I& D: x% T: L# N
/*( Z, T8 ^5 P) L* }# ~
pmuWait4IBE proc ! w, t/ x* W3 e; ^( r# N8 J, X
PUSH AX
9 O0 _( |1 v5 n- d PW4IBE:
3 j& L2 T3 P& E+ e) P& B! c IN AL, 06CH //Read PMU status 5 S5 r' t o2 Z- @- j9 i7 |3 m
TEST AL, 2 //Is Input Buffer Empty? / V# h6 j4 a3 _8 E, }) r6 D
JNZ PW4IBE //Jmp if no * Z2 g, i1 s9 r* g# s6 W! ]
POP AX
! R3 ^3 v7 r( o ret
# a2 [& O8 l( g$ B pmuWait4IBE endp //END OF PMUWAIT4IBE! p5 J+ n6 s( R& t+ E7 d
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
' ~. `# {/ B8 W+ h$ s //#########################################################
7 Y; `. {6 Y" A5 o /*do
9 @. ? Y& B7 D. h, @ {
' y b* l/ {: ]$ f+ a* ] GetPortVal(PMU_SC, _value, 4);( z: i8 g, S1 X
}
5 t3 \. n- x: d! j: b& i8 j while ( *(_value) & 0x00000001 );*/
, }2 `& N* k' a' W" d) Z n' n DWORD dwRegVal=0;/ E3 F( N; [6 e! f- J
do! t4 j% ~7 O1 O+ }. l2 M2 h
{
& o9 S7 V/ {" ~8 O' @8 `2 Q" ] GetPortVal(PMU_SC,&dwRegVal,1);, |4 D5 ?* G8 \; w$ Z7 j5 C
}
( g( C3 ?' t2 c: {" ], {1 N# \ while(dwRegVal!=0x2);+ ] q- b$ a B( }. a5 s
! {; ^" j# Y0 B3 i$ K' w
}9 \- c; ~! J( t7 a
; L+ m% i0 P- ?+ [+ Y# @
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
+ W. Z/ j& V8 L- e( m! ?+ V所以变成了死循环了。
) d" s3 o( `1 W$ {8 C
" i7 _- N; U0 i3 y( Z! R) r我对硬件编程不懂。又不知道从何下手。3 k& [! Q- E7 b
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
]+ V4 C) n8 A5 }: M但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。# m/ q+ ?7 H1 n# `4 \3 s
6 c) i( H& Z' Z: x3 _5 R* _
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
: a1 X. X) L( u1 A* K! h, X并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
) Z" y/ ]2 g) W. X6 Q+ A0 X/ p8 E# f) t7 F9 o) }- h
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |