#include <iostream>& v( H5 x9 s6 _7 K% Z4 M4 g3 T- v* }
#include <Windows.h>
) e# m$ i6 A* X. l# _0 R#include "WinIo.h"
7 j1 X0 X* i: \* u% w vusing namespace std;
) R3 M" B/ {. u
, W% A, O+ ^4 K9 ~, Z& D#pragma comment(lib, "winio.lib")3 z6 U* w) F3 u( I9 t
( s( X" ?. N: P7 U7 [7 L+ _ O$ C d0 [/ ?6 [
int PMU_SC = 0x6C;//命令端口/ ?' x3 v) h7 K' j* a' A5 f
int PMU_DATA = 0x68;//数据端口9 z* M" U. {! n" k7 O; a; B
int RD_EC_SMI = 0x80;//读寄存器命令. F! x4 h: N* b3 ], N2 ^
int POLLING_DATA = 0xE7;//CPU温度寄存器号# S" x+ T8 j1 x. [
& r9 V( Q( f" p7 P& R) j* O3 KDWORD dwTemp = 0;
3 u4 T( A1 X4 b6 g" ]
5 V! o8 s/ c3 o+ v* Svoid PMU_Wait4IBE(DWORD *_value);; H4 {6 b5 V, {/ }5 K
void PMU_Wait4OBF(DWORD *_value);
8 X T% m6 @9 ^" d
|1 x$ _" T/ \0 I" h9 {0 |3 J" g
/ Q, I3 |2 [! @& J- w8 Vint main(int argc, char* argv[])! i: j/ {4 j/ F7 v7 l! b% v: K" j5 J! c
{
1 J+ K- a+ n: v6 {: R5 } if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;5 P* R0 J( B- v
2 \( U" j+ [2 d* V/ w' t ; Q5 r) m- I4 t% Q6 [( P" j
//1、mov dx,PMU_SC //3 o2 Y& ^0 l3 j' v6 d0 i ]
//2、mov al,RD_EC_SMI //
8 ?0 d! ]+ Z7 T" J //3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
- A6 \7 U/ M2 r2 V6 h& y1 { //4、out dx,al //将读寄存器命令放到命令端口中。
$ `/ c& i+ P0 g E% K; _0 q
% ~+ p, U9 m6 j- L. G: [, l2 s PMU_Wait4IBE(&dwTemp);8 p1 R4 \' X6 ?+ z, z% I. ~# z! P
1 I% t" P! F5 ^
SetPortVal(PMU_SC, RD_EC_SMI, 1); A3 R: E3 Q( c$ o* v
& O; g, L& @. [# P1 d
PMU_Wait4IBE(&dwTemp);, @9 r% ~6 n4 Y! _
) x0 K! _4 m7 f9 q2 h SetPortVal(PMU_DATA, POLLING_DATA, 1);: @' [8 R, J6 I* L: o
9 \! V( \/ H% ~0 X$ e) Y
PMU_Wait4IBE(&dwTemp);
! m7 n/ x+ J* }5 c/ p! T/ j. u K+ D
cout << dwTemp << endl; & A- ^* N% j# P, G* w, [
) s% ^! p2 q3 _9 Z* k
ShutdownWinIo();
- a& r& d% @( I0 J7 n b7 D* [! k) i D$ f6 R* V k7 k- r
system("pause");
5 n0 c1 C( l& y$ M8 W( q; l3 o
5 ?, T: Q- `5 q* G: `9 d1 C: @" [ return 0;
, i' v. b8 E; C! E* C- b7 l}0 A; g: n! f/ z* R* Z) K6 X# U
: H$ p: S" R' i3 o& C, z
void PMU_Wait4IBE(DWORD *_value)! _9 R8 S6 u4 m3 G9 _
{
1 U% n& W1 e4 t! j! C //######################################################### , x% c, p; U( s, h. K1 l
/*/ t8 ~" f8 u, v+ {( r0 w' D
pmuWait4IBE proc * o1 h$ N! p8 }$ A$ O
PUSH AX " H# c) W5 b2 S$ n: x
PW4IBE:
7 m6 d0 S) u X; \2 U4 r IN AL, 06CH //Read PMU status
- E! }- c. H6 R9 F+ k# E8 U2 U TEST AL, 2 //Is Input Buffer Empty?
6 i* C: T6 F+ i" W \! o& K JNZ PW4IBE //Jmp if no
( X, H: p) d+ K* n# b# Y ~ POP AX + k5 G$ T& \) N. c' |; _" r* M1 m1 _
ret
0 x- [% i$ ~: G# ^0 q) n3 W pmuWait4IBE endp //END OF PMUWAIT4IBE, Y0 `! \9 T z- z; R% B
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空2 z7 S0 [. ~* F1 f2 H$ M
//#########################################################
; v/ |- _3 ?7 |. \; C" r3 p2 E /*do
: y; h0 o: \+ ^6 ^7 h/ y$ s {8 R, o" J5 X+ R* V
GetPortVal(PMU_SC, _value, 4);
# m: N" t7 T$ ^ }0 |( {1 S) I* ~4 M8 U5 n0 }/ X
while ( *(_value) & 0x00000001 );*/ ]# v0 r6 `- |( N5 F. X: O
DWORD dwRegVal=0;
' J1 d2 a9 B) j6 [! K2 \! o do. \( p {) Z8 o
{ 3 O8 P. D2 p( j0 k/ q
GetPortVal(PMU_SC,&dwRegVal,1);
1 y8 z5 z1 J" I2 |2 u }$ w5 V7 u0 R- c7 Q5 R
while(dwRegVal!=0x2);* _, t( Z* x; ~1 S l+ W) J
9 Z; a$ {0 e! Z8 G. b/ X
}* \) k, f8 W& X8 s/ r! B
( V9 }% d+ s* a- Z% n3 L以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。0 M b* C+ U$ ]; \: _
所以变成了死循环了。. Q8 j; q) l9 r, i
9 o8 u, R1 s0 t7 U
我对硬件编程不懂。又不知道从何下手。( \) q: R, c4 i4 G( ^! k
我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
) S5 }2 C6 S: A W$ o6 J$ {但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。! [$ E# r, W9 t [! h
4 Z4 X1 N s' Y, t. V0 Y- y+ C1 q
我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。
6 K1 C* f, Y) _并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。6 J0 e0 R9 p! A2 c; w
! c2 i( c( q& P- q
感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |