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

📄 keypad.c

📁 keypad source code for samsung SC2410
💻 C
📖 第 1 页 / 共 2 页
字号:
}

DWORD
KPD_IntrThread2(PVOID pArg)
{
	RETAILMSG(1, (TEXT("+ KPD_IntrThread2\r\n")));
	KPD_InitializeAddresses();
//	KPD_SetKscanLow();
	KPD_EnableInterrupt();

	g_hKeypadIntrEvent[2] = CreateEvent(NULL,
	  				     FALSE, //the system automatically resets the state to nonsignaled after a single waiting thread has been released
						 FALSE, //the initial state of the event object. If TRUE, the initial state is signaled; otherwise, it is nonsignaled. 
						 NULL);
	if (g_hKeypadIntrEvent[2] == NULL) {
		RETAILMSG(1, (TEXT("KPD_IntrThread2 : CreateEvent return failure\r\n")));
		return FALSE;
	}
						 
    // Request a SYSINTR value from the OAL.
    //
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, // [in] I/O control code
						 &g_KeypadIrq[2], // [out] Pointer to a buffer that contains the data required to perform the operation
						 sizeof(UINT32), // [in] Size, in bytes, of the buffer pointed to by lpInBuf.
						 &g_KeypadSysIntr[2], // [out] Pointer to a buffer that receives the output data for the operation
						 sizeof(UINT32), // [in] size of the buffer pointed to by g_KeypadSysIntr
						 NULL)) { // an operation produces no output data
        RETAILMSG(1, (TEXT("KPD_IntrThread2 : Failed to request sysintr value for power button interrupt.\r\n")));
        return 0;
    }
    RETAILMSG(1,(TEXT("KPD_IntrThread2 : Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_KeypadIrq[2], g_KeypadSysIntr[2]));


	if (!(InterruptInitialize(g_KeypadSysIntr[2], // Interrupt identifier to be associated with this interrupt service thread (IST)
							  g_hKeypadIntrEvent[2], // Event to be signaled when the interrupt is triggered
							  0, 
							  0))) {
		RETAILMSG(1, (TEXT("KPD_IntrThread2 : Interrupt initialize failed.\r\n")));
		return 0;
	}

	while (1) 
	{
		KPD_SetKscanLow();
		WaitForSingleObject(g_hKeypadIntrEvent[2], INFINITE);
//		KPD_IsPushed();
		switch (KPD_DebounceReadKscan()) {
		case KSCAN0:
			RETAILMSG(1, (TEXT("keypad K4 is pressed\r\n")));
			break;
		case KSCAN1:
			RETAILMSG(1, (TEXT("keypad K5 is pressed\r\n")));
			break;
		case KSCAN2:
			RETAILMSG(1, (TEXT("keypad K6 is pressed\r\n")));
			break;
		case KSCAN3:
			RETAILMSG(1, (TEXT("keypad K14 is pressed\r\n")));
			break;
		default:
			//RETAILMSG(1, (TEXT("unknown keypad is pressed\r\n")));
			break;
		}
		InterruptDone(g_KeypadSysIntr[2]);
    }        	
}

DWORD
KPD_IntrThread3(PVOID pArg)
{
	RETAILMSG(1, (TEXT("+ KPD_IntrThread3\r\n")));
	KPD_InitializeAddresses();
//	KPD_SetKscanLow();
	KPD_EnableInterrupt();

	g_hKeypadIntrEvent[3] = CreateEvent(NULL,
	  				     FALSE, //the system automatically resets the state to nonsignaled after a single waiting thread has been released
						 FALSE, //the initial state of the event object. If TRUE, the initial state is signaled; otherwise, it is nonsignaled. 
						 NULL);
	if (g_hKeypadIntrEvent[3] == NULL) {
		RETAILMSG(1, (TEXT("KPD_IntrThread3 : CreateEvent return failure\r\n")));
		return FALSE;
	}
						 
    // Request a SYSINTR value from the OAL.
    //
    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, // [in] I/O control code
						 &g_KeypadIrq[3], // [out] Pointer to a buffer that contains the data required to perform the operation
						 sizeof(UINT32), // [in] Size, in bytes, of the buffer pointed to by lpInBuf.
						 &g_KeypadSysIntr[3], // [out] Pointer to a buffer that receives the output data for the operation
						 sizeof(UINT32), // [in] size of the buffer pointed to by g_KeypadSysIntr
						 NULL)) { // an operation produces no output data
        RETAILMSG(1, (TEXT("KPD_IntrThread3 : Failed to request sysintr value for power button interrupt.\r\n")));
        return 0;
    }
    RETAILMSG(1,(TEXT("KPD_IntrThread3 : Mapped Irq 0x%x to SysIntr 0x%x.\r\n"), g_KeypadIrq[3], g_KeypadSysIntr[3]));


	if (!(InterruptInitialize(g_KeypadSysIntr[3], // Interrupt identifier to be associated with this interrupt service thread (IST)
							  g_hKeypadIntrEvent[3], // Event to be signaled when the interrupt is triggered
							  0, 
							  0))) {
		RETAILMSG(1, (TEXT("KPD_IntrThread3 : Interrupt initialize failed.\r\n")));
		return 0;
	}

	while (1) 
	{
		KPD_SetKscanLow();
		WaitForSingleObject(g_hKeypadIntrEvent[3], INFINITE);
//		KPD_IsPushed();
		switch (KPD_DebounceReadKscan()) {
		case KSCAN0:
			RETAILMSG(1, (TEXT("keypad K1 is pressed\r\n")));
			break;
		case KSCAN1:
			RETAILMSG(1, (TEXT("keypad K2 is pressed\r\n")));
			break;
		case KSCAN2:
			RETAILMSG(1, (TEXT("keypad K3 is pressed\r\n")));
			break;
		case KSCAN3:
			RETAILMSG(1, (TEXT("keypad K13 is pressed\r\n")));
			break;
		default:
			//RETAILMSG(1, (TEXT("unknown keypad is pressed\r\n")));
			break;
		}
		InterruptDone(g_KeypadSysIntr[3]);
    }        	
}


DWORD
KPD_Init(DWORD dwContext)
{
	HANDLE hThread[4];
	DWORD IDThread[4];
	INT i;
	
	RETAILMSG(1, (TEXT("+ Keypad : KPD_Init \r\n")));

	hThread[0] = CreateThread(0, 
						   0, 
						   (LPTHREAD_START_ROUTINE) KPD_IntrThread0, 
						   0, 
						   0, 
						   &IDThread[0]);
						   
	hThread[1] = CreateThread(0, 
						   0, 
						   (LPTHREAD_START_ROUTINE) KPD_IntrThread1, 
						   0, 
						   0, 
						   &IDThread[0]);
						   
	hThread[2] = CreateThread(0, 
						   0, 
						   (LPTHREAD_START_ROUTINE) KPD_IntrThread2, 
						   0, 
						   0, 
						   &IDThread[2]);
						   
	hThread[3] = CreateThread(0, 
						   0, 
						   (LPTHREAD_START_ROUTINE) KPD_IntrThread3, 
						   0, 
						   0, 
						   &IDThread[3]);
						   
	for (i = 0; i < 4; ++i)
		if (hThread[i] == NULL) {
			RETAILMSG(1, (TEXT("::: CreateThread() Fail\r\n")));
			return FALSE;
		}
		else
			RETAILMSG(1, (TEXT(" Keypad : KPD_IntrThread ID = %x\r\n"), IDThread[i]));
		
	RETAILMSG(1, (TEXT("- Keypad : KPD_Init \r\n")));
	return TRUE;
}



//
// Device deinit - devices are expected to close down.
// The device manager does not check the return code.
//
BOOL
KPD_Deinit(
    DWORD dwContext     // future: pointer to the per disk structure
    )
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_Deinit \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_Deinit \r\n")));
    return TRUE;
}   // DSK_Deinit


//
// Returns handle value for the open instance.
//
DWORD
KPD_Open(
    DWORD dwData,
    DWORD dwAccess,
    DWORD dwShareMode
    )
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_Open \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_Open \r\n")));
    return 0;
}   // DSK_Open

BOOL
KPD_Close(
    DWORD Handle
    )
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_Close \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_Close \r\n")));

    return TRUE;
}   // DSK_Close

//
// I/O Control function - responds to info, read and write control codes.
// The read and write take a scatter/gather list in pInBuf
//
BOOL
KPD_IOControl(
    DWORD Handle,
    DWORD dwIoControlCode,
    PBYTE pInBuf,
    DWORD nInBufSize,
    PBYTE pOutBuf,
    DWORD nOutBufSize,
    PDWORD pBytesReturned
    )
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_IOControl \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_IOControl \r\n")));
    return FALSE;
}   // DSK_IOControl


DWORD 
KPD_Read(
	DWORD Handle, 
	LPVOID pBuffer, 
	DWORD dwNumBytes
	)
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_Read \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_Read \r\n")));
	return 0;
}

DWORD 
KPD_Write(
	DWORD Handle, 
	LPCVOID pBuffer, 
	DWORD dwNumBytes
	)
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_Write \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_Write \r\n")));
	return 0;
}

DWORD 
KPD_Seek(
	DWORD Handle, 
	long lDistance, 
	DWORD dwMoveMethod
	)
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_Seek \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_Seek \r\n")));
	return 0;
}

void 
KPD_PowerUp(void)
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_PowerUp \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_PowerUp \r\n")));
	return;
}

void
KPD_PowerDown(void)
{
	RETAILMSG(1, (TEXT("+ Keypad : KPD_PowerDown \r\n")));

	RETAILMSG(1, (TEXT("- Keypad : KPD_PowerDown \r\n")));
	return;
}

⌨️ 快捷键说明

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