#include <iostream>, o c8 D% _7 m* h7 H
#include <Windows.h>
$ G) J! O1 j3 U4 m0 u9 E. B#include "WinIo.h"* ~( Q! ^- r) R( A3 k
using namespace std;
3 a6 u0 ~( m/ y5 R. k
; J( I: t3 _1 B, Z#pragma comment(lib, "winio.lib")1 j3 {+ t! q1 k; j3 y G
3 _, f4 j% f' Z; T
/ O- e" a6 {; M9 O9 B+ _int PMU_SC = 0x6C;//命令端口
- z R' r/ o- x& A5 ?3 `* Sint PMU_DATA = 0x68;//数据端口3 e# U3 r+ g' o: h
int RD_EC_SMI = 0x80;//读寄存器命令
5 L! `3 [2 p! W3 cint POLLING_DATA = 0xE7;//CPU温度寄存器号: |6 X+ F6 l6 F) f# A
. {7 T+ @$ O/ d9 f; L2 n/ G" [DWORD dwTemp = 0;3 i4 M! q2 v' F$ a
/ `/ Y2 Z4 x, v' X' Z. r
void PMU_Wait4IBE(DWORD *_value);& \) L- s* O$ U) g" t# D
void PMU_Wait4OBF(DWORD *_value);3 S4 Z; A, k8 U+ Y" x. a# J+ h5 G
7 @( R2 I" j0 t: {2 O; l! |- q$ \) x
int main(int argc, char* argv[])1 B: g. z, o. b# _5 a7 D
{
8 b( Q: u1 o2 t if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;& S8 ]+ I1 i2 ^5 J! v
' `1 o' k: c& p' G
R) k+ G9 S, ~8 v
//1、mov dx,PMU_SC //
! h$ q8 |; [( k6 }+ P //2、mov al,RD_EC_SMI //+ a( _ M/ c" m* V1 p
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
6 x" C7 C$ c$ [- ?6 c/ H/ y //4、out dx,al //将读寄存器命令放到命令端口中。
0 a+ U" g; l/ K9 |5 }6 b6 H, @ L
% ?7 X$ ^! A% ~. o3 U PMU_Wait4IBE(&dwTemp);
5 b; Y& h! U4 \. r- P , D' J9 K2 I0 t' A2 {
SetPortVal(PMU_SC, RD_EC_SMI, 1);3 B- O$ Q) D4 N* r5 o4 |
& v: q( @$ I& S4 `* c% ^, G( q PMU_Wait4IBE(&dwTemp);' ^, V# [9 x) ]- ?: H4 i
) M7 e9 k/ r" L3 Z8 g. J
SetPortVal(PMU_DATA, POLLING_DATA, 1);; G& E0 X; Z' I/ Y. K
5 h& d$ h5 m$ L
PMU_Wait4IBE(&dwTemp);; l5 E# r- Y( \4 j4 p9 k
9 e) H' {3 F# @- o$ `! ? cout << dwTemp << endl;
! Y5 r4 t) ?8 U( q& X
9 M6 N7 |! v ^* l, X J ShutdownWinIo();! P6 B+ w2 s% q4 i5 {6 q- }
, N* p. X4 Z3 z% s/ ]. C0 ~
system("pause");8 P; ~. S& A) J+ D7 @& u. g7 ]
G6 T, r8 F; }6 G
return 0;
( Q* ]/ ~! Q# N. ~& E8 x4 s8 v3 [4 e}1 t) q- Y- j1 r5 G
$ Z2 q. }5 {1 Q& I6 L
void PMU_Wait4IBE(DWORD *_value)
L0 f6 {# j- h* c1 u0 w( b{5 i9 q/ A. [* E {' y
//######################################################### - Z E. H, t; M5 F
/*
( b: M( ^4 e( C pmuWait4IBE proc $ U: @* T# c) L4 M; J% X3 K( H
PUSH AX
% e/ P/ r9 _! B) W) A" o PW4IBE:
* C! b \% ?5 o6 j0 B. j) @. D9 S IN AL, 06CH //Read PMU status
) t7 a7 b3 F) y" y TEST AL, 2 //Is Input Buffer Empty?
9 o* R, E8 o3 V JNZ PW4IBE //Jmp if no
, Z6 N: v$ @9 _, S- f- h POP AX
8 S. S$ Q7 d' y6 _4 C4 ? ret
0 w, s6 u- {7 }6 x" Z2 U# |6 i pmuWait4IBE endp //END OF PMUWAIT4IBE
: N* Q, _- p& m7 U8 E *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空/ x# v, }* P% |$ G2 U w
//######################################################### * f5 Q; ~; |/ `( \
/*do
7 [ a% B2 J; @ L9 [ {
1 u# m/ N, d V6 y# t2 U& v GetPortVal(PMU_SC, _value, 4);
4 i- K9 t, Z1 f) n+ _# ^5 u" e- F }
. }. M9 C: R P/ y* @ while ( *(_value) & 0x00000001 );*/
5 `- \6 g: \) \ DWORD dwRegVal=0;
; A8 B v# H- V$ R K8 d% L do# d' O9 T: T8 u4 u
{
$ c. \' d. j7 |" c GetPortVal(PMU_SC,&dwRegVal,1);0 }9 A: f9 V4 \" Y; c% q
}
, c9 z* c) i, r( b2 q4 W5 o [ while(dwRegVal!=0x2);5 P' e: g2 @' ` E; V7 X
?1 `' K; ~5 @$ [
}
' p4 u; |- w- f( I' z; R4 H( K4 h- d; {( T: @
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
4 E" P+ H- x2 r0 \% d$ m9 A所以变成了死循环了。$ O8 I* m$ o' r6 r8 _7 a2 z2 a, C
( L7 c/ J0 C3 B6 f
我对硬件编程不懂。又不知道从何下手。+ @7 o s3 J% O
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。& X7 f' U: h8 M; y; {
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。& P9 n$ b+ p+ `" c9 b' `
1 l: X. ]8 Y: D' k$ f
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
, ^3 k: q0 [5 A( ]并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
5 D# k3 {" L5 m2 \4 r; b. g3 d* Y( s- w' A
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |