亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eintkey.c

?? 這個程序是基于Windows CE下的按鍵驅動程序源代碼
?? C
字號:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.zyinside.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: 				EINTKey.c
** Last modified Date: 		2006-08-11
** Last Version:			V1.0		
** Description: 			This driver uses EINT4 button(KEY1) On MagicARM2410
**                          
**------------------------------------------------------------------------------------------------------
** Created By: 				MingYuan Zheng 鄭明遠
** Created date: 			2006-08-11
** Version: 				V1.0
** Descriptions:			The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/

#include <windows.h>
#include <types.h>
#include <excpt.h>
#include <tchar.h>
#include <cardserv.h>
#include <cardapi.h>
#include <tuple.h>
#include <devload.h>
#include <diskio.h>
#include <nkintr.h>
#include <windev.h>

#include <s3c2410x.h>
#include "EINTKey.h"

#define PRIVATE			static
#define PUBLIC

/* 讀按鍵事件*/
PRIVATE HANDLE gReadKeyEvent[2];       

/* 按鍵按下中斷事件 */
PRIVATE HANDLE gWaitEvent;

/* 是否退出中斷服務線程 */
PRIVATE UINT32 g_bKillIST = FALSE;

/* 中斷處理線程 */
PRIVATE HANDLE gEINTIntrThread;

/* 驅動打開計數器 */
PRIVATE UINT32 gOpenCount = 0;

/* EINT4 的物理中斷號及邏輯中斷號 */
PRIVATE UINT32 g_EINTIrq = IRQ_EINT4;
PRIVATE UINT32 g_EINTSysIntr = SYSINTR_UNDEFINED;

/* GPIO 寄存器對應的虛擬地址 */
PRIVATE volatile S3C2410X_IOPORT_REG * v_pIOPregs;

/*******************************************************************************************
函數名稱: EINT_ConfigInterruptPin
描    述: 配置外部中斷引腳并使能為 下降 沿觸發
輸入參數: 無	
輸出參數: 無
返    回: 無
********************************************************************************************/
PRIVATE VOID EINT_ConfigInterruptPin(VOID)
{
	v_pIOPregs->GPFCON  &= ~(0x3 << 8);			/* Set EINT4(GPF4) as EINT4	*/
	v_pIOPregs->GPFCON  |=  (0x2 << 8);

    v_pIOPregs->EXTINT0 &= ~(0x7 << 16);		/* Configure EINT4 as falling edge tiggered Mode */
    v_pIOPregs->EXTINT0 |=  (0x2 << 16);
}

/*******************************************************************************************
函數名稱: EINT_ConfigPinDefault
描    述: 配置外部中斷引腳恢復為輸入引腳
輸入參數: 無	
輸出參數: 無
返    回: 無
********************************************************************************************/
PRIVATE VOID EINT_ConfigPinDefault(VOID)
{
	v_pIOPregs->GPFCON  &= ~(0x3 << 8);			/* Set EINT4(GPF4) as GPIO(IN)  */
}


/*******************************************************************************************
函數名稱: Key_IsPushed
描    述: 查詢按鍵是否已按下
輸入參數: 無	
輸出參數: 無
返    回: FALSE: 按鍵未按下    TRUE: 按鍵已按下
*******************************************************************************************/
PRIVATE BOOL Key_IsPushed(VOID)
{
	return ((v_pIOPregs->GPFDAT & (1 << 4)) ? FALSE : TRUE);
}


/*******************************************************************************************
函數名稱: EINT_InitializeAddresses
描    述: 取得相關寄存器的虛擬地址
輸入參數: 無	
輸出參數: 無
返    回: > 0 分配得到的虛擬地址;  FALSE: 分配失敗  
*******************************************************************************************/
PRIVATE BOOL EINT_InitializeAddresses(VOID)
{
	BOOL	RetValue = TRUE;

	RETAILMSG(1, (TEXT(">>> EINT_initalization address..set..\r\n")));
		
	/* IO Register Allocation */
	v_pIOPregs = (volatile S3C2410X_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2410X_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
	if (v_pIOPregs == NULL) 
	{
		ERRORMSG(1,(TEXT("For IOPregs : VirtualAlloc failed!\r\n")));
		RetValue = FALSE;
	}
	else 
	{
		if (!VirtualCopy((PVOID)v_pIOPregs, (PVOID)(S3C2410X_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2410X_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) 
		{
			ERRORMSG(1,(TEXT("For IOPregs: VirtualCopy failed!\r\n")));
			RetValue = FALSE;
		}
	}
	
	if (!RetValue) 
	{
		RETAILMSG (1, (TEXT("::: EINT_InitializeAddresses - Fail!!\r\n") ));
		if (v_pIOPregs) 
		{
			VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);
		}

		v_pIOPregs = NULL;
	}
	else 
		RETAILMSG (1, (TEXT("::: EINT_InitializeAddresses - Success\r\n") ));

	return(RetValue);
}


/*******************************************************************************************
函數名稱: EINTKey_IntrThread
描    述: 外部中斷按鍵服務線程
輸入參數: PVOID pArg:  	線程輸入參數
輸出參數: 無
返    回: 1 或 0
*******************************************************************************************/
DWORD EINTKey_IntrThread(PVOID pArg)
{
	DWORD ret;

	// 創建外部中斷中斷事件 
	gWaitEvent = CreateEvent(NULL, FALSE, FALSE, NULL);		

	// 初始化外部按鍵中斷: 注冊中斷事件, 允許外部中斷
	if (!(InterruptInitialize(g_EINTSysIntr, gWaitEvent, 0, 0))) 
	{
		RETAILMSG(1, (TEXT("ERROR: EINTKey: InterruptInitialize failed.\r\n")));
		CloseHandle(gWaitEvent);
		return 0;
	}

	// 外部按鍵中斷線程開始運行
	while (1) 
	{
		ret = WaitForSingleObject(gWaitEvent, INFINITE);
		if ((ret == WAIT_OBJECT_0) && (g_bKillIST == FALSE))
		{
			if (Key_IsPushed())			
			{
				Sleep(20);						/* 延時 20ms 用于濾去噪聲	*/

				if (Key_IsPushed())		        /* 外部中斷按鍵確實已按下 */
				{  
					SetEvent(gReadKeyEvent[0]);	/* 通知讀函數, 外部中斷按鍵按鍵按下 */		
					RETAILMSG(1, (TEXT("::: The Key1 Pushed. \r\n")));
				} 
			}
		}
		else
		{	
			CloseHandle(gWaitEvent);
			RETAILMSG(1, (TEXT("::: EINTKey_IntrThread Exit. \r\n")));
			return 0;	
		} //if (ret != WAIT_OBJECT_0) or Error occurs

		InterruptDone(g_EINTSysIntr);           /* 通知內核: 中斷處理結束 */
	}      
  	
  	return 1;
}


/*******************************************************************************************
函數名稱: KEY_Init
描    述: 驅動程序初始化函數
輸入參數: DWORD dwContext: 設備管理器傳遞給本驅動的參數, 通常為流接口驅動在注冊表內的位置 	
輸出參數: 無
返    回: 驅動程序句柄
*******************************************************************************************/
PUBLIC DWORD KEY_Init(DWORD dwContext)
{
	DWORD IDThread;

	// 取得 GPIO 相關寄存器的虛擬地址空間
	if (EINT_InitializeAddresses() == FALSE)
	   return 0;		

	// 使能 EINT4 引腳為中斷引腳, 并為下降沿觸發
	EINT_ConfigInterruptPin();

    // 從 OAL 請求一個 SYSINTR 值
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_EINTIrq, sizeof(UINT32), &g_EINTSysIntr, sizeof(UINT32), NULL))
    {
        RETAILMSG(1, (TEXT("ERROR: EINTKey: Failed to request sysintr value for EINT interrupt.\r\n")));
        return(0);
    }
    RETAILMSG(1,(TEXT("INFO: EINTKey: Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_EINTIrq, g_EINTSysIntr));

    // 創建一個外部中斷處理線程 IST
	gEINTIntrThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) EINTKey_IntrThread, 0, 0, &IDThread);
	if (gEINTIntrThread == NULL) 
	{
		RETAILMSG(1, (TEXT("::: KEY_Init: CreateThread() Fail.\r\n")));
		KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &g_EINTSysIntr, sizeof(UINT32), NULL, 0, NULL);
		return 0;
	}

	gReadKeyEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL);
	gReadKeyEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
  
    RETAILMSG(1, (TEXT("::: KEY_Init Sucessfully! \r\n")));
    
    // 返回不為0的數
	return (DWORD)gEINTIntrThread;
}


/*******************************************************************************************
函數名稱: DllEntry
描    述: 驅動程序動態庫入口
輸入參數: 	
輸出參數:
返    回: 
*******************************************************************************************/
PUBLIC BOOL WINAPI
DllEntry(HANDLE hInstDll, DWORD dwReason, LPVOID lpvReserved)
{
    switch ( dwReason ) 
	{
        case DLL_PROCESS_ATTACH:
            RETAILMSG(1, (TEXT("Key: DLL_PROCESS_ATTACH. \r\n")));
    		DisableThreadLibraryCalls((HMODULE) hInstDll);
            break;

        case DLL_PROCESS_DETACH:
            RETAILMSG(1, (TEXT("Key: DLL_PROCESS_DETACH. \r\n")));
            break;    
    }

    return (TRUE);
}


/*******************************************************************************************
函數名稱: KEY_Close
描    述: 驅動程序關閉函數
輸入參數: DWORD Handle:驅動程序句柄
輸出參數: 無
返    回: FALSE: 失敗    TRUE: 成功 
*******************************************************************************************/
BOOL KEY_Close(DWORD Handle)
{
	if (gOpenCount > 0)
		SetEvent(gReadKeyEvent[1]);						/* 通知調用讀函數的線程, 驅動已經關閉 */

	gOpenCount = 0;

	return TRUE;
}   // KEY_Close



/*******************************************************************************************
函數名稱: KEY_Deinit
描    述: 驅動程序卸載函數
輸入參數: DWORD dwContext: 驅動程序句柄
輸出參數: 無
返    回: FALSE: 失敗    TRUE: 成功
*******************************************************************************************/
BOOL KEY_Deinit(DWORD dwContext)
{
	SetEvent(gWaitEvent);								/* 通知中斷服務線程退出 */
    g_bKillIST = TRUE;						            
	Sleep(200);											/* 等待中斷服務線程退出 */
   
	SetEvent(gReadKeyEvent[1]);							/* 通知調用讀函數的線程, 驅動已經關閉 */

	// 釋放中斷資源
	InterruptDone(g_EINTSysIntr);
	InterruptDisable(g_EINTSysIntr);
	KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &g_EINTSysIntr, sizeof(UINT32), NULL, 0, NULL);
	
	// 恢復外部中斷引腳為輸入 GPIO
	EINT_ConfigPinDefault();     
	      
	// 釋放申請的虛擬空間      
	if (v_pIOPregs)
		VirtualFree((PVOID) v_pIOPregs, 0, MEM_RELEASE);   
    gOpenCount = 0;

  	CloseHandle(gReadKeyEvent[0]);						/* 關閉相關事件 */
	CloseHandle(gReadKeyEvent[1]);

	return TRUE;
}   // KEY_Deinit


/*******************************************************************************************
函數名稱: KEY_Open
描    述: 打開驅動程序
輸入參數: DWORD dwData     : 驅動程序引用事例句柄
          DWORD dwAccess   : 訪問請求代碼,是讀和寫的組合
          DWORD dwShareMode: 共享模式  
輸出參數:
返    回: 驅動程序引用事例句柄
*******************************************************************************************/
DWORD KEY_Open(DWORD dwData, DWORD dwAccess, DWORD dwShareMode)
{
    if (gOpenCount > 0)
        return 0;                // 本驅動只允許單一訪問

    gOpenCount = 1;  
    return gOpenCount;
}   // KEY_Open


/*******************************************************************************************
函數名稱: KEY_IOControl
描    述: 驅動程序 I/O 請求
輸入參數: 
輸出參數:
返    回: 本驅動不支持該請求,返回 FALSE
*******************************************************************************************/
BOOL
KEY_IOControl(
    DWORD Handle,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
    return FALSE;
}   // KEY_IOControl



/*******************************************************************************************
函數名稱: KEY_Read
描    述: 讀取按鍵狀態
輸入參數: DWORD Handle    : 驅動程序引用事例句柄
          LPVOID pBuffer  : 接收緩沖區
          DWORD dwNumBytes: 要讀的字節數
輸出參數: 無
返    回: 實際讀到字節數
*******************************************************************************************/
DWORD KEY_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes)
{
	DWORD ret;
	uchar *pReadBuffer;

	if ((pBuffer == NULL) || (dwNumBytes <= 0))
		return 0;

	pReadBuffer = MapPtrToProcess(pBuffer, GetCallerProcess());
	*pReadBuffer = 0;

	/* 掛起當前線程,直到 KEY1 按鍵按下或驅動關閉 */
	ret = WaitForMultipleObjects(2, gReadKeyEvent, FALSE, INFINITE);	
	if (ret == WAIT_OBJECT_0)
	{
		ResetEvent(gReadKeyEvent[0]);
		*pReadBuffer = 1;										/* 按鍵按下 */
		return 1;
	}
	else if(ret == (WAIT_OBJECT_0 + 1))
	{
		ResetEvent(gReadKeyEvent[1]);
		*pReadBuffer = 0;										/* 驅動關閉 */
		return 1;		
	}
	
	return 0;
}   // KEY_Read


/*******************************************************************************************
函數名稱: KEY_Write
描    述: 寫函數,本驅動不支持
輸入參數: 
輸出參數:
返    回:
*******************************************************************************************/
DWORD KEY_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes)
{
	return 0;
}   // KEY_Write


/*******************************************************************************************
函數名稱: KEY_Seek
描    述: 對設備的數據指針進行操作,本驅動不支持該函數
輸入參數: 
輸出參數:
返    回:
*******************************************************************************************/
DWORD KEY_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod)
{
	return 0;
}  // KEY_Seek


/*******************************************************************************************
函數名稱: KEY_PowerUp
描    述: 電源上電驅動處理函數
輸入參數: 
輸出參數:
返    回: 無
*******************************************************************************************/
void KEY_PowerUp(void)
{
	return;
}  // KEY_PowerUp


/*******************************************************************************************
函數名稱: KEY_PowerDown
描    述: 電源下電驅動處理函數
輸入參數: 
輸出參數:
返    回: 無
*******************************************************************************************/
void
KEY_PowerDown(void)
{
	return;
}  // KEY_PowerDown

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本中文字幕一区二区视频| 综合在线观看色| 欧美性生活影院| 97超碰欧美中文字幕| 韩国女主播一区二区三区| 天堂久久久久va久久久久| 亚洲午夜久久久久久久久电影网| 亚洲精品免费视频| 亚洲最新视频在线播放| 亚洲一二三区在线观看| 亚洲综合小说图片| 亚洲一级不卡视频| 五月综合激情日本mⅴ| 午夜精品一区二区三区免费视频 | 一道本成人在线| 91同城在线观看| 欧美影院精品一区| 欧美一区二区不卡视频| 日韩美女主播在线视频一区二区三区 | 亚洲v日本v欧美v久久精品| 亚洲精品乱码久久久久久黑人| 亚洲一区二区影院| 肉色丝袜一区二区| 国产精品综合久久| 91香蕉视频污| 日韩一区二区三区三四区视频在线观看 | 91精品婷婷国产综合久久性色| 国产精品对白交换视频| 亚洲精品国产精华液| 日韩精品国产欧美| 国产九色精品成人porny| 91视频国产观看| 91精品国产色综合久久不卡蜜臀 | 日韩一区二区在线免费观看| 亚洲精品在线三区| 一区二区在线免费| 激情综合色丁香一区二区| 成人av动漫在线| 日韩一区二区在线观看视频 | 在线看国产一区二区| 欧美一区二区三级| 中文字幕一区二区三区四区 | 国产一区91精品张津瑜| 国产**成人网毛片九色| 欧美视频在线观看一区二区| 久久综合国产精品| 一区二区三区精品在线| 激情综合色综合久久| 色婷婷国产精品久久包臀| 欧美xxx久久| 亚洲美女免费在线| 毛片一区二区三区| 色噜噜久久综合| 久久精品亚洲国产奇米99| 天天亚洲美女在线视频| eeuss鲁片一区二区三区 | 成人免费毛片嘿嘿连载视频| 欧美精品xxxxbbbb| 亚洲人成电影网站色mp4| 国产夫妻精品视频| 欧美一区二区三区小说| 亚洲黄一区二区三区| 成人高清在线视频| 日韩精品一区二区三区中文不卡| 亚洲国产中文字幕| 91久久精品网| 中文字幕中文字幕中文字幕亚洲无线| 久久精品国产在热久久| 欧美群妇大交群中文字幕| 夜夜夜精品看看| 91在线你懂得| 国产精品理论片| 国产成人av一区二区三区在线观看| 欧美一级片在线看| 日韩av二区在线播放| 欧美日韩精品福利| 亚洲精品在线三区| 国模大尺度一区二区三区| 日韩一区二区电影在线| 日本vs亚洲vs韩国一区三区二区| 欧美亚洲禁片免费| 午夜视频在线观看一区二区| 欧美三区免费完整视频在线观看| 亚洲精品久久久久久国产精华液| 色综合天天综合色综合av| 亚洲欧美日韩成人高清在线一区| 91亚洲精品一区二区乱码| 亚洲色图欧美偷拍| 欧美在线免费视屏| 水蜜桃久久夜色精品一区的特点| 欧美日韩国产精品自在自线| 天堂一区二区在线| 欧美tk—视频vk| 国产91在线|亚洲| 亚洲桃色在线一区| 欧美日韩中字一区| 免费成人性网站| 国产片一区二区三区| www.在线欧美| 午夜激情一区二区| 精品国产制服丝袜高跟| 粉嫩一区二区三区性色av| 1区2区3区欧美| 欧美日韩不卡在线| 黑人精品欧美一区二区蜜桃| 国产精品久久久久一区 | 日韩中文字幕av电影| 26uuu色噜噜精品一区| 成人av网站免费| 日韩黄色免费网站| 国产精品五月天| 欧美日韩精品专区| 国产成人精品免费视频网站| 亚洲视频在线观看一区| 欧美一三区三区四区免费在线看| 韩国精品一区二区| 亚洲精品视频在线| 精品福利一二区| 在线视频你懂得一区| 国产一区二区三区四区五区入口 | 日韩高清不卡在线| 国产精品人妖ts系列视频| 欧美日产国产精品| 波波电影院一区二区三区| 日av在线不卡| 亚洲精品一二三区| 久久精品视频一区| 欧美福利视频一区| 色综合久久久久综合99| 国产一区91精品张津瑜| 日韩中文字幕麻豆| 亚洲另类色综合网站| 久久久久久久久久美女| 欧美高清dvd| 日本丶国产丶欧美色综合| 国产99一区视频免费| 免费成人av在线播放| 亚洲成人自拍一区| 亚洲三级理论片| 国产精品天干天干在线综合| 日韩免费高清电影| 欧美高清视频一二三区| 日本久久一区二区三区| 成人av在线电影| 国产成人综合在线播放| 蜜桃av噜噜一区| 日韩av在线播放中文字幕| 午夜一区二区三区视频| 一区二区三区鲁丝不卡| 亚洲人成亚洲人成在线观看图片| 国产精品区一区二区三区| 国产清纯在线一区二区www| 久久免费美女视频| 精品欧美一区二区久久| 欧美大片在线观看一区| 精品少妇一区二区三区日产乱码| 欧美一区午夜精品| 日韩欧美成人午夜| 日韩免费看网站| 精品福利一二区| 亚洲国产成人自拍| 亚洲欧洲av一区二区三区久久| 亚洲欧洲日韩av| 亚洲免费观看高清完整版在线观看 | 久久99国产精品免费网站| 国产亚洲欧美一级| 欧美日韩中文字幕一区二区| 91高清视频在线| 色哟哟在线观看一区二区三区| 色综合天天天天做夜夜夜夜做| 成人av电影在线| 成人高清免费在线播放| 日韩二区三区在线观看| 视频一区在线播放| 亚洲mv大片欧洲mv大片精品| 亚洲一区二区三区自拍| 日韩福利电影在线| 久久精品国产秦先生| 蜜臀av性久久久久蜜臀aⅴ| 亚洲欧洲在线观看av| 亚洲国产一区在线观看| 性做久久久久久久久| 亚洲精品免费在线观看| 丰满少妇久久久久久久| 欧美日韩精品一区二区| 精品日韩在线一区| 国产无一区二区| 中文字幕一区在线观看视频| 亚洲午夜激情网页| 天堂成人免费av电影一区| 日韩av一区二| 国产成人精品影视| 欧美综合亚洲图片综合区| 欧美久久久久久久久| 日韩一二在线观看| 亚洲婷婷综合久久一本伊一区| 亚洲综合色在线| 久久国产精品99久久人人澡| 毛片一区二区三区| 在线视频中文字幕一区二区|