#include <iostream>
) w, ?* {+ h3 K* G; b- j5 @#include <Windows.h>
! M, I! j3 P& N" O6 I#include "WinIo.h"; x& f/ h# [; M( s! s3 u+ e
using namespace std;
9 |" [. G" e0 u: a; A2 ]! S0 M* r+ O" O4 u" y1 C: Q- @0 _/ i
#pragma comment(lib, "winio.lib")+ s, C! m D t! s, n+ ?% v" {* T
3 o; G# @$ `" I% U" F0 }: o% d' X$ O5 H. B! |& P a
int PMU_SC = 0x6C;//命令端口- ?5 p3 ^8 p$ v) u3 v
int PMU_DATA = 0x68;//数据端口
# B* @. j, B' Y+ y5 F1 fint RD_EC_SMI = 0x80;//读寄存器命令
" \1 g$ T- \' y" O m2 _. C) J' b4 Bint POLLING_DATA = 0xE7;//CPU温度寄存器号4 d8 l( Y* j' \ d
" E; e" C3 S7 K& p
DWORD dwTemp = 0;4 J3 p7 y9 @# t$ L* r
6 Y0 w' R6 `! f; R8 rvoid PMU_Wait4IBE(DWORD *_value);
) Y1 q5 A; g+ v1 u' f. i1 }void PMU_Wait4OBF(DWORD *_value);" ]% ?0 K! @$ d( i! m. h
2 v' O* q# c* ?: }
2 J! \+ P, A. i, i; E' x
int main(int argc, char* argv[])% h8 t- W3 q0 w9 s( g2 U
{
: g! [) L& o8 C4 ]+ F) | if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;/ j! e" j. b/ X" ^
4 }" ?! e' K+ Y* b$ u 8 q1 m, p) z/ U( e$ v/ f
//1、mov dx,PMU_SC //
1 J$ s5 s+ D* V( L5 Z5 N //2、mov al,RD_EC_SMI //
/ m- L+ O; x( O3 Q. S/ i- { //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了5 M6 g; F7 z. @6 b% Q
//4、out dx,al //将读寄存器命令放到命令端口中。
" E g) j' d, Y- K! [) ^
# h; \& g! I* g PMU_Wait4IBE(&dwTemp);3 ^. W3 ?# z2 R1 t
8 O' M' _2 L4 L* I$ G4 s7 Q
SetPortVal(PMU_SC, RD_EC_SMI, 1);
* e: B. B. M, P5 H
3 J" `, N: |/ m, x PMU_Wait4IBE(&dwTemp);: `+ x% Z* r+ T. g' _7 T
; G3 D2 M! }1 ?6 [/ ]+ N/ t SetPortVal(PMU_DATA, POLLING_DATA, 1);9 u$ Z6 g& m. E: w4 j. y
2 I- l H* K9 w6 x: Y4 G PMU_Wait4IBE(&dwTemp);% Q; j+ s. F; z% f- W0 |. R3 v
9 u0 u& M; L; j. g cout << dwTemp << endl;
+ Z$ D& U9 _* w8 _+ K- g* u1 n Q! K8 ^& b) ~* R( ~0 A
ShutdownWinIo();! M' j5 F# m; }; w6 V2 c
# t% s. y h K7 G) m
system("pause");4 t* }0 d9 F5 o
* r: {, D6 Q* d7 }( z2 l9 \
return 0;5 x i0 L/ y- W0 O
}8 u% U0 u4 U* W9 s* j
8 C+ P7 T: b% h2 E" s I. b, b7 E
void PMU_Wait4IBE(DWORD *_value)9 q$ I$ E" W2 g& b8 V
{
1 w! T6 B/ h3 b+ k* a; V2 ]$ d: J //#########################################################
! _$ N; ]# ~9 m% c, }5 T: ` { /*
6 d# W! g; L8 m pmuWait4IBE proc
# g9 m5 K7 f5 A+ J& _* O( X PUSH AX ! g4 y4 E0 i r4 C
PW4IBE:
h5 [! G3 }2 H IN AL, 06CH //Read PMU status
! F; X& N1 O5 @2 g: \1 \- a TEST AL, 2 //Is Input Buffer Empty? " a9 Q$ r* u) Y0 n$ o% G% o9 Z
JNZ PW4IBE //Jmp if no
, T3 Z0 s- N& E9 m+ r8 m' I4 D. g POP AX 8 R3 P- S+ C; M4 S' Z
ret - l9 W4 I, s- h# g; G0 B, I
pmuWait4IBE endp //END OF PMUWAIT4IBE, Y: l% a) k0 j% H$ p, V3 Z b, _
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空! ]1 v7 W: Q1 t! a9 ^8 s
//######################################################### , ^9 G4 r( r; l
/*do
R2 [! v' @# m. m* Q {8 ?: x" V2 v; n) P0 A+ p
GetPortVal(PMU_SC, _value, 4); M; l* |0 j8 I9 D! a4 t, i
}
+ L4 M+ x( {$ K5 V& m, W while ( *(_value) & 0x00000001 );*/7 `8 E1 ~$ y( i/ y
DWORD dwRegVal=0;$ \8 ~; w( L" G2 R6 K Z3 f0 C) V
do
. f' T4 U# K) Y' h. D- r! d {
, O+ B% c5 h4 W- a GetPortVal(PMU_SC,&dwRegVal,1);1 P$ N2 _; a" r1 k4 |- F
}2 p# j0 k6 L7 j }, H+ Q1 U* [
while(dwRegVal!=0x2);
5 d8 \$ k& Z( \8 ~) W" N: f0 \6 d1 r( t7 I# p! y
}
# h7 g6 n) W: n! U7 J/ q5 k' U
. T% x0 j. W3 x! f1 f以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
q, k2 o& r$ I' X' | d所以变成了死循环了。3 G/ o" D- ~7 w/ `
6 T% D/ O9 g' @ c7 T. A# I我对硬件编程不懂。又不知道从何下手。. P$ L) E! H6 g4 F/ t* Z' h
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
$ H" a: I) U$ \但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。% H' A8 \# U1 _ t" D2 q8 y- A
. t4 D) ?% n; V: P) v) s
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。/ N4 U& s& S; r9 v7 }6 z% F
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。/ F# ]. a% \4 r& @0 d
8 \' q8 u. {0 l6 e& d, {
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |