#include <iostream>
2 b/ Z% n. a# B7 y) |#include <Windows.h>8 r5 {9 T/ }% L* |7 _
#include "WinIo.h"
' q0 E+ [. i) {- }- Tusing namespace std;
& P7 g+ G- F7 u' W4 Y( \1 ~; k7 g. m& h* b9 ?7 Y# t/ o, R2 C5 ?! v
#pragma comment(lib, "winio.lib")
, P% H9 a8 G: X0 `2 G" m% K# K% C& }6 n& ?- r0 O' K
- j- I3 Y. z) H/ p9 J
int PMU_SC = 0x6C;//命令端口! l; Z& I3 t- I
int PMU_DATA = 0x68;//数据端口
# g4 w$ Y+ i. a" {- Yint RD_EC_SMI = 0x80;//读寄存器命令
6 W. c8 f! t- N+ J D/ Uint POLLING_DATA = 0xE7;//CPU温度寄存器号
, ]4 \: a9 g8 l3 v+ O& D" @3 S3 A+ s
DWORD dwTemp = 0;
; @* @& @9 s+ u& B* q- t, h" O& L4 [ @! ^) y
void PMU_Wait4IBE(DWORD *_value);8 I3 M3 a" v8 \) `! Y
void PMU_Wait4OBF(DWORD *_value);" a/ i% X% x X9 m$ d+ y; ^
* U' q) c# \( i# c+ x2 m
3 @) w. d c+ b1 p" t! O7 oint main(int argc, char* argv[])6 r& [: z" ?8 |2 R2 x
{- B7 W/ w. M( C, X6 w2 g
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;- {) w/ { j* S3 \( `
4 j5 K& U( C$ c: s
- V. G/ n, S: Z4 L/ o- U2 T e //1、mov dx,PMU_SC //
# j2 B7 ~* {& D& M4 x" Q; X //2、mov al,RD_EC_SMI //+ r8 _. p6 Z: l
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
: U1 Y0 _% i& a( @. m* \% c //4、out dx,al //将读寄存器命令放到命令端口中。
1 Z/ t' ~. N; ^5 `. P \, x/ {2 b7 t: L+ C3 D
PMU_Wait4IBE(&dwTemp);
3 i; ?( {8 x r u& S
9 Z- {" ?2 Y5 d: e6 F9 K SetPortVal(PMU_SC, RD_EC_SMI, 1);
% ?+ p& o( T7 R$ }/ p8 p& D1 i% W* S6 V: Q- A9 D i. x
PMU_Wait4IBE(&dwTemp);6 `8 P4 s( b9 a, ^
' y, [1 N# r5 S) H$ h, `
SetPortVal(PMU_DATA, POLLING_DATA, 1);0 v/ j6 I8 N0 J! y4 @
3 |' U/ }: K3 Q1 r3 d
PMU_Wait4IBE(&dwTemp);
9 l& j3 s& G S3 u3 _/ s
# r1 M$ q8 J; t9 X5 D. b' X) } cout << dwTemp << endl; $ v2 R+ B- U/ @& W# _: `
9 Q3 X3 F- W4 e" Y9 K ShutdownWinIo();% {% Y: z( e( R L' G: R8 q
e0 Z/ g/ N7 b2 ?' s$ c system("pause");
( [+ w/ H6 |5 d- t2 U7 O4 H; N% F3 L* K* }) L. f# R+ U
return 0;! {# w4 O" y: R5 Y% c& M
}. o$ }( [( F1 v% Y: d2 b
) ~- K" h- l j. ivoid PMU_Wait4IBE(DWORD *_value)
& q; D5 L- ^* y" Z- Z- L& g9 @{
9 S5 B( X# m% n) u' _) ^ //######################################################### k t) P8 p# ?/ U' m& K2 G8 U
/*
, m; p- S9 d+ H+ i3 w) b pmuWait4IBE proc ( e/ ^& E4 n+ f9 h f
PUSH AX
% Z! `1 W, h! E& f1 l4 h+ ^5 N PW4IBE:
+ R7 C8 Y( S% i6 O IN AL, 06CH //Read PMU status
" D. X$ Y& |/ p: H! s3 M5 B5 _, `6 a TEST AL, 2 //Is Input Buffer Empty?
' c {6 p( Z+ p% V0 Y JNZ PW4IBE //Jmp if no 0 {5 A* y/ `; H
POP AX
. B$ q- @) b5 N5 S ret
* ^2 t V' \6 k1 \1 N pmuWait4IBE endp //END OF PMUWAIT4IBE
: I0 y& f4 b0 k *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
4 O! |' l; j/ f' U5 q- H: u //#########################################################
: e' O- j1 l. Q6 o, f /*do
4 W2 ]3 i% i6 g {
; ?8 D6 S! `2 Y2 O' h) k# g( W GetPortVal(PMU_SC, _value, 4);+ w3 U( E) ~! r- J. H
}) Y q$ |! j+ ~. N( D& W4 m# {9 `) y+ v
while ( *(_value) & 0x00000001 );*/6 k, m* x) s) v
DWORD dwRegVal=0;
2 R& m4 Y0 z L- Z1 f5 t do
& \, X& |" I6 c5 i" s: c4 Z8 H. L { 1 ~7 x' Y' A% F7 {* H+ B
GetPortVal(PMU_SC,&dwRegVal,1);2 ]% V- v0 q# J+ s% q
}# n; O! s" X7 e# R3 s- O
while(dwRegVal!=0x2);; ?( S" u/ _% W4 ^5 d3 ]: F
) O; Y$ T" z4 P+ e}0 j& O* O) P6 G- L" b9 h
' i8 c9 T/ t' b/ t9 D; B. l以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。! e2 J0 S& \4 C# W4 l6 ~
所以变成了死循环了。
K" G: a8 l" Y! L% F- w7 w1 m" m
5 u) H) I1 V1 L' k1 ?, R我对硬件编程不懂。又不知道从何下手。0 P9 Q! g% h4 b5 ], ^( O
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
) G! n5 b W# r$ ?" R9 k- m但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
3 \; T- k1 T, ? J" D- M) L# f8 c, N2 P
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
) O. |* M, \8 j8 X1 N并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
. E) j5 G3 m- l* K5 s' n Z7 e$ m6 y, f8 J& B" v. U
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |