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

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

?? eintkey.c

?? 周立功MAGICARM2410開發板配套wince實例源代碼
?? 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一区二区三区免费野_久草精品视频
欧美日韩精品是欧美日韩精品| 欧美精品久久一区| 日日夜夜精品免费视频| 国产亚洲综合色| 欧美精品久久99| 99精品视频中文字幕| 国内偷窥港台综合视频在线播放| 怡红院av一区二区三区| 国产日韩综合av| 欧美变态凌虐bdsm| 欧美日韩国产精选| 91免费看片在线观看| 风间由美一区二区三区在线观看 | www.欧美.com| 久久国产三级精品| 日韩av一区二区三区| 亚洲综合免费观看高清完整版在线| 中文幕一区二区三区久久蜜桃| 日韩一区二区三区在线视频| 欧美三片在线视频观看| 91福利精品第一导航| 99热国产精品| av电影一区二区| 风间由美一区二区三区在线观看 | 久久久久久久久久看片| 91精品国产一区二区三区蜜臀| 色噜噜夜夜夜综合网| 不卡一卡二卡三乱码免费网站| 国产黄色成人av| 国产专区欧美精品| 久久精品噜噜噜成人av农村| 免费高清在线一区| 久久福利视频一区二区| 麻豆国产一区二区| 久久99热99| 国产一区二区三区蝌蚪| 激情小说欧美图片| 国产电影一区二区三区| 国产精品99久久久久久似苏梦涵 | 日韩成人午夜精品| 日韩电影免费一区| 久久9热精品视频| 久久精品国产一区二区| 国产最新精品免费| 粉嫩av一区二区三区在线播放 | 91精品国产一区二区三区香蕉| 欧美日韩大陆一区二区| 3d动漫精品啪啪1区2区免费| 欧美一级高清片| 欧美精品一区二区三区高清aⅴ| 欧美成人福利视频| 欧美国产一区视频在线观看| 国产精品视频yy9299一区| 亚洲欧美日韩在线| 亚洲福中文字幕伊人影院| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲一区视频在线观看视频| 亚洲成人一二三| 美女被吸乳得到大胸91| 国产精品一区二区三区四区| 99精品热视频| 7777精品伊人久久久大香线蕉| 精品久久五月天| 国产精品美女视频| 亚洲丰满少妇videoshd| 国产综合一区二区| 91在线视频观看| 国产亚洲欧洲一区高清在线观看| 国产日韩欧美a| 亚洲综合激情小说| 国内精品第一页| 色婷婷综合久久久| 欧美一区二区三区免费大片| 欧美国产1区2区| 亚洲高清视频中文字幕| 国产美女精品一区二区三区| 色综合色狠狠综合色| 日韩欧美一区在线观看| 中文字幕一区二区三区不卡在线| 五月婷婷久久丁香| 国产二区国产一区在线观看| 欧美吻胸吃奶大尺度电影| 精品国产免费一区二区三区四区 | 亚洲手机成人高清视频| 石原莉奈一区二区三区在线观看| 国产精品69久久久久水密桃| 色女孩综合影院| 久久精品一区八戒影视| 亚洲第一搞黄网站| 不卡免费追剧大全电视剧网站| 在线播放国产精品二区一二区四区| 国产三级一区二区| 天天色天天爱天天射综合| www.亚洲色图.com| 精品免费视频.| 亚洲成人免费电影| av在线播放一区二区三区| 欧美一级xxx| 一区二区三区高清不卡| 国产91对白在线观看九色| 欧美精品在欧美一区二区少妇| 国产精品久久夜| 精品一区二区三区免费毛片爱| 在线看国产日韩| 亚洲欧洲av色图| 国产成人在线视频网站| 精品国产乱码久久久久久牛牛| 亚洲自拍都市欧美小说| 99久久99久久免费精品蜜臀| 久久这里只精品最新地址| 丝袜美腿成人在线| 欧洲激情一区二区| 亚洲免费观看高清完整版在线| 国产 日韩 欧美大片| 久久蜜桃香蕉精品一区二区三区| 天天影视涩香欲综合网| 欧美在线|欧美| 亚洲黄一区二区三区| 成人免费毛片嘿嘿连载视频| 久久免费的精品国产v∧| 久久99精品久久只有精品| 欧美一区二区黄色| 日日夜夜免费精品视频| 欧美日韩国产大片| 亚洲成人免费av| 欧美色图免费看| 亚洲成人精品影院| 欧美日韩国产免费| 日日夜夜精品免费视频| 这里只有精品99re| 日韩电影在线免费看| 精品裸体舞一区二区三区| 蜜桃av噜噜一区| 91精品国产免费| 久久精品99久久久| 久久婷婷国产综合国色天香 | 色先锋久久av资源部| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 国产成人aaa| 中文字幕av不卡| 91一区二区三区在线播放| 亚洲三级视频在线观看| 91福利社在线观看| 日韩高清不卡一区二区三区| 欧美一区二区三区在线观看| 久久精品99国产国产精| 久久久久久电影| 成人午夜激情在线| 亚洲人成伊人成综合网小说| 日本电影欧美片| 日韩高清不卡一区二区| 欧美精品一区二| 成人黄色一级视频| 亚洲一区二区三区小说| 欧美一区二区三区在线观看| 国产美女视频一区| 亚洲免费视频中文字幕| 欧美肥妇bbw| 国产精品456露脸| 亚洲精品欧美综合四区| 9191精品国产综合久久久久久 | 国产91综合网| 亚洲精品视频观看| 日韩一区二区免费在线观看| 国精产品一区一区三区mba桃花 | 国产精品家庭影院| 一本色道久久综合狠狠躁的推荐| 亚洲成av人片一区二区三区| 精品日韩成人av| 成人激情免费视频| 日韩精品1区2区3区| 欧美激情中文字幕| 欧美天堂一区二区三区| 国产一区二区三区免费播放| 亚洲精品日韩综合观看成人91| 日韩欧美精品在线视频| 成人小视频免费观看| 日日夜夜精品视频天天综合网| 国产人久久人人人人爽| 欧美日韩国产a| www.欧美精品一二区| 青草国产精品久久久久久| 中文字幕一区二区三中文字幕| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲第一会所有码转帖| 久久久噜噜噜久噜久久综合| 色婷婷综合久久久久中文 | 日本美女一区二区| 国产精品久久777777| 91精品国产91久久综合桃花| www.成人网.com| 琪琪久久久久日韩精品| 日韩理论电影院| 久久精品一区二区| 欧美一区二区久久| 欧美日精品一区视频| av在线不卡电影| 国产精品资源站在线| 日本成人中文字幕| 亚洲精品成人悠悠色影视|