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

📄 interruptdrv.cpp

📁 2410下面的外部中断的测试程序 此代码包含驱动和应用程序
💻 CPP
字号:
// KeyDrv.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
#include <s3c2410x.h>

#pragma comment(lib,"ceddk.lib")
volatile S3C2410X_IOPORT_REG * g_pIOPregs;
volatile static DWORD g_intrcount = 0;
UINT32 g_ExtKeyIrq = IRQ_EINT6;	
UINT32 g_ExtKeySysIntr = SYSINTR_UNDEFINED;

HANDLE g_IntrEvent = NULL;
void KEY_EnableInterrupt();
UINT IntrThreadProc(LPVOID);

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

DWORD KEY_Init(DWORD dwContext)
{
  PHYSICAL_ADDRESS PA;
  RETAILMSG(1, (TEXT("***ExtKey: ExtKey_Init\r\n")));
  PA.QuadPart = S3C2410X_BASE_REG_PA_IOPORT;
  g_pIOPregs = (S3C2410X_IOPORT_REG *)MmMapIoSpace(PA,sizeof(S3C2410X_IOPORT_REG),FALSE);
  g_IntrEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  if(g_IntrEvent)
  {
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_ExtKeyIrq, sizeof(UINT32), &g_ExtKeySysIntr, sizeof(UINT32), NULL))
	{
      RETAILMSG(1, (TEXT("ERROR: ExtKey: Failed to request sysintr value for ExtKey interrupt.\r\n")));
      return(0);
	}
    RETAILMSG(1,(TEXT("INFO: ExtKey: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_ExtKeyIrq, g_ExtKeySysIntr));
    if(InterruptInitialize(g_ExtKeySysIntr, g_IntrEvent, NULL, 0) )
	{
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
    if( CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)IntrThreadProc, NULL, 0, NULL))
	{
    RETAILMSG(1, (TEXT("***ExtKEY: KEY_Init CreateThread OK\r\n")));
    return TRUE;
	}
	}
    CloseHandle(g_IntrEvent);
  }
  RETAILMSG(1, (TEXT("***ExtKEY: KEY_Init fail\r\n")));
  return FALSE;
}

BOOL KEY_Deinit(DWORD hDeviceContext)
{
	RETAILMSG(1, (TEXT("***KEY: KEY_Deinit\r\n")));
	MmUnmapIoSpace((PVOID)g_pIOPregs,sizeof(S3C2410X_IOPORT_REG));
	return TRUE;
}

DWORD KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
	RETAILMSG(1, (TEXT("***KEY: KEY_Open\r\n")));
	KEY_EnableInterrupt();
	return TRUE;
}

BOOL KEY_Close(DWORD hOpenContext)
{
	RETAILMSG(1, (TEXT("***KEY: KEY_Close\r\n")));
	return TRUE;
}

BOOL KEY_IOControl(DWORD hOpenContext,
				   DWORD dwCode,
				   PBYTE pBufIn,
				   DWORD dwLenIn,
				   PBYTE pBufOut,
				   DWORD dwLenOut,
				   PDWORD pdwActualOut)
{
	return TRUE;
}

void KEY_PowerDown(DWORD hDeviceContext)
{
}

void KEY_PowerUp(DWORD hDeviceContext)
{
}

DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
 	*((DWORD*)pBuffer) = g_intrcount;		
	return sizeof(unsigned short);
}

DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
	return 0;
}


DWORD KEY_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD NumberOfBytes)
{
	RETAILMSG(1, (TEXT("***KEY: KEY_Write\r\n")));
	g_intrcount = 0;
    return sizeof(DWORD);
}

VOID KEY_EnableInterrupt()
{
	g_pIOPregs->GPFCON  &= ~(0x3 << 12);
	g_pIOPregs->GPFCON  |=  (0x2 << 12);
    g_pIOPregs->EXTINT0 &= ~(0x7 << 24);
    g_pIOPregs->EXTINT0 |=  (0x4 << 24);
}

UINT IntrThreadProc(LPVOID ptr)
{
	RETAILMSG(1, (TEXT("***IntrThreadProc:  \r\n")));
	while(1)
	{
		WaitForSingleObject(g_IntrEvent, INFINITE);
		g_intrcount++;
		Sleep(500);
		InterruptDone(g_ExtKeySysIntr);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -