#include <iostream>$ X( G% G5 G: Q( i$ K9 R [
#include <Windows.h>
; x& R" {/ B6 P/ l- y( Q#include "WinIo.h"
6 P! ~+ r/ i4 u6 T5 w J; Rusing namespace std;
! v2 E. j! ~# b) h
* U1 n7 k+ f; \' F* Z) f9 m#pragma comment(lib, "winio.lib")
0 ]8 j! ^; x5 [! v6 o! I3 W5 i* ~& x4 d) F( j p
" C5 D$ L2 R: _. m! Xint PMU_SC = 0x6C;//命令端口" X; M7 ~; \, W; W
int PMU_DATA = 0x68;//数据端口
1 a! F, d4 n- ?7 l7 I( A! M8 u# t# oint RD_EC_SMI = 0x80;//读寄存器命令
7 ~9 W% t% O7 R% r: Iint POLLING_DATA = 0xE7;//CPU温度寄存器号3 i2 s; q6 @9 T; q; k4 t: A" h
: [7 |: r5 [9 v& G! DDWORD dwTemp = 0;4 q9 g3 H: L8 {0 m
7 V' q+ ^7 y5 z, a- ]$ {% avoid PMU_Wait4IBE(DWORD *_value);- f! z ~3 H* u" X: a
void PMU_Wait4OBF(DWORD *_value);
i ?4 S. o8 t. }3 Z
4 U2 U# r5 D; k/ g5 h0 u6 }/ Y4 n2 j/ ]( r" ]3 l: _
int main(int argc, char* argv[])7 i( `+ [ ]3 D. L) i% K6 N
{
5 J# s( |% X/ z$ Z C) W8 Y8 Z7 y if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
, e5 q! w: Y5 o" c% q, u. [; R# L- L3 c1 R
! S) V2 ]8 K# S; e //1、mov dx,PMU_SC //
: X- D9 B+ {* F+ g9 h //2、mov al,RD_EC_SMI //
4 q- ?2 h- ^6 n+ c //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了; D H, } f8 }$ s* D. u
//4、out dx,al //将读寄存器命令放到命令端口中。4 [1 U( K% c* `" }* O
' T/ T; f1 v/ z
PMU_Wait4IBE(&dwTemp);. c) y. x; e3 ~
$ n% a0 x: I: V) E; D g; T
SetPortVal(PMU_SC, RD_EC_SMI, 1);2 s0 d7 R* K% f! G$ |
3 r; _! A5 q: _! O# r) H8 B# } PMU_Wait4IBE(&dwTemp);
* F9 ]. b0 f$ b" ] - \$ J, H& b# k2 _
SetPortVal(PMU_DATA, POLLING_DATA, 1);& c& o1 y; f; X- M0 Y
( H' X/ a, q( a) n/ S T* f! M, g8 K
PMU_Wait4IBE(&dwTemp);2 L. y2 x" |, Z
+ S9 Y# p1 T4 \, g$ K
cout << dwTemp << endl; ) i- |- d1 j& H0 A
. n. I7 E$ m; Z8 @& \9 } ShutdownWinIo();2 ~7 `+ M: Q/ @' `- D* \
% d7 e) h$ m# L9 c: j- s
system("pause");
1 I* i' {5 j/ }* r8 k5 x+ M$ d) a& D8 {
return 0;% G/ {. V- H& P4 r+ T' m
}# J K. l8 x" _7 g
+ ^: u2 k' u2 _, g/ Z, O0 t: nvoid PMU_Wait4IBE(DWORD *_value)* r+ _1 l# |4 K1 q
{6 O$ n7 M, y) C$ c! a4 L
//#########################################################
" [1 r. R5 J8 G5 L# } X /*
$ T# j' L; ?$ q5 G pmuWait4IBE proc
( f) X) X; F- x+ e, X0 Q PUSH AX 1 r) d, M9 M: ]
PW4IBE:
5 P6 v; U8 Z% O1 }. H! N IN AL, 06CH //Read PMU status
" y+ A: M( E$ o0 h TEST AL, 2 //Is Input Buffer Empty?
' _' i" t% [/ }6 I( C JNZ PW4IBE //Jmp if no " J4 K5 n; g# T! T
POP AX
# |5 C2 e) x' B# l ret
7 q S; M+ V% D$ g pmuWait4IBE endp //END OF PMUWAIT4IBE
3 d' T* }# s' Y3 Z5 o$ @ *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空* I, W ^' q6 [- b. h
//######################################################### 8 B: G( k; O4 b' y- O
/*do
4 g5 E6 E. E( E, z- z {
7 U4 G* n+ y4 G! [1 h; N& h; |* ~ GetPortVal(PMU_SC, _value, 4);6 w( ]! |3 J- E* Z9 o8 N
}
+ N( `( J9 W4 k5 M8 R while ( *(_value) & 0x00000001 );*/
) Y; j! ?3 h9 S& r0 C DWORD dwRegVal=0;
& t# {' b0 L( ] m do
5 d; F3 W2 `, ^+ l! O/ L {
' s# p! E. u6 C GetPortVal(PMU_SC,&dwRegVal,1);
6 O1 a. v+ ?1 f% h A- Q7 j }, K8 _. X& F4 k
while(dwRegVal!=0x2);( z' U7 B% ?3 ]: I& ~9 x
; f7 P3 ~7 k4 g}
) I) j! \+ {: Q( U8 ?) Y% r" e' `
. v# \' T; y+ q) y以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。$ `' [6 i% v% U7 ]/ \: c
所以变成了死循环了。
1 q3 i3 T+ S) _ ?. P3 d( {' I9 h/ d" V& w& t8 c2 z
我对硬件编程不懂。又不知道从何下手。
8 x: W9 T, Z# F! |, M( H5 G我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
% ?" d/ B' C, n8 z但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
2 S* n' s0 x9 T3 u# C
, ~$ y& h6 w5 [) c M5 Q我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。, }4 F/ `* G& L
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。
4 _7 h1 R" L) G8 E
; D% A7 z; X7 p2 p2 A感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |