http://blog.csdn.net/aasmfox/article/details/6610625
PMU_SC equ 6Ch ;命令端口
PMU_DATA equ 68h ;数据端口
RD_EC_SMI equ 80h ;读寄存器命令
POLLING_DATA equ 0E7h ;CPU温度寄存器号
看上面的定义,PMU寄存器读取的步骤是这样的:
1.等待输入缓冲器空,即PMU将上一条命令处理完毕;
1.将命令(RD_EC_SMI)写入命令端口(PMU_SC);
2.等待输入缓冲器空,即PMU将命令(RD_EC_SMI)处理完毕;
3.将要访问的寄存器号(POLLING_DATA)写入数据端口(PMU_DATA);
4.等待输出缓冲器满,即PMU将从寄存器(POLLING_DATA)读出的数据放到输出缓冲器;
5.将数据从数据端口(PMU_DATA)读出。
(说明,这里的输入输出缓冲是指的PMU的缓冲。)
这样,就完成了一次读操作,写操作和其类似。
具体代码如下:
;AL-----CPU Temperature
GetCPUTempe proc
pusha
pushf
cli
mov dx,PMU_SC
mov al,RD_EC_SMI
call pmuWait4IBE ;Must have
out dx,al
mov dx,PMU_DATA
mov al,POLLING_DATA
call pmuWait4IBE ;Must have
out dx,al
mov dx,PMU_DATA
call pmuWait4OBF ;Must have
in al,dx ;Get Temperature
sti
popf
popa
GetCPUTempe endp
;#########################################################
pmuWait4IBE proc
PUSH AX
PW4IBE:
IN AL, 06CH ; Read PMU status
TEST AL, 2 ; Is Input Buffer Empty?
JNZ PW4IBE ; Jmp if no
POP AX
ret
pmuWait4IBE endp;END OF PMUWAIT4IBE
;#########################################################
pmuWait4OBF proc
PUSH AX
PW4OBF:
IN AL, 06CH ; Read PMU status
TEST AL, 1 ; Is Output Buffer Full?
JZ PW4OBF ; Jmp if no
POP AX
ret
pmuWait4OBF endp;END OF PMUWAIT4OBF
;#########################################################
上面pmuWait4IBE、pmuWait4OBF两个函数就是等待缓冲器的函数,其中都直接读取了命令端口6Ch(PMU_SC)的内容,关于读出的内容的说明可以参见我发的PMU的说明的第18页下面的那张表。
下面讲一下怎样把上面的代码用vc实现(讲的不好不要用臭鸡蛋扔我啊!):
众所周知,windows下无法直接读写硬件端口,要想实现上面的程序,我们只有借助强大的winio。
在VC中新建个工程,将winio压缩包中的winio.h包括进去,按alt+F7,在lib里面把winio.lib加进去(班门弄斧了^_^)。其实winio的压缩包中有详细的说明:
程序一开始先调用InitializeWinio(),结束时再调用ShutdownWinio()。呵呵!这就不用我多说了。
我们这个程序主要用到的winio的函数是
GetPortVal(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);//读端口
SetPortVal(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);//写端口
看了函数定义,各位高手肯定知道怎么用了吧!^_^
by zkxz