rw.c

来自「WinBond W83627 看门狗驱动」· C语言 代码 · 共 139 行

C
139
字号
/*++

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 + =
减小字号Ctrl + -
显示快捷键?