#include <iostream>
9 S5 D# d, y( t0 q* q. X4 L#include <Windows.h>
. j! `& k$ }0 s6 Z& ^7 B#include "WinIo.h"
- o# P& Z. B% Q' L. v* k0 W. U3 dusing namespace std;
( D @$ u$ D$ _$ d4 B: \2 u+ {1 U2 X4 S$ \9 r6 d
#pragma comment(lib, "winio.lib")% y' o L4 ]% v9 x8 v+ U" {1 \
. @& f9 f, \+ }9 S% X- z
; [* V% V2 S# [; m2 l9 n7 k: [int PMU_SC = 0x6C;//命令端口4 U% x& I1 ]" z) ^3 j5 P
int PMU_DATA = 0x68;//数据端口
+ ~9 }3 h) }1 e2 R8 \" |# c6 tint RD_EC_SMI = 0x80;//读寄存器命令
6 b+ p3 I7 C% G* T6 w$ rint POLLING_DATA = 0xE7;//CPU温度寄存器号
/ n2 C! E( U9 X8 @7 R0 l
; @- \$ j' M6 ?4 L. m. D0 f5 |9 u: hDWORD dwTemp = 0;
; ~6 b4 b1 l3 d) G$ s; K! I, J5 i$ c
2 h! ]$ y0 U8 P4 Pvoid PMU_Wait4IBE(DWORD *_value);+ H* y4 o3 n. c) f& l, v
void PMU_Wait4OBF(DWORD *_value);! A9 b! N% G: q/ \! ^8 @ }. L
# w5 E# D/ A- V
! ~" m1 u0 _' S$ _) C0 Z% B# `. qint main(int argc, char* argv[])+ m# y6 [* U, O/ `- ^
{1 A* `; a% {8 H2 h5 N4 r8 u
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;' H& {: t' N: B8 Q$ y2 j
% ?# H L: r' `
) Y/ f7 ~% L4 M7 ~ //1、mov dx,PMU_SC //2 d) |" S' V2 B8 U; [6 S* {- R
//2、mov al,RD_EC_SMI //
2 k. T. g' y { //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
; e v. r, C; O2 @; I2 S" @5 E //4、out dx,al //将读寄存器命令放到命令端口中。
4 R8 H a& @ ]# ~3 T8 n5 B" m$ r: {8 {2 K7 U! B
PMU_Wait4IBE(&dwTemp);- z# {. v0 Q3 {6 f% i; L
$ d4 w1 C5 G/ f* L0 f
SetPortVal(PMU_SC, RD_EC_SMI, 1);
3 Q" n# p/ j L% \. H$ c' r8 k/ U. R0 `6 @; i
PMU_Wait4IBE(&dwTemp);1 O; |6 k4 m1 h. j# ]! s' s9 Z
9 p5 w9 ]7 V0 C! I6 |, N
SetPortVal(PMU_DATA, POLLING_DATA, 1);+ K, n3 N: m" _
( W4 Z, z" z6 Z, _7 P& _ PMU_Wait4IBE(&dwTemp);
0 D! `# o0 l2 C' ~" P! P5 h/ _- U8 V) x; A* u* Q& a8 \
cout << dwTemp << endl; J+ m8 A* O# W, K' s. T p# N4 G
. Y7 f* r q, w" Z/ I ShutdownWinIo();
: D( h3 d- i8 F; g# \8 O# }. m
: \# k7 J7 A. f' L/ i system("pause");0 _5 w7 ~; B2 {2 D+ |( M( r" t7 l
- P# |) _) V5 h2 P- o; x return 0;; S. Y) o# O6 Q+ o" b; s( I" {' b
}
3 L. m3 B* e* R
- T* @7 G) g( a+ W: r J' ]- \; B0 n( `void PMU_Wait4IBE(DWORD *_value)
5 Y3 K# l7 @' ~) j{) d/ k& G4 ^' q8 |3 ^
//#########################################################
1 r7 p5 ^, h1 s6 |4 E- @. A, o/ z /*
5 o; ^! W2 \% D- C( m' u/ u pmuWait4IBE proc
# v# `% I H$ K PUSH AX
5 {3 {8 b9 j* i8 u: j6 N, H, J5 ` PW4IBE:
7 m. m: Y/ b9 X7 ?4 p2 @; w, C IN AL, 06CH //Read PMU status
; ?4 ^1 Z1 _) Z0 [' y& @ TEST AL, 2 //Is Input Buffer Empty?
0 Z3 U8 [! z! g% i JNZ PW4IBE //Jmp if no
- R3 l" q1 h7 W POP AX ; p0 [4 A' W' T2 `' t0 H- K
ret 2 b# b/ I; x$ g* U2 [
pmuWait4IBE endp //END OF PMUWAIT4IBE" j" ? P. M9 d( [
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空! i2 E; m7 P$ j1 ]/ e/ l
//#########################################################
/ z7 v0 k: u9 O9 S$ F /*do # h; k( g6 B' ^; Y
{
! W) q+ h$ @6 h! \ GetPortVal(PMU_SC, _value, 4);+ p: W0 |7 D/ S# t; j% {
}- _) i( f3 I) x# }/ g8 W) _$ E
while ( *(_value) & 0x00000001 );*/4 s( c" o9 Z+ t% t* ^
DWORD dwRegVal=0;
+ q- ?. B- ?; n& V+ [; }8 b6 [. S do% S8 L2 N$ a: N* F b$ Z
{
% u. s' m s% q5 v, l GetPortVal(PMU_SC,&dwRegVal,1);
2 I' b' X% ~+ \# B5 u5 ^9 C0 N0 I) E; ~- r1 ? }
2 V2 s2 p0 g* M g, k. ]: _0 n H! y while(dwRegVal!=0x2);2 j" K( k. r3 I l* }* z+ e
. ]% i+ Z: W1 ^- T}
# D/ w: v# ~* b \ m4 X B
2 M1 _ N/ O9 s- z& p2 {以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。3 @2 I) T: k$ k6 O
所以变成了死循环了。7 Z( k0 l1 Y( D0 {1 w
' `% H \. @% A3 [我对硬件编程不懂。又不知道从何下手。
+ \3 [5 J5 @! A, c R+ @我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。; u9 o& ^" f6 B9 Q9 W4 d2 y
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。9 W% t V) f1 Y6 X+ w$ H
, \/ a0 F9 j# T( |! I
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
/ ~+ y5 J* [& J! j) N1 s/ d并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。0 {0 G3 o% ?4 D, u
' ^! o' c- k7 U, y; I感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |