#include <iostream>
# f5 O* Q$ G5 I& \0 f, U3 ^# k( H#include <Windows.h>
c4 c, ^! c8 Z* i, w' y#include "WinIo.h"
5 {: M% p% m* susing namespace std;
- q8 F/ {. E" L+ B8 v# e0 S) M: Y; I8 o* ^! b& c- p
#pragma comment(lib, "winio.lib")
1 {2 e* y, e. C2 i/ w
$ W; P6 R. K# d: |7 G( o! t, Y0 W* u+ X. x( f
int PMU_SC = 0x6C;//命令端口- ?: g5 h- D6 ]& l1 v5 s( v d
int PMU_DATA = 0x68;//数据端口* ~4 _: q2 c6 L% r0 \) l. [! `% y. B
int RD_EC_SMI = 0x80;//读寄存器命令
: M8 G! K# ?1 h k9 hint POLLING_DATA = 0xE7;//CPU温度寄存器号9 |- t' z; V1 q; A; [; R5 l
8 W/ N b+ [1 W" k, ZDWORD dwTemp = 0;
# `8 k4 c) w" v( {% X0 J* U
& C% r4 R0 f; `0 |; w: L, ^% ^void PMU_Wait4IBE(DWORD *_value);6 o$ X3 V, U$ x( E- k& ^7 J
void PMU_Wait4OBF(DWORD *_value);
0 X# }. Y# O W9 c* Q
! G ^+ y! D2 {% w
% L9 o A' r9 o+ J3 ~1 g2 e0 `int main(int argc, char* argv[])# b! b! }1 m/ _9 @
{. J _6 X5 E0 L, R6 w/ G! x
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
; [) t0 X% f/ M5 Y
% L P: B% H- p0 @
; J4 M+ v0 o8 f, E //1、mov dx,PMU_SC //
0 t2 ]0 D4 H9 O: l' W0 j) i. a- a //2、mov al,RD_EC_SMI //
) @! l- g+ t- Q2 R6 { //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了) v( ], A3 Y3 _3 H" U @
//4、out dx,al //将读寄存器命令放到命令端口中。
; w* m$ x# V% C J, @# Z$ v( v: n! p0 C8 t6 N
PMU_Wait4IBE(&dwTemp);
) k; a1 U8 J8 [6 E) ?
- n1 | u4 ]- o3 s+ z, S. K% } SetPortVal(PMU_SC, RD_EC_SMI, 1);* U& c ~5 r9 b! l9 j
' s B! E1 K+ Z! c
PMU_Wait4IBE(&dwTemp);' X8 r- s+ d( M" ]; J, |
- r2 y% ]2 e [+ E3 n1 N SetPortVal(PMU_DATA, POLLING_DATA, 1);
( K% I/ M$ Z4 F; r! A5 {) A
2 y: a: @, D8 ?3 b( K2 i PMU_Wait4IBE(&dwTemp);
% d1 m5 F! T7 v3 Z: R! l
9 ?' Z, K& p9 E. ]7 L( @ cout << dwTemp << endl;
1 a. E$ u; z* J
5 E+ b2 h/ F3 R, [ ShutdownWinIo();
3 [ v* _2 H( T' x' u* `' p2 q: ]5 P' h0 H; R. ` E! \ N
system("pause");
/ R1 A2 e% k. v+ v( a: K: m
1 K$ E. T2 v2 F7 |/ _& F# S return 0;
2 v! a. I, k5 P}
% Z5 l5 i3 S: z r3 B9 L( J* s. m1 S2 a7 d
void PMU_Wait4IBE(DWORD *_value)2 J1 q1 `9 v" e, w9 j% ~
{
$ J: f0 {4 B; r4 |& X0 k //######################################################### ! G$ ^# q& I; S1 U# ^9 I
/*
9 e) P/ z5 y* T+ l6 q1 S0 U pmuWait4IBE proc
- j' Y j0 x" ` PUSH AX " _) \ q% |" l! M4 X: ~
PW4IBE:
6 J" s6 L! }* Y5 T IN AL, 06CH //Read PMU status $ T/ Y# K2 i: z. m" [
TEST AL, 2 //Is Input Buffer Empty?
9 f1 {0 y6 p) g) l2 p( @ C4 i) z JNZ PW4IBE //Jmp if no 4 ^( N. C" O9 q% e( d/ I8 |: u
POP AX
! R! e( ]$ Q+ r3 e3 c0 V3 s+ _+ j ret 1 i7 v$ L/ R6 d" [: { {# j
pmuWait4IBE endp //END OF PMUWAIT4IBE5 j7 p+ u7 X+ k* f$ C4 r9 A, D. Z$ _
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
* X' W. U1 D+ u- ?4 e //#########################################################
5 X' E0 L6 _* R6 S' w" j c2 G /*do + C. V$ j9 p# F) y
{
8 _: T9 V9 w* i3 D+ N( D GetPortVal(PMU_SC, _value, 4);, e1 ^8 N) w: j+ S; a
}
/ M& g2 ]. ]' c8 w1 \, y& Y2 D while ( *(_value) & 0x00000001 );*/
P2 [( u" d7 s! J5 c; j DWORD dwRegVal=0;
, w! M; H* z* S$ d) B% r do2 {! A @7 Y+ B# {5 y" T
{ % C7 _5 y0 L" G" |+ L0 u8 Q( v2 `
GetPortVal(PMU_SC,&dwRegVal,1);9 r, M$ w) H: j. @; g: u Z
}
7 D' Z5 s \" C3 G& O$ n% x0 ? while(dwRegVal!=0x2);& a. P8 l8 P- u4 b2 M0 g
$ p }* n1 ~+ C" n! }+ L}8 y: W# f% j; }: l& t: e* `) Y; X
0 K' O' Q D4 L
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
) e g9 I0 f: C5 E; l7 K. R所以变成了死循环了。5 q# E% `7 o3 @, _: k; \
! n% n! B, W& p7 N6 Q
我对硬件编程不懂。又不知道从何下手。1 b/ ]; V2 _6 l3 J% x6 h
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。% a% _; b% Q: @% [% R
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
) D- W, C3 c( x3 e! W4 o
; b V4 t$ D: Q( K我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。; O% h' ^: n- Y' T* A2 z
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。' _- L6 j- B" N* A
/ y9 s$ C+ ^) a4 ?6 o; T' H
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |