⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rw.c

📁 WinBond W83627 看门狗驱动
💻 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 + -