#include <iostream># x0 c( Q/ I: Y# d1 B* x5 M, x
#include <Windows.h>
7 M: t7 x0 m8 X* H; ?#include "WinIo.h"
1 o! [4 e: c; [using namespace std;! J3 M3 ^1 v; ~6 z
) V7 ~5 c0 I2 |: r
#pragma comment(lib, "winio.lib")$ G4 O6 C( P9 {$ q' V/ @9 O
# @1 S O: j% y( l9 k. l- k: m
! E# ]. a9 d4 T4 P" nint PMU_SC = 0x6C;//命令端口
! K# F+ ?* p+ Y( L1 h: V! {int PMU_DATA = 0x68;//数据端口
3 ^ a2 p( p0 Z/ `& c2 Iint RD_EC_SMI = 0x80;//读寄存器命令9 b+ } X! E2 Z! K* K1 l9 y6 y
int POLLING_DATA = 0xE7;//CPU温度寄存器号
1 ~2 k$ P0 {$ n: m+ N ]1 M6 a
& M$ l. d) u6 |) {8 q0 `' O4 MDWORD dwTemp = 0;0 O6 K9 a' v% X+ h9 A' y
5 R; n+ I6 {/ Wvoid PMU_Wait4IBE(DWORD *_value);! S8 Y+ j1 G# S4 h
void PMU_Wait4OBF(DWORD *_value);
! N( w+ P. L8 } s# C$ ` f; Q8 K9 z2 q) ?! N- I1 v
0 Z2 g1 i9 ?* z# X& i' k1 wint main(int argc, char* argv[])3 {& ?7 [) |# [) w
{
( P; m% r4 V4 m2 h/ r- z' u- }2 F. g if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;. d7 x& }" w, u7 W! `
\9 r; [8 W/ s- r
$ U- `& Y" I) k0 Q: L) I //1、mov dx,PMU_SC /// ?$ {2 U, q* y
//2、mov al,RD_EC_SMI //
+ Q% t( H8 U- c9 o% c4 t //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了# @+ X! W; J+ w ?: U4 B) J
//4、out dx,al //将读寄存器命令放到命令端口中。# y( x0 g! ]7 T% e" R4 A! [
+ H, C9 ^ ^& Y PMU_Wait4IBE(&dwTemp);, P _" F7 H( ?
; [+ ?, H* o7 X+ A/ R% } ] SetPortVal(PMU_SC, RD_EC_SMI, 1);
2 K" Z+ G( l6 r0 p7 f) Y' F
- C @1 y$ ^5 H PMU_Wait4IBE(&dwTemp);/ w# [7 C- u' d: C6 S7 M
. d- p' M/ Z) r9 ]3 Q& [1 q6 t SetPortVal(PMU_DATA, POLLING_DATA, 1);
8 b e3 b8 Q2 B" N( u7 J) n% f9 g" F* _5 ~- L( x& G& i: o6 M
PMU_Wait4IBE(&dwTemp);: I, z8 \7 Q; `# |. `
* H/ U/ t9 a C2 T- j9 ^- V
cout << dwTemp << endl; 8 W9 o, m \% Y6 ?
N2 R( N% I1 K# V i0 Z/ G ShutdownWinIo();
" l) W8 T3 [7 k m+ L
9 Y$ S p+ s( q8 P. O- K1 e system("pause");
6 w0 F" G+ F! a, I6 V& N1 c/ u4 ]
7 S& W3 {, O( a8 a: [8 A return 0;4 x& c$ j6 z/ f" @
}, e1 j2 b9 [1 u. X# v# s" W) x
( G* J8 C' x& d
void PMU_Wait4IBE(DWORD *_value)% i3 @4 e0 p4 J: j1 f H
{
" R, [: x1 m* e( v: G' m% w+ [3 p //#########################################################
. J! G1 Q" Q/ f: X' _7 w: o /*
1 K5 S: ^0 v/ K* l7 d1 n; o$ K pmuWait4IBE proc 9 {6 ?6 x# C! G9 l* {3 J7 R
PUSH AX $ I. ?" O$ {6 k( D- x) R& r! K
PW4IBE: - E$ F% h, n( \8 m3 c
IN AL, 06CH //Read PMU status # K% V* r; R& R; u, K/ u; I. T
TEST AL, 2 //Is Input Buffer Empty? 8 Z5 D7 ?" u3 e& h& [" u7 T
JNZ PW4IBE //Jmp if no 7 t+ G% O2 G7 @4 C
POP AX 0 E/ U* H G! o, f
ret 5 O7 | s' ?- z$ V3 B8 t
pmuWait4IBE endp //END OF PMUWAIT4IBE
. [" l' d5 ~; c# z, J( P *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
; |0 O4 f8 r0 T/ d1 ~ //######################################################### . Y, y7 o" I Y2 ~# v+ f
/*do
+ P8 J1 k: M( u6 t {
7 M( f( k! ?' Y4 A/ S) p; c GetPortVal(PMU_SC, _value, 4);; E8 i) H, h4 ~4 ~2 P: C
}
3 F: Y+ S) o, {5 N. u while ( *(_value) & 0x00000001 );*/
( `6 a: V* ?% v) E4 t DWORD dwRegVal=0;
5 H0 ?, w( K/ {( C- H do
4 {- D( Y) ~- k. k& x) a { / `2 Q2 W& F& q1 O0 y4 ^
GetPortVal(PMU_SC,&dwRegVal,1);
- W# T2 O G; ^9 L }: Q- G8 `8 j7 l' P; y% r9 ?
while(dwRegVal!=0x2);% |( r1 R* a# }; G
- q% T+ t2 h5 f% d0 G8 Y C: y6 ~}
" A8 n n! g7 B* V' O" N% [
( x6 I& {( d5 P以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。* P, C2 _+ A8 i2 ~2 t& U
所以变成了死循环了。2 C: I4 O4 ]5 ?6 ^2 D" _2 k
) |9 s4 e$ A+ [; w! V# V$ ~
我对硬件编程不懂。又不知道从何下手。
2 t N! v! U9 Z! T我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。2 L7 ?1 T5 q& d$ t
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
$ l0 E- i! s! E7 G* @
9 Y/ ~1 ]' B6 B: v' ^我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。% O8 h, D- q& a8 Z0 H [) `% [
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。5 w/ L( Z9 m1 E& x ?, ^" W
/ W* ^6 D J6 X5 I# M+ J4 ]
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |