#include <iostream>
) t& g8 |) Z6 k5 Y: ^5 P( U1 ~. {' L#include <Windows.h>2 c8 l, y/ p3 T/ y5 _& r
#include "WinIo.h"9 S+ ]+ |7 H! R3 h3 ^9 k
using namespace std;
2 {, U/ f7 W, \
6 ~8 g* a `& G3 p3 d; f% d+ a#pragma comment(lib, "winio.lib")
: m7 R0 Z$ h" G* L) {
_3 J& o6 e$ @- D; W8 [9 U; H. E# I$ x6 F5 v9 e) T5 q: T- G( c
int PMU_SC = 0x6C;//命令端口
& F1 d7 S# \; a4 nint PMU_DATA = 0x68;//数据端口, r7 K$ v- @2 H$ u, j+ y6 H
int RD_EC_SMI = 0x80;//读寄存器命令
& M$ |5 y# L& }; Eint POLLING_DATA = 0xE7;//CPU温度寄存器号
0 [, E% z/ t1 |$ b/ v" s, ?
; ?# K" k: \* a# K0 ^' M" N: C) D. ODWORD dwTemp = 0;4 @1 z% A. c8 z6 u. S
7 M! g+ o1 s; i" ?. }
void PMU_Wait4IBE(DWORD *_value);
, | v h9 L9 Uvoid PMU_Wait4OBF(DWORD *_value);
: ^: a, u7 `0 {6 {* d2 x, W5 o( E! H/ H. V) I
9 L$ t8 Y0 \: r9 o
int main(int argc, char* argv[])6 S+ a% ^% c) h. E1 z; p: i
{
$ L1 ?: M( S7 j, a- L6 d" K if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl; a( {* d7 U3 U0 n# u( s
. n0 d$ p5 z1 O% H( Z
2 L7 k; s W0 e% j- B Q //1、mov dx,PMU_SC //1 w* g" Y# I# U4 V. v7 C
//2、mov al,RD_EC_SMI //
: `7 o: a4 N1 q //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了3 p2 ^7 U$ q, Y9 F; ]
//4、out dx,al //将读寄存器命令放到命令端口中。
/ \/ a$ i( m* q" v
' b4 E5 Z" \8 x- i% L PMU_Wait4IBE(&dwTemp);& y3 d7 B9 z# T( I9 k8 |1 A& B
8 x% V- Q b( W
SetPortVal(PMU_SC, RD_EC_SMI, 1);
' ?0 z3 V; S; P6 \4 q8 Q; K- y0 H. t7 P* c3 Y+ _1 G$ w
PMU_Wait4IBE(&dwTemp);
+ \ ~! \8 _1 g; ~' i6 W% b
- {3 d/ T6 V2 B2 c" i; z SetPortVal(PMU_DATA, POLLING_DATA, 1);; b, D5 v4 z7 n. ?4 y3 h* U: |
1 ], E* j* A7 l3 ^. J
PMU_Wait4IBE(&dwTemp); R9 I. @( ~8 }" k" {
0 y+ U) _8 W# R4 l
cout << dwTemp << endl; 0 l- Z" E/ g& Y) Q9 R9 ~
% Y6 f L7 S7 [3 a6 @# P) U/ ?1 N ShutdownWinIo();) l9 n8 S- m1 x! _+ }. e; x' l
7 q9 [, ~& U- c. N) E9 V: T5 K7 p system("pause");
8 Z: z) {7 S0 n6 Z! S- @. W4 N: S% n/ |6 n1 b% T ^7 j
return 0;2 T2 X& c! Q8 A, Y: F0 g
}! L. A* ~9 p; C% e; @
) U+ X8 ?) G9 h/ evoid PMU_Wait4IBE(DWORD *_value)
% c! @- [0 Y0 C3 w" p8 r{0 E2 }7 y+ M. y4 @0 n3 Z6 c
//######################################################### 2 d/ W$ u1 u9 R" Z' v% J- e) \
/*2 ~3 l7 s7 g! V4 y
pmuWait4IBE proc 6 c4 H% Q& M$ k8 {
PUSH AX
+ W/ {/ r/ I& m5 D7 ^7 l PW4IBE: 3 ~/ H' B% x3 Q; {2 U: I4 [
IN AL, 06CH //Read PMU status ; m! u: l3 Z5 M" M2 ^0 k9 l: V# _
TEST AL, 2 //Is Input Buffer Empty?
) V2 \, g* V% q0 p" t- M% P2 Y JNZ PW4IBE //Jmp if no
: v3 T& Q) y5 T& v. e( j* B POP AX ; y3 a, ], M6 }$ r( A
ret p6 ?2 p" o; N E2 a. Y @+ O4 h
pmuWait4IBE endp //END OF PMUWAIT4IBE n4 ^$ H% }1 X6 z
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
1 U* } U: S3 ~. f7 v# W //######################################################### ' u& I" O% a4 o6 O' R) ^
/*do
5 V1 i+ |: k8 s* C5 C {1 N# A" U$ h) g% A* ^% o0 L
GetPortVal(PMU_SC, _value, 4);
/ S2 v; H: r) l! z1 { }
) D, d2 o9 Y( z while ( *(_value) & 0x00000001 );*/
7 t9 Z7 `' k' e DWORD dwRegVal=0;2 m* N0 B, j: T7 s: J" m
do
: p( u) d C; a, F; \7 Q* n. D# \ { 8 G4 k& x3 U' F' ^( n V5 {5 V6 Y
GetPortVal(PMU_SC,&dwRegVal,1);
( f0 X7 K1 g- B. Y1 c% U% M }$ N- R3 s2 W) \! l
while(dwRegVal!=0x2);* N0 x) P0 M5 J- j* h
2 W& [3 t: ^# T}
`# e' i+ U# X+ v4 F$ ~: G* P# x: i, _" U5 N8 w7 t) {8 o
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
Y P& J" D8 H! X4 f所以变成了死循环了。" G4 e( N* p, _2 b
% j8 p9 D' t# O1 W7 c我对硬件编程不懂。又不知道从何下手。
4 H! L) |! B; v3 g8 G我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。# \0 s' _4 ?$ x' X1 B: D
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。* X4 d5 z; Y: L/ |( u3 n, v) g' w1 x
" v$ O8 G/ p3 i3 m: D# n
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
5 u9 P, S: h+ f/ `并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。6 z0 x( ~( l% V3 g# x1 ?7 o" y
0 S! Z4 N+ ]0 s感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |