#include <iostream>
. T5 p5 m0 o& j#include <Windows.h>& g8 J& R, I9 E* }! T$ P: d
#include "WinIo.h"8 f3 d% A, p* H5 g" _
using namespace std;9 I! T: o k; G. X, d+ a
" U/ S: @" ~/ N7 t; ~ R#pragma comment(lib, "winio.lib")6 o6 @& g$ I9 U) B. S5 d
2 i$ H4 q1 Q5 Q4 F6 }' m4 E6 _0 C
: |0 x# p6 u9 A& Yint PMU_SC = 0x6C;//命令端口
. a& r Y1 m0 C; m% Nint PMU_DATA = 0x68;//数据端口
4 q3 ^$ {, x5 T+ S7 t: a' _' k, O! Y8 \% mint RD_EC_SMI = 0x80;//读寄存器命令
6 s8 d& d) G3 |+ x I1 ?( Gint POLLING_DATA = 0xE7;//CPU温度寄存器号1 q1 `) H( U3 H/ ~
$ e4 g$ c2 ~4 {5 _ A" S0 K- NDWORD dwTemp = 0;
8 R2 H5 k- y% X( b, N( D. B- F& A
- ?" I! w5 K/ [1 Dvoid PMU_Wait4IBE(DWORD *_value);; b# h% e+ B1 S
void PMU_Wait4OBF(DWORD *_value);3 q: S8 F. E* k* U/ I% ?, p+ X/ ]
! V: J2 r8 w6 i {! v) x
3 ^9 O' q9 \3 W: vint main(int argc, char* argv[])
7 |: m3 w7 [: e& Y) k- r- h{
/ z5 K5 X2 ]- Z if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
% o' D3 s1 O+ L! A7 ]- Z
1 [4 f' {3 P( ^" w ! O0 `# V* j$ r1 n) D2 J9 C
//1、mov dx,PMU_SC //' e N' g1 D& d4 J( k
//2、mov al,RD_EC_SMI //2 M0 @9 M' }4 d
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
1 q2 l+ ?) f" f2 ] @ //4、out dx,al //将读寄存器命令放到命令端口中。
# K8 p5 ~& {0 ~3 X% C8 Z( C2 V: s
- |1 A, F8 D$ ^4 o PMU_Wait4IBE(&dwTemp);2 w! O" \. f; |4 b' I
1 Y" K; d3 t* ?+ k3 Y
SetPortVal(PMU_SC, RD_EC_SMI, 1);
7 f ^' ]1 g8 ~5 R9 v( C8 }
8 v1 @) V: Y i, C2 f5 d& J PMU_Wait4IBE(&dwTemp);- h7 A$ r) i! Z7 W
8 p% p. v* w& F- D, F- g0 I
SetPortVal(PMU_DATA, POLLING_DATA, 1);* a+ q+ Y0 S; `$ o, ~
2 p) w; d" p8 q: e' T PMU_Wait4IBE(&dwTemp);
6 r' c% L" `5 B t# N5 c* Q! S
' y3 {0 g1 p/ f, A& j! [ cout << dwTemp << endl;
' O- Y4 D* O3 n$ ~4 z% [
, _" a9 m; @2 S" w5 n7 C ShutdownWinIo();
- ~5 q# |) ?# C& L: F3 ^/ x! d! ~- Q j# U
system("pause");
, }: ], u X) C
& e9 n6 Q2 a; i5 }! L$ [9 _$ ^; B return 0;
8 g5 f( V! m6 N! D }5 Q}
% u4 C: E g! T! b8 Z( }7 f$ b, |' M2 ?9 O0 ?
void PMU_Wait4IBE(DWORD *_value)
& ?* h2 r9 e7 h) x{$ {0 v! G" m: w' t6 s* W
//#########################################################
, J6 Z! @ E$ Y& G' t% W /*
( T0 R% V/ {) V) u$ W pmuWait4IBE proc
D7 Y8 P7 J. o/ F: \7 c. r' U PUSH AX 1 a/ U1 r0 y/ y% r
PW4IBE: ' P; x1 q' d7 h# I
IN AL, 06CH //Read PMU status
7 N; C6 G8 O- W TEST AL, 2 //Is Input Buffer Empty? $ @0 j* D1 ^* V9 k6 Y4 h
JNZ PW4IBE //Jmp if no 0 t1 G, c+ k+ b: h' K
POP AX * [7 H6 b$ y. B' B4 n- P* C2 y* y4 Y
ret
4 j+ X. T6 Z; _. S7 o( {! B2 M pmuWait4IBE endp //END OF PMUWAIT4IBE
% B3 u* s5 J( d9 K& V) A' b7 A9 f9 w& w *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
8 z* v! e& a/ a) @3 |' G! c( q9 N //######################################################### 0 z3 O6 M4 U* M/ t% @0 D
/*do - n% U7 R5 u$ Y9 ^1 v/ f9 F
{% h! D8 G7 w& z, X$ x |1 Y
GetPortVal(PMU_SC, _value, 4);
' Q/ R' q$ @& q$ x" b, [ }. K8 N3 P( U) j1 ]( l. N7 P
while ( *(_value) & 0x00000001 );*/
) h; w# M0 q, Q6 m DWORD dwRegVal=0;' D; q! B4 i4 l) N1 M: ]
do6 Q1 a* S' F1 L& x& Q% I: g, [
{
" f+ { x: f6 Y3 r9 | GetPortVal(PMU_SC,&dwRegVal,1);, |8 v2 D6 P; T/ T( c
}
1 p5 L6 `* t% H; Y9 G5 X& `; e: l while(dwRegVal!=0x2);
7 b1 z4 ] J( B' ^8 ?, ^2 c( K2 {
}
/ W$ L$ h( g4 F5 b7 [1 Y2 C, m6 q
6 x2 q! F/ v5 R以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
& H: t, t: z5 B+ G4 N所以变成了死循环了。" P7 R% Q; ?6 H: I
- L+ w% u" Q3 n: S6 u0 B我对硬件编程不懂。又不知道从何下手。. Y3 `- I5 V9 A5 Q
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
3 N$ s' w$ a" S1 {( L. x但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。. z9 G6 ?8 w; @& f# M% b
) o* m6 v9 t- y. u; ?我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
" j! \* m6 D8 o: a8 F. k3 z' G并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。! A/ m0 N+ [! |
: i V' R& T& P3 r& O; D; @
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |