📄 rw.c
字号:
/*++
Copyright (c) 2006 EVOC, All Rights Reserved
Module Name:
Rw.c
Abstract: WDT Interrupt handler
Environment:
Kernel mode
Author: mz.yang may, 2006
Revision History:
--*/
#include "Driver.h"
BOOLEAN
OnInterrupt(PKINTERRUPT InterruptObject,PDEVICE_EXTENSION pde)
/*++
Routine Description:
This routine is dispose the interruput caused by watch dog
timer time-out.we should set the evnet signal to notice user
application.
Arguments:
InterruptObject - Pointer to the intertuput object.
deviceInfo - our local device data.
Return Value:
TRUE :called succeed.
FALSE :called failed.
--*/
{
UCHAR flag;
if((pde->HardwareID == 0x52) || (pde->HardwareID == 0x82) ||
(pde->HardwareID == 0x88) || (pde->HardwareID == 0xA0)) // W83627HF/THF/DHF
{
// see if interruput is ours.
// Start programming watch dog.
WRITE_PORT_UCHAR( (PVOID)pde->PortIndex, 0x87 );
WRITE_PORT_UCHAR( (PVOID)pde->PortIndex, 0x87 );
//Active watch dog device.
WRITE_PORT_UCHAR( (PVOID)pde->PortIndex, 0x07 );
WRITE_PORT_UCHAR( (PVOID)pde->PortData, 0x08 ); // logical device 8.
WRITE_PORT_UCHAR( (PVOID)pde->PortIndex, 0x30 );
WRITE_PORT_UCHAR( (PVOID)pde->PortData, 0x01 );
WRITE_PORT_UCHAR( (PVOID)pde->PortIndex, 0xf7 ); // read register f7.
flag = READ_PORT_UCHAR((PVOID)pde->PortData );
// bit 4 = 1 is watch dog time-out,watch dog cause system interruput.
if ((flag & 0x10)==0x00)
return FALSE; // not watch dog interrupt.
// clear interrupt.
WRITE_PORT_UCHAR( (PVOID)pde->PortIndex, 0xf6 );
WRITE_PORT_UCHAR( (PVOID)pde->PortData, 0x00 );
WRITE_PORT_UCHAR( (PVOID)pde->PortIndex, 0xf7 );
WRITE_PORT_UCHAR( (PVOID)pde->PortData, 0x00 );
WRITE_PORT_UCHAR( (PVOID)pde->PortIndex, 0xaa );
// set event signaled.
if(pde->EventCreated)
{
KeSetEvent(pde->pEvent,0,FALSE);
KeClearEvent(pde->pEvent);
}
}
if(pde->HardwareID == 0x97) // W83977F/AF
{
// see if interruput is ours.
// Start programming watch dog.
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0x87 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0x87 );
//Active watch dog device.
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0x07 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortData, 0x08 ); // logical device 8.
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0x30 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortData, 0x01 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0xf4 ); // read register f4.
flag = (UCHAR)READ_PORT_USHORT((PVOID)pde->ShortPortData );
// bit 0 = 1 is watch dog time-out,watch dog cause system interruput.
if ((flag & 0x01)==0x00)
return FALSE; // not watch dog interrupt.
// clear interrupt.
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0xf2 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortData, 0x00 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0x72 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortData, 0x00 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0xf4 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortData, 0x00 );
WRITE_PORT_USHORT( (PVOID)pde->ShortPortIndex, 0xaa );
// set event signaled.
if(pde->EventCreated)
{
KeSetEvent(pde->pEvent,0,FALSE);
KeClearEvent(pde->pEvent);
}
}
return TRUE;
}
VOID
DpcForIsr(IN PKDPC Dpc,IN PDEVICE_OBJECT fdo,IN PIRP Irp,IN PVOID Context)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -