#include <iostream>
- P8 j" \6 \- j" }1 q7 u% c/ x#include <Windows.h>
8 v. D! e4 c/ m. M" ~- a9 E% T#include "WinIo.h" u5 ]/ N% f) b7 @$ m
using namespace std;
* {* E# r% K) s2 b) O5 w1 f- t. ]$ V8 }" ~3 h3 j
#pragma comment(lib, "winio.lib")( J* e5 n) F' z7 n; e! C/ v
/ r" H+ u! h) ^& U
5 C8 I" c1 l" _! R* D5 `, gint PMU_SC = 0x6C;//命令端口# @9 H' s$ Z% |
int PMU_DATA = 0x68;//数据端口
2 d" U8 F# T* j% t, Mint RD_EC_SMI = 0x80;//读寄存器命令
1 o5 V0 d2 R0 V- _3 L1 v: p/ eint POLLING_DATA = 0xE7;//CPU温度寄存器号
. {: W/ ~! j2 q7 T% s
0 M7 m- b8 J/ ^" eDWORD dwTemp = 0;
: ^% L( e5 C* }
) }9 ?# t1 C- N$ K( B kvoid PMU_Wait4IBE(DWORD *_value);0 W7 ]0 E8 [# }' v5 t
void PMU_Wait4OBF(DWORD *_value);9 E3 k3 g' c1 i# y
% v# g9 ]* P" l f5 S1 W' H
5 [- e% _, f% X: P7 w }int main(int argc, char* argv[])( C! @2 Q/ T! M
{! U4 o( I4 R/ \, h3 q* R7 B, }7 b
if(InitializeWinIo()==false)cout << "驱动程序加载失败! " << endl;
7 a9 z' f/ W4 ~: j& N! R
/ N9 U, Z% h8 o5 m6 V/ i ; Y9 E( z: D; L) [ \. y$ i
//1、mov dx,PMU_SC //
' @. K8 i4 L2 j3 h D //2、mov al,RD_EC_SMI //3 k% m% }! v/ C8 u1 ~5 ?
//3、call pmuWait4IBE //Must have 输入缓冲为空吗,为空可以放命令了
2 z7 @. R9 Q0 u8 z& \9 R //4、out dx,al //将读寄存器命令放到命令端口中。! m/ M- |" `3 p3 j' E
. }) c V$ Q! U6 l9 [' m
PMU_Wait4IBE(&dwTemp);
Z. Q, N: L) q+ \! y
% B3 G/ F# u0 M' _1 T; U- B; M SetPortVal(PMU_SC, RD_EC_SMI, 1);8 B/ B) j& W/ [* j0 G- F- i
3 c. K7 y0 q4 ^* K( s' H1 U
PMU_Wait4IBE(&dwTemp);; _* h, W% T' N7 A( \
2 t8 ]! t/ g5 w7 f SetPortVal(PMU_DATA, POLLING_DATA, 1);
1 p( X3 f% b/ j) q2 ~
2 E9 _- ?# ^) C( l PMU_Wait4IBE(&dwTemp);
: K9 { x! H2 \4 N- m, p( ~2 t& x% h+ u8 B% b+ A8 K
cout << dwTemp << endl; : ?# o3 k" f2 ` v9 [
* h2 L0 i& s; d$ _
ShutdownWinIo();/ L6 z& [6 f7 k9 }# [* y
0 D# l, W9 W( c4 y# b& I
system("pause");& c1 D1 O8 P. I8 E* V3 x% m
8 a; ^9 k) ?0 Z8 p/ O* o! r5 }" L
return 0;) B0 L5 u3 n2 |& |
}
2 V; c! O& u9 I
2 o" ]$ D! n6 H, K pvoid PMU_Wait4IBE(DWORD *_value)
! t8 q$ H, b7 _4 j- B1 S+ M8 \{
% U$ `/ X) l& o' o y* i8 K. { //######################################################### % |2 n& E" ^- p" R, @9 r
/*% p# s0 U4 O5 [6 A: c' ~! i
pmuWait4IBE proc " Q3 f+ X' }8 R, @3 |& l4 O {% I9 t+ d
PUSH AX & `) O# P! |5 i9 X, @
PW4IBE: 2 A+ i M M, |6 c/ x7 Y' p& j- [0 ~
IN AL, 06CH //Read PMU status $ Z+ z+ T; N0 m6 b: T1 q; H
TEST AL, 2 //Is Input Buffer Empty? 4 r9 m" Q- U3 W3 u3 B9 t6 }9 k
JNZ PW4IBE //Jmp if no
/ V7 j1 l a5 g4 C9 q1 d% F POP AX
& B4 ~& i7 r ~, ` ret ! B. _& x$ V! Y5 T5 I& m" e! b
pmuWait4IBE endp //END OF PMUWAIT4IBE6 p% L0 L ?1 O
*///循环读取0x6c端口的数据,看是否为空,不为空则一直等待其为空" ~% ]5 S7 ], {6 S! G" `( R
//#########################################################
& V6 V9 M. R- t' ~5 g /*do 4 _* x9 l. C2 v0 f: K
{. R; Z% q: t! O/ ~2 Z% y
GetPortVal(PMU_SC, _value, 4);
" i' o- v! {* L" \9 d2 A1 R1 P! @ }2 B( l8 z& g8 ?' R, ?
while ( *(_value) & 0x00000001 );*/5 U3 L+ d8 ^" M8 J
DWORD dwRegVal=0;' Z0 C1 F& ?8 k
do3 N! t, V: D* H8 v+ Y
{
* a5 ]( X+ J9 d% C) H, z, t7 ?/ j- q; o. @ GetPortVal(PMU_SC,&dwRegVal,1);
6 m/ c8 c; A6 v. u }
% Z) T2 ?% k: P4 z7 V' Y. E! L while(dwRegVal!=0x2);
' e. L( I' o7 n; E$ a" B# x( ~# h7 @8 B$ g* t
}
+ D0 c4 Z6 b5 \2 n4 ]7 O' [6 Q
; F+ _( C5 G- J! E: [+ S以上是我在google了csdn还有有一些其他网站后写成这样了。但是使用getportval得到pmu_sc的值永远都不能等于2。 Z, h+ Q1 t- n ]$ E; N {. b
所以变成了死循环了。
4 ?6 e& k* y! o* {; \. T% J( R- k4 s9 t$ U @
我对硬件编程不懂。又不知道从何下手。
: _6 W. Y+ J" `+ I我自己按照amd和intel的cpuid pdf文档写了读取cpu基本信息的小东东。希望可以把cpu的温度也给搞出来,当然更好的是能把bios也解决了。
1 [1 J k3 s" l1 L* Q但是这个温度已经搞了2天了,无果。很是郁闷。实在没办法了。9 J4 R' x, t4 {6 W
7 c ^7 M! G9 ?4 k$ Q r9 C我就想知道如果我想写个类似于everest这样的监控软件我需要搞清楚些什么? 或者简单点,我怎么才能把cpu的实时温度,硬盘温度,笔记本电池的信息给搞出来。3 ^3 I- A/ I0 @# |! w9 Z
并且我需要最后软件可以运行在x86和x64的系统上,因为我的笔记本是win 7 64bit的。0 v7 A/ R! t3 d% z
& V( ~' S8 \1 v2 u: N3 |/ H感觉现在无从下手。我在网上google不到pmu的信息。比如说我想搞清楚0x6c到底是pmu的什么东西。我想这该有张表什么的吧?硬是没得。郎个办嘛?有哪位大侠给我指条明路吧!: |