#include <iostream>' n$ ~: {5 A2 e6 O5 F7 ?- x& \% Q
#include <Windows.h>* O+ x/ }! Q* _' p; _: Z. C
#include "WinIo.h"7 X# G4 m( D3 E; J
using namespace std;
6 H4 f0 [1 t) I5 T9 _" O$ o3 X( q$ H. ^% x# v
#pragma comment(lib, "winio.lib")
' H( u i# w& S$ [8 x5 t! s' O) f! H4 F' R5 c' Y
5 L! \" t( g. _ Q% k/ a/ Sint PMU_SC = 0x6C;//命令端口4 y/ y' a0 D, z7 z; i* d* S
int PMU_DATA = 0x68;//数据端口
; L5 |7 ]" B. W* Fint RD_EC_SMI = 0x80;//读寄存器命令9 v& O- f* J5 V" y, j. E6 u0 i C1 z
int POLLING_DATA = 0xE7;//CPU温度寄存器号7 r& M# d$ l/ a+ h1 T
# A; o# p1 _7 H0 g% U9 B6 P ?DWORD dwTemp = 0;! A, E4 e7 {- J9 a z# d8 R- b# V
. O2 s' N0 C( }; N) z1 \void PMU_Wait4IBE(DWORD *_value);
) U: ?% `; N# ^* c1 g0 H: |void PMU_Wait4OBF(DWORD *_value);4 n' c; X1 N2 `' H1 P& l# P
0 u. h* J* f2 {- r* |/ ?" H3 X% g7 X* }. L& f1 J, W( ~
int main(int argc, char* argv[])
# b5 u3 l8 [! J' P5 o6 n{
2 j" ]$ |( F9 x* c$ X: b if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
1 ]" T3 H G m g$ S2 _% D
# J+ B. v+ l# C4 F- | 6 B3 _5 H8 F4 n# d) |+ D$ ~
//1、mov dx,PMU_SC //
0 V6 v; c a o5 s4 Z' ` //2、mov al,RD_EC_SMI //
4 s! `2 r7 A1 \, u {4 Y //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了, A0 s( m) m) H$ ~4 E6 T1 v! j
//4、out dx,al //将读寄存器命令放到命令端口中。
3 a- k6 C: U0 o* ?5 E/ P% L/ B& J" W# N* E0 S
PMU_Wait4IBE(&dwTemp);' P) |2 A$ n4 g, q+ l1 @# u
* S9 H# a( l: Y% F SetPortVal(PMU_SC, RD_EC_SMI, 1);. Z4 m: i7 [( `/ P& S
# p: O& P1 J# G3 h PMU_Wait4IBE(&dwTemp);# e6 G) {2 ?$ I, x4 W
7 o J z) u! u$ W5 t SetPortVal(PMU_DATA, POLLING_DATA, 1);) W( h% c8 T4 f( S4 [/ K
& K1 P8 D7 F. c; [ PMU_Wait4IBE(&dwTemp);
$ m8 c/ r$ s3 r
* r' W2 l! q, H* [4 o, n cout << dwTemp << endl;
! q. E+ v( T5 M4 q* g0 G2 ] b* u+ s0 @
ShutdownWinIo();4 f7 p6 f* z* ^- C" F* e. E
% r3 p/ `7 K$ H: K2 B system("pause");
; Z1 i% ]$ X3 W/ ~$ U0 e- l7 I$ R! {4 V! |1 c" L4 M. P
return 0;
, D& y4 p7 i) C8 m, j}) F. _6 W7 {; w9 H* @
8 Z0 G( o8 c' x) m6 v2 @void PMU_Wait4IBE(DWORD *_value)
, |0 P* y1 Y% E6 n- Y- ~3 b{8 K0 Z9 d4 r' C
//######################################################### ; B$ z- I& v( A5 K6 M% M
/*- J) v) G- L0 q' ?. m
pmuWait4IBE proc % V6 L+ t% X& s& A4 D. Y! j9 b1 P
PUSH AX
/ i7 t0 w5 O7 R9 S PW4IBE:
: M! L) o* h T IN AL, 06CH //Read PMU status # H7 b0 a- ?( O9 p1 O' T! u! d5 t( m
TEST AL, 2 //Is Input Buffer Empty?
! h$ G& g! X" _) u JNZ PW4IBE //Jmp if no
, K- Z# w" A; R& ? POP AX
. H+ f- D" A$ O* |0 I) _8 Y' C ret , G% Z) E3 C1 g' A: h+ ]
pmuWait4IBE endp //END OF PMUWAIT4IBE
' O$ z1 q; @/ R- K, u *///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空4 N) b0 S; U* O( }
//######################################################### ) C3 M$ A1 U: a J: f) \( x* {
/*do
. C- S* ~+ F& ~ {
5 R/ _+ a1 n( P# ?$ i! h6 E5 z GetPortVal(PMU_SC, _value, 4);
* I3 @7 m4 R. G& Y6 z6 @* q }
( g* X$ T& _5 J- ?* P# }# C4 ^' S while ( *(_value) & 0x00000001 );*/
; v9 I% D) g* ]8 ]. u" s DWORD dwRegVal=0;
+ p+ t* S8 M: y; L- r$ Y do
' f$ Z- }* u: }5 y7 W# H/ S { 2 H) S+ b9 j6 ~9 t
GetPortVal(PMU_SC,&dwRegVal,1);
& B6 K2 u& t$ D; W. i }
, F' q0 F" ^. p) D9 o- v while(dwRegVal!=0x2);4 V8 a2 f: |( o o1 B. W$ \
1 W9 B0 X5 r7 ~( _/ c4 t" }. R. ^}
% e$ X" A' S+ W- y
8 D5 u, W6 t8 U# K" I) I以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
/ m8 h4 g* Z( y5 t所以变成了死循环了。; F3 v. o/ B9 y- X4 ~
! H, X. x# t9 B8 O0 H" _
我对硬件编程不懂。又不知道从何下手。+ |# B7 D$ ]! H% e1 y
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
+ V: N7 Z0 w$ A, N, [: T但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
) i6 l- P. _; C/ H2 ^) q
3 K* N6 }: `# {+ P- f$ P我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。6 c4 A7 M9 X! V9 c- I- N3 h% q
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。& |# T6 f/ x7 i- u
9 I3 p# S6 j, o4 z感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |