#include <iostream>- l) n# s! |# u8 o
#include <Windows.h>5 m0 g2 a" S1 M8 k* H- ?. ^7 C
#include "WinIo.h"
' h% ?0 y$ s5 z7 @using namespace std;8 l2 l7 C+ X. P/ V0 F9 r* r
2 X" Q5 A$ K5 ?1 {- ?) p#pragma comment(lib, "winio.lib")
, x6 v% _& b" D4 _* z! y u# B% d% `0 M- G8 e& ~: \: { {' C! @' y
3 d' _$ H4 v+ y$ Cint PMU_SC = 0x6C;//命令端口# a1 e: x, S, ~ ]8 b/ n( q4 o) D
int PMU_DATA = 0x68;//数据端口$ E: ?9 p- Q ~+ j( |
int RD_EC_SMI = 0x80;//读寄存器命令
; d( O- ~$ X, M+ M2 ~8 M0 Z! N$ }int POLLING_DATA = 0xE7;//CPU温度寄存器号
2 w! E( g1 _! f! |/ m- Y4 a4 }) H+ [) K3 H9 u! Z- }
DWORD dwTemp = 0;
. |4 r1 w" O# S3 A0 ]' ~
; x% C0 @. A: H o( J- e) i/ F. Uvoid PMU_Wait4IBE(DWORD *_value);
. T# X6 j( V/ k$ n' j. e! A9 Wvoid PMU_Wait4OBF(DWORD *_value);
$ X e' ?" X: l2 h# e# A+ ^$ h2 M0 w/ a
, ~: ~. L' n9 f$ M7 cint main(int argc, char* argv[])% t2 j2 J# R3 o% @8 s& Q: V
{
+ R% N6 ^ W$ Y( U* Y if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;1 u& y d/ t" ?9 G5 A6 q7 m
( ~1 l% d" y5 O/ r- Z& Z7 s6 Y: ` + a' A. r1 N; A- q
//1、mov dx,PMU_SC //* r% F: {. z( f' H7 J
//2、mov al,RD_EC_SMI //( W8 f. n- S% s
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
2 [7 [) s2 D( Y8 @; d$ j2 N+ a //4、out dx,al //将读寄存器命令放到命令端口中。
% \! d& r3 I, G& |
7 K1 G- ]# G1 H7 f% [$ K PMU_Wait4IBE(&dwTemp);
: A+ @% b* N# F( [! s1 | 9 ]% a! l( ]* b
SetPortVal(PMU_SC, RD_EC_SMI, 1);3 S' t. O. h7 Z- Z2 R' M7 M T
& c1 p* {* b6 |+ X' g1 r# U
PMU_Wait4IBE(&dwTemp);. G2 f9 u( q: t* A0 g8 K
( K- z. T' }1 \* h) [- W
SetPortVal(PMU_DATA, POLLING_DATA, 1);
- }( t8 b3 \. p( D8 f. B1 q$ v2 m0 C) I
PMU_Wait4IBE(&dwTemp);* S' l3 j$ C$ K% R1 l$ i& n4 |
1 e: _; J# o. x/ F) f& N
cout << dwTemp << endl; * t3 `% Q4 u) }- ?2 C& W/ M+ A. M
W7 D+ [2 ^% t: w: {% ^ ShutdownWinIo();
! Q$ B$ H: I' B$ N5 s& _6 O' @: F7 P0 X6 c" O7 Y0 ]
system("pause");
; j+ E8 R+ @+ `% x8 G5 r; r4 \; [: R4 S A! X* c6 ~! T
return 0;
+ A0 K- K9 q- H7 a/ A1 r& y}" \. O, u; S+ X5 E
$ E4 r- j' X0 Z% Gvoid PMU_Wait4IBE(DWORD *_value) p$ o5 m4 T* g5 Z
{
1 D* H4 {1 o# ]* e! W5 A //#########################################################
3 E! K4 g1 e( v% I8 _# L: i /*
5 g- @: d& c; ^8 U9 ]% l& o5 G pmuWait4IBE proc
+ i8 [ c Y+ X! Y. a PUSH AX
% I' `/ k8 L2 |) y6 W+ Y% M1 f PW4IBE: ! g; d4 w; a3 ]% c
IN AL, 06CH //Read PMU status
. G: D5 a, r/ U9 L) | z! l TEST AL, 2 //Is Input Buffer Empty?
. G8 I5 p2 j$ Y9 A JNZ PW4IBE //Jmp if no ! A, i0 N# {6 K6 R
POP AX
( V8 y& g1 ^2 m# v3 S ret + a% P: n& W- v2 h+ h2 i
pmuWait4IBE endp //END OF PMUWAIT4IBE
" V/ O+ }4 P6 r* f. I- O8 R *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空( ~' I2 w6 T8 q) O% B" e; |$ H- |
//#########################################################
- I. @) W) t: {8 }: q* t: c/ K /*do
+ c5 i3 C9 B0 u. O {( J U4 L$ k' v( j+ K
GetPortVal(PMU_SC, _value, 4);
0 t, V+ X; ~/ b E' |% c/ v9 t" A3 c }
{" W* V3 Q. g$ J b while ( *(_value) & 0x00000001 );*/7 P6 @/ R3 a0 X0 S/ x
DWORD dwRegVal=0;
0 P5 q* T9 r( T3 D9 ~$ {/ A! ] do
/ c4 P# B4 z- l& g { 6 s! ], U2 c' o, Y) M6 x6 ?
GetPortVal(PMU_SC,&dwRegVal,1);. W$ K$ Z* ?' n1 }* J8 s3 O
}* i( u+ q1 u4 h+ Y$ I
while(dwRegVal!=0x2);
& |' J3 u+ Z! ], }, h# y
' y6 y0 _" C2 A+ L# P7 ]" r}
2 C- h7 H; ?/ D6 _
( D2 q. j- O- N7 e以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。$ v% O) c" H. K9 g3 ~. V% {
所以变成了死循环了。
) i- B7 D+ o% C' _3 ]% L- n# { h( R/ |/ F3 a+ x
我对硬件编程不懂。又不知道从何下手。
" k" B0 |0 m$ d$ Y0 G+ S我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。1 I/ n3 t& ~5 X
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。' Y# s/ S9 j& \: t6 r
$ b: f }! | m0 Q. C
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
' a' t& i- N# [3 R5 D p并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。0 y, h7 y, A1 z( A" h" N7 h
' ?& D9 H) s6 Y" T& Q
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |