#include <iostream>3 A; W+ e3 f: w& E1 C
#include <Windows.h>5 p- ?3 n9 Y3 x% _" Z. P) @' C
#include "WinIo.h"
( O3 D5 K' S0 g6 Q: U/ g! k& j" ~using namespace std;" h5 @+ @$ D1 {
( i$ ^; P& \& M# A
#pragma comment(lib, "winio.lib")
( c. _+ Y$ y4 z) h1 [
2 p \' \3 R# [7 ?
* P3 H9 N' L) e- P. F, ~) Sint PMU_SC = 0x6C;//命令端口
0 L) o; L: H, j! t' l: H1 wint PMU_DATA = 0x68;//数据端口
8 r0 {) A0 l" j- W) t$ Eint RD_EC_SMI = 0x80;//读寄存器命令' _1 K' J8 Z m4 [7 m
int POLLING_DATA = 0xE7;//CPU温度寄存器号
9 G+ ~, Y9 C- {
4 P6 |, y; Y7 \1 C1 |+ a1 IDWORD dwTemp = 0;
7 {3 i+ X1 C- ^' P
! v: X* u, `7 R* hvoid PMU_Wait4IBE(DWORD *_value);7 y" q |. P- n4 `% y! B
void PMU_Wait4OBF(DWORD *_value);
* Q: a. N2 q& P6 S6 R
: R% V/ P) V: {3 _+ H! t6 B) F' P
; A# K* m c- J4 d* I& o% N5 pint main(int argc, char* argv[])& `* u i0 z" e$ U5 s- d
{
* H: Q8 h4 U$ h$ A- U) S A8 l& I if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
( w. R% r3 d9 R; X7 c9 N5 i% s9 s
0 w, W9 L, i& F n3 I
/ u- A( W9 n! m. q$ ]8 t //1、mov dx,PMU_SC //% T7 y- A ]( b; M/ {5 K
//2、mov al,RD_EC_SMI //" S3 N* m+ y- ~
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了4 X6 x" l+ i$ G& |7 m7 p
//4、out dx,al //将读寄存器命令放到命令端口中。4 Z9 y/ R: b+ N4 m0 M0 j
! J# m& `6 [1 B, c9 V PMU_Wait4IBE(&dwTemp);
- w/ J4 [) d/ y, u6 s + p2 O1 C7 U. U/ Q
SetPortVal(PMU_SC, RD_EC_SMI, 1);
$ F8 E! V* \/ C5 w! G. X8 ]( _' B H# Y+ a' ` t! L
PMU_Wait4IBE(&dwTemp);
$ v- k7 \2 K1 }7 a / i' I& R% w' S! ~0 i) t
SetPortVal(PMU_DATA, POLLING_DATA, 1);
! i3 Z* v4 E3 Y# O8 P, s: d r
% M4 n' r7 q& ^: |; Q4 I, h3 a PMU_Wait4IBE(&dwTemp);
, Y3 O$ C$ {- A; K g, {1 ~0 J& y
, Z" ], p1 Z" G r cout << dwTemp << endl; ; |: }! _- @ ~6 w) B
5 @1 _) x% V* s$ ` ShutdownWinIo();
5 H# k* W, s2 u' p2 [, ~# ~! B
% ], }- _7 E! H$ I6 I system("pause");; W* a k* _' o
/ b4 E, G X6 g% L
return 0;
( r0 q0 s3 D* b9 P: _# }}
, k6 G c. K) ~- b1 ~ D& ]
$ n% P2 L n0 D L- I2 ^1 \void PMU_Wait4IBE(DWORD *_value)) y' O4 q9 b$ U+ K* A/ p' @
{0 B7 x, R, T$ n( n* a
//######################################################### : ~! X( c4 S: p; X h
/*7 c5 W% g# [. i0 @8 G6 q
pmuWait4IBE proc
) V; ]; ~; A2 K/ P d PUSH AX : [4 |' u p, N" ]5 \9 o8 g+ |
PW4IBE:
( e W) N& s7 D1 O( Q* v IN AL, 06CH //Read PMU status
! u1 U& t* C: T TEST AL, 2 //Is Input Buffer Empty? ; J, ]7 d$ `1 H( I8 ?# w
JNZ PW4IBE //Jmp if no
: K' `( a+ t7 ~& f! x6 B POP AX / R9 s) o0 o( m- b6 b8 ^/ `
ret , F1 u# E* [9 H2 ` B# o
pmuWait4IBE endp //END OF PMUWAIT4IBE$ Z- l6 W& {2 m" | S
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空
$ u# Q6 C, I% b. _ //######################################################### 2 M x6 i$ `3 m8 W* g5 Y: r
/*do
% h* i0 ~; x- [" v) F% I8 O' f {& j4 v& H: P$ S7 }8 ]9 j0 b, U
GetPortVal(PMU_SC, _value, 4);
3 [; v9 L) J7 k6 ~ }# h. @3 p# q3 O6 L# M( U
while ( *(_value) & 0x00000001 );*/
/ a& [) v6 B: b# T& f4 s DWORD dwRegVal=0;, S+ N) z/ {! O' P
do
4 ~2 Z; M% m; W$ K8 k. U { 1 T3 U' Q8 I7 c8 T' V/ ~. o
GetPortVal(PMU_SC,&dwRegVal,1);5 W6 G$ {9 {& b3 M0 _3 d6 x4 m( M
}0 H! n+ K4 }$ ~6 q \. n9 C7 X
while(dwRegVal!=0x2);
7 n3 t" {7 O, Z, c
# q) G Z+ _/ c! J. n}
6 ^! p% X# z( z& X6 s, j6 J6 S4 Y) v9 K8 H& G/ v: H
以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。
9 C" [7 ]! a) z- B+ `3 ]5 }4 C所以变成了死循环了。
, s# X1 C7 O3 l) u6 U2 U
" ?4 _- t, Q3 ]9 x& o我对硬件编程不懂。又不知道从何下手。# c0 b% J* p" K; D$ v9 u
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。8 t; G0 d4 c' x5 q* v
但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。
4 S( ^0 n% V( j: {( T9 ?( O+ V' N9 @' d. d( g/ o
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。( _+ l3 {9 P: S
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。# f* n+ {" A7 W# s0 U- R3 D
* Y* x% U i h( } I" [感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |