#include <iostream>: F: B- y( l: F" a$ E
#include <Windows.h>: c, V) N# o& V9 T8 }' x
#include "WinIo.h"
3 u6 Q& N- ~# K7 I$ g/ Y1 Cusing namespace std;
# T C e5 {1 j2 J6 M
3 C3 Z: W7 O% M+ |7 U S5 B#pragma comment(lib, "winio.lib")+ m! b3 ^( V+ N5 K% B8 Z3 l
0 V, [1 s+ g) N! g( z/ b, N
8 u" _/ E, O) r7 {0 @: G
int PMU_SC = 0x6C;//命令端口
+ P0 s6 D4 k, E7 P$ n eint PMU_DATA = 0x68;//数据端口; D- F" \# r# B, |5 z
int RD_EC_SMI = 0x80;//读寄存器命令
; |) V( w5 b$ g+ ?int POLLING_DATA = 0xE7;//CPU温度寄存器号& F2 e' ~" d X: B
( ]& q! \( |3 Q) f4 Q2 i1 U0 ]DWORD dwTemp = 0;% o2 Y) _; v1 `
- C/ I7 z8 m" d6 R+ _
void PMU_Wait4IBE(DWORD *_value);' R# z# U! W( Z
void PMU_Wait4OBF(DWORD *_value);
6 v4 V" w6 b8 E) ^# `2 {
9 }) }7 D/ x0 b8 }6 ^7 _( J5 J) x1 Q) q7 v4 a2 w) ]4 F
int main(int argc, char* argv[])& [! ^. G: u( [( M: h! ?% O
{0 ^1 P( r+ {0 I+ e) ?4 C7 Q$ X
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
6 Q: J7 p9 n' _) G3 M4 c3 V- m0 l. }& G
8 g# w/ I7 |1 x0 C //1、mov dx,PMU_SC //
6 @$ @6 ^/ q+ W& R0 i/ y; B //2、mov al,RD_EC_SMI //
! W, @& j; ?# ?) p+ n! k f3 A/ v6 c //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了( {* ?- a. [0 g' B
//4、out dx,al //将读寄存器命令放到命令端口中。
, D1 n4 d" \/ v0 X- d/ t3 d4 y
; y1 G; u6 f* r7 `) v" H* p PMU_Wait4IBE(&dwTemp);
8 K) |4 p" A! r) W$ Q 9 _2 S/ x/ f- f# |4 C4 |8 @9 r
SetPortVal(PMU_SC, RD_EC_SMI, 1);- o( d/ z [7 {* m' ?
- X- K* b8 v; b* p" ^) k2 w/ T- s PMU_Wait4IBE(&dwTemp);
2 C5 }* k/ Q) @2 M ! h$ h$ p5 w+ `* e' H
SetPortVal(PMU_DATA, POLLING_DATA, 1);
/ W1 }& E. a5 O" _- I- n3 `5 f
1 \5 N9 R1 X y! v2 f, z n PMU_Wait4IBE(&dwTemp);; r- g; w2 B- O0 v; Q- K+ w
1 {0 [8 O* I3 f: ?, f F( S
cout << dwTemp << endl;
' X- Q: Z/ p; x0 h9 T1 Q% h# A9 t3 K$ Q* e7 C6 b' X! A6 @7 ~
ShutdownWinIo();0 w3 N( b4 p2 |0 b
* `/ i6 `: s2 D. u+ f. _" P/ z
system("pause");
+ t) w+ X+ |& x: }% o# M. ]1 k7 o+ d4 R! b* p' {) ?
return 0;: t" c9 ~: T9 ]" ]4 I: @
}
; _$ p u# M, E2 Y$ g& v/ L) l$ F$ @# k j# m9 Y, [
void PMU_Wait4IBE(DWORD *_value)
1 d( A0 u$ y# P{8 |4 k: R7 D C7 r
//######################################################### . L. \( B" ?+ H; k7 N' B/ V/ \
/*
1 J, u, m8 H0 X9 M" O pmuWait4IBE proc
5 T$ l2 m M4 a$ y1 y PUSH AX 5 D! L4 r3 U% L* J
PW4IBE: 7 U @9 Z! Z* L5 Q3 g
IN AL, 06CH //Read PMU status
, l$ X, @. ~% U9 p: s# P TEST AL, 2 //Is Input Buffer Empty?
5 c) `; J0 M% @ JNZ PW4IBE //Jmp if no 7 m9 D( o2 z1 [ A+ p# R
POP AX
4 @1 n% l3 [, E1 }# k/ h7 F ret
* m# h+ y" x. S- \3 [4 Q. b% P pmuWait4IBE endp //END OF PMUWAIT4IBE
4 r3 q' q( E9 z4 E *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
- L5 } u! o1 d' E) Q //#########################################################
u$ O: p/ W- l e- y /*do 4 E4 Q( P4 J% ~% H# {+ E
{+ @9 R) {4 K/ l4 y* W4 P" d
GetPortVal(PMU_SC, _value, 4);, ]# \- j$ j/ r9 L! Y% v
}! u, `; L& |% k g% I
while ( *(_value) & 0x00000001 );*/
& ^, Y; m$ H5 D/ g% j DWORD dwRegVal=0;
% f4 T+ v" g% ?/ {" @4 E do" a# p0 [- _- Z+ n2 n6 [
{
# K$ w2 n/ Y1 ? GetPortVal(PMU_SC,&dwRegVal,1);
. a3 M" z" r) A# w8 l4 V }( ^$ u8 y6 u2 F
while(dwRegVal!=0x2);. V; W# t( w, g' X
) K" [$ Q9 X7 N, b}+ S& p, b9 k; g/ H* q% L# @) Q
# J! W9 E; D+ T9 X% k% I以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
; Q. m9 r3 ~- l: m* { F所以变成了死循环了。
! C3 l5 Z5 n( R7 a' I6 ]3 k8 U* z7 Q) y! M: B. w5 g" J* ~% U
我对硬件编程不懂。又不知道从何下手。
1 {/ U0 S- [8 |" N: N我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。( B0 Q0 b2 w- x8 q: J8 @1 |( _
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
; Y1 Z: }* _8 d9 K2 u, X6 m% z8 I) m" K
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
2 k: J' b9 F$ P& o+ @并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
5 h$ W D- S' }5 x% Y: _) d# c6 v& x
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |