#include <iostream>
! R, l3 x/ t: [/ {. }- o#include <Windows.h>
# W5 X. }4 v6 M5 @) A# W#include "WinIo.h"4 O! m1 X" ?3 `! d4 y6 M8 H
using namespace std;
* X3 l3 ~. e$ [( @; ~3 Z6 `% Q! ~* Q
#pragma comment(lib, "winio.lib")" H7 G* Q1 G0 V2 q( Z X+ Z8 O
0 X8 K* o* S) z# V& {
; Z! r# O& \# n& Q0 V3 |
int PMU_SC = 0x6C;//命令端口
/ K4 V& t M" z: gint PMU_DATA = 0x68;//数据端口+ Y# f1 Z6 G7 o- w# ]1 M2 k
int RD_EC_SMI = 0x80;//读寄存器命令
, H' T- G; K4 f0 h* Gint POLLING_DATA = 0xE7;//CPU温度寄存器号# }- b% O9 @6 w
( J% ^6 y3 p5 t5 Q4 r; Z: c7 |DWORD dwTemp = 0;
/ G& r( e( x7 Q; s4 e: s* L' d* u% a* r/ ?/ I
void PMU_Wait4IBE(DWORD *_value);
7 V. f7 \( ?! u* {2 E9 xvoid PMU_Wait4OBF(DWORD *_value);% P$ A' \( h" A1 Z1 Z% M
1 B1 O |- L- O- p) q1 e2 I$ M ?( W0 `% ^# ?/ H$ n" n
int main(int argc, char* argv[])2 G; Q9 E4 I' F+ l
{
+ d+ o( z7 F* ? if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;+ j4 r5 d2 Z: q/ O) M" ]
* l& p! s% J- r* G8 ?" @& d
. P( M' b; Y! o) M //1、mov dx,PMU_SC //+ V( m, Y; j6 ^4 _+ o
//2、mov al,RD_EC_SMI //
( J- C) ^& O* ?/ i4 o //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
# M4 [ _2 r" h& R" Q( ?5 X //4、out dx,al //将读寄存器命令放到命令端口中。
& ^3 m# u0 r/ S: V+ K& a/ k) o" g3 Z
) j& b0 e# G, q, j+ ? PMU_Wait4IBE(&dwTemp);
8 s* ]' n G I5 I$ F% I. Q
4 o# Z/ n0 ?- c/ Q/ ^, e# S# H SetPortVal(PMU_SC, RD_EC_SMI, 1);
7 S( D0 d0 d3 _$ e# e/ @8 A; j7 N' u+ n \0 u5 ^, H; N, v
PMU_Wait4IBE(&dwTemp);$ x- f& M4 n- @& n9 H* I* C) p$ V
: [0 O! M+ v8 c+ b! h5 U$ I
SetPortVal(PMU_DATA, POLLING_DATA, 1);* I5 O/ Q3 Y, R2 ~4 B3 L
3 V, g3 Z* v, l
PMU_Wait4IBE(&dwTemp);
1 F5 }; h4 y. V
3 R2 _1 h/ j0 H7 Q' x cout << dwTemp << endl; 4 m# u$ }& d& F4 t- q" `, e
3 J! m8 G! ?- H, t5 Q0 {6 [
ShutdownWinIo();$ ~. z0 R+ m. ]% o) C, q
1 |, A7 a7 k* H
system("pause");
8 ]" n/ H0 o6 Z7 R. O* g9 k6 H8 I" P! R" [. j: C+ b
return 0;1 T' L. ?4 N# U. z0 t: |1 W
}
5 e# ^8 \4 r# Y: A7 m! W* y2 P) ^! \5 V: H: R
void PMU_Wait4IBE(DWORD *_value)
4 P/ }# q5 ~3 j8 p9 Y) c/ W{2 K7 X9 A4 q* E( {" S# I# V8 `% s
//#########################################################
- m. ]; ]3 L& [; P+ }6 A! m. a% L /*: c/ ]6 X) [. r) V P. g
pmuWait4IBE proc + N }' I8 F; W9 A, {% y+ \) b
PUSH AX
! }: x1 s J% ~6 n+ X3 Y PW4IBE:
- g7 |7 G# X" K* C0 p B: \ IN AL, 06CH //Read PMU status 5 h! \2 p, s% d& `5 ~3 @8 M
TEST AL, 2 //Is Input Buffer Empty?
# A0 Q0 C: E/ K, d( s! V JNZ PW4IBE //Jmp if no
$ ?- e' x4 n8 S' K, \$ c% c% R8 } POP AX 8 i+ h7 K) D# {4 u
ret
Y4 \5 N$ E! E/ n9 K2 d: [. k pmuWait4IBE endp //END OF PMUWAIT4IBE
1 `) E1 c. g; P& x4 L *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空" t2 O, Y# b: L# z7 y5 b
//######################################################### 0 P# R/ P3 [$ _ {
/*do 3 e7 F; D* Y j( M
{
, j6 |: ^0 E0 c A! J9 h# E GetPortVal(PMU_SC, _value, 4);
2 {0 k) V& N7 }! s# u }: x, V- ~ [5 y3 W, Z# o; c, s
while ( *(_value) & 0x00000001 );*/
9 z# |7 w! k& A8 X0 [9 Y, Z DWORD dwRegVal=0;# f& K; w& L& p' E5 m) o7 w* q
do; n- _8 [1 T( @ ]
{ * E/ N' R- q/ q) Y2 I
GetPortVal(PMU_SC,&dwRegVal,1);
; |% h) |8 K4 r0 V5 o0 _ }
) `/ t- e( |" P5 N5 S while(dwRegVal!=0x2);5 x* X2 g+ b0 M. \8 a& K6 m' N
5 {0 e0 i: r% Z}
' |4 d5 v, w& o0 W
; } ^4 [. A8 d& k( o5 `2 k以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。( ]8 I7 c5 t+ \3 b
所以变成了死循环了。
. ~7 l1 v/ w2 H* c h
3 h& l: g. W" e/ E我对硬件编程不懂。又不知道从何下手。% U/ v0 T ^3 q
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。* x% G% P& o: e4 c7 n
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。5 Q1 o3 b Z$ I; P) ~( C
) \6 B& S$ S. ~: L
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
2 ~; G0 y6 d! I" T* u& S1 T& s$ P5 X. I并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
& w- A# |7 ^ N4 ^/ T2 H, v
* z8 C8 V/ t% O9 G感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |