?? keymatrix.cpp
字號:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 2008. Samsung Electronics, co. ltd All rights reserved.
Module Name:
Abstract:
This file implements the S3C6410 Keyboard function
Notes:
--*/
#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
#include <Pmpolicy.h>
#include <keybddbg.h>
#include <keybddr.h>
#include <keybdpdd.h>
#include <keybdist.h>
#include <oal.h>
#include <s3c6410.h>
#include <bsp.h>
#include "keymatrix.hpp"
#define KEY_POWER_ON (1<<11) // PCLKCON
#define FT_CLK_DIV (FIN/32000 - 1)
#define KCODE_TYPE_NORMAL 0x0001
#define KCODE_TYPE_SL 0x0002
#define DEFAULT_PRIORITY 145
#define SIZE_KEY SIZE_COLS * SIZE_ROWS
#define CNT_VALIDKEY 1
#define CNT_LONGKEY 30
#define TIME_KEYSCAN 10
#define SCAN_EXT 0xe000
#if ((MATRIX_LAYOUT == LAYOUT0)||(MATRIX_LAYOUT == LAYOUT2))
#define SIZE_BITS 8
#define SIZE_COLS 8
#define SIZE_ROWS 8
#elif (MATRIX_LAYOUT == LAYOUT1)
#define SIZE_BITS 2
#define SIZE_COLS 5
#define SIZE_ROWS 2
#endif
// Pointer to device control registers
volatile S3C6410_GPIO_REG *pGPIOReg = NULL;
volatile S3C6410_KEYPAD_REG *pKeyPadReg = NULL;
volatile S3C6410_SYSCON_REG *pSysConReg = NULL;
DWORD ChangeState[SIZE_COLS];
DWORD KeyState[SIZE_COLS];
DWORD FaultKey;
// There is really only one physical keyboard supported by the system.
KeyMatrix *Keyboard;
typedef enum {
ENUM_INPUT = 0,
ENUM_OUTPUT,
ENUM_AUXFUNC,
ENUM_RESERVED
} ENUM_GPIO_FUNC;
typedef enum {
ENUM_ROW,
ENUM_COL
} ENUM_COL_ROW;
struct KSTATE
{
WORD Mask;
WORD Cnt;
};
struct KCODE
{
DWORD Type;
DWORD Scan;
DWORD TimeoutCnt; // used by KCODE_TYPE_SL
BOOL Fin;
};
#if (MATRIX_LAYOUT == LAYOUT0)
struct KSTATE KeyChange[SIZE_KEY];
struct KCODE KeyCode[SIZE_KEY] =
{
{KCODE_TYPE_NORMAL , 0x0000 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0001 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0002 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0003 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0004 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0005 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0006 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0007 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0008 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0009 , 0, 0},
{KCODE_TYPE_NORMAL , 0x000a , 0, 0},
{KCODE_TYPE_NORMAL , 0x000b , 0, 0},
{KCODE_TYPE_NORMAL , 0x000c , 0, 0},
{KCODE_TYPE_NORMAL , 0x000d , 0, 0},
{KCODE_TYPE_NORMAL , 0x000e , 0, 0},
{KCODE_TYPE_NORMAL , 0x000f , 0, 0},
{KCODE_TYPE_NORMAL , 0x0010 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0011 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0012 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0013 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0014 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0015 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0016 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0017 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0018 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0019 , 0, 0},
{KCODE_TYPE_NORMAL , 0x001a , 0, 0},
{KCODE_TYPE_NORMAL , 0x001b , 0, 0},
{KCODE_TYPE_NORMAL , 0x001c , 0, 0},
{KCODE_TYPE_NORMAL , 0x001d , 0, 0},
{KCODE_TYPE_NORMAL , 0x001e , 0, 0},
{KCODE_TYPE_NORMAL , 0x001f , 0, 0},
{KCODE_TYPE_NORMAL , 0x0020 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0021 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0022 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0023 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0024 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0025 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0026 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0027 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0028 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0029 , 0, 0},
{KCODE_TYPE_NORMAL , 0x002a , 0, 0},
{KCODE_TYPE_NORMAL , 0x002b , 0, 0},
{KCODE_TYPE_NORMAL , 0x002c , 0, 0},
{KCODE_TYPE_NORMAL , 0x002d , 0, 0},
{KCODE_TYPE_NORMAL , 0x002e , 0, 0},
{KCODE_TYPE_NORMAL , 0x002f , 0, 0},
{KCODE_TYPE_NORMAL , 0x0030 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0031 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0032 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0033 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0034 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0035 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0036 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0037 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0038 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0039 , 0, 0},
{KCODE_TYPE_NORMAL , 0x003a , 0, 0},
{KCODE_TYPE_NORMAL , 0x003b , 0, 0},
{KCODE_TYPE_NORMAL , 0x003c , 0, 0},
{KCODE_TYPE_NORMAL , 0x003d , 0, 0},
{KCODE_TYPE_NORMAL , 0x003e , 0, 0},
{KCODE_TYPE_NORMAL , 0x003f , 0, 0},
};
#elif (MATRIX_LAYOUT == LAYOUT1)
struct KSTATE KeyChange[SIZE_KEY];
struct KCODE KeyCode[SIZE_KEY] =
{
{KCODE_TYPE_NORMAL , 0x0000 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0001 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0002 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0003 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0004 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0005 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0006 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0007 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0008 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0009 , 0, 0}
};
#elif (MATRIX_LAYOUT == LAYOUT2)
struct KSTATE KeyChange[SIZE_KEY];
struct KCODE KeyCode[SIZE_KEY] =
{
{KCODE_TYPE_NORMAL , 0x0000 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0001 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0002 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0003 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0004 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0005 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0006 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0007 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0008 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0009 , 0, 0},
{KCODE_TYPE_NORMAL , 0x000a , 0, 0},
{KCODE_TYPE_NORMAL , 0x000b , 0, 0},
{KCODE_TYPE_NORMAL , 0x000c , 0, 0},
{KCODE_TYPE_NORMAL , 0x000d , 0, 0},
{KCODE_TYPE_NORMAL , 0x000e , 0, 0},
{KCODE_TYPE_NORMAL , 0x000f , 0, 0},
{KCODE_TYPE_NORMAL , 0x0010 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0011 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0012 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0013 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0014 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0015 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0016 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0017 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0018 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0019 , 0, 0},
{KCODE_TYPE_NORMAL , 0x001a , 0, 0},
{KCODE_TYPE_NORMAL , 0x001b , 0, 0},
{KCODE_TYPE_NORMAL , 0x001c , 0, 0},
{KCODE_TYPE_NORMAL , 0x001d , 0, 0},
{KCODE_TYPE_NORMAL , 0x001e , 0, 0},
{KCODE_TYPE_NORMAL , 0x001f , 0, 0},
{KCODE_TYPE_NORMAL , 0x0020 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0021 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0022 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0023 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0024 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0025 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0026 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0027 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0028 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0029 , 0, 0},
{KCODE_TYPE_NORMAL , 0x002a , 0, 0},
{KCODE_TYPE_NORMAL , 0x002b , 0, 0},
{KCODE_TYPE_NORMAL , 0x002c , 0, 0},
{KCODE_TYPE_NORMAL , 0x002d , 0, 0},
{KCODE_TYPE_NORMAL , 0x002e , 0, 0},
{KCODE_TYPE_NORMAL , 0x002f , 0, 0},
{KCODE_TYPE_NORMAL , 0x0030 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0031 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0032 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0033 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0034 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0035 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0036 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0037 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0038 , 0, 0},
{KCODE_TYPE_NORMAL , 0x0039 , 0, 0},
{KCODE_TYPE_NORMAL , 0x003a , 0, 0},
{KCODE_TYPE_NORMAL , 0x003b , 0, 0},
{KCODE_TYPE_NORMAL , 0x003c , 0, 0},
{KCODE_TYPE_NORMAL , 0x003d , 0, 0},
{KCODE_TYPE_NORMAL , 0x003e , 0, 0},
{KCODE_TYPE_NORMAL , 0x003f , 0, 0},
};
#endif
extern void ReadRegDWORD( LPCWSTR szKeyName, LPCWSTR szValueName, LPDWORD pdwValue );
static void GPIO_PuEnable(ENUM_COL_ROW iClass, bool bFlag);
static void GPIO_CtrlHandler(ENUM_COL_ROW iClass, ENUM_GPIO_FUNC iLevel);
static void KEYIF_Column_Set(DWORD dVal);
static void KEYIF_Column_Bitset(bool bVal, int cIdx);
static DWORD KEYIF_Row_Read(void);
static void KEYIF_Status_Clear(void);
void Keypad_Clock_On(BOOL bOn);
/*****************************************************************************/
/*****************************************************************************
* Function Name : KeybdPdd_PowerHandler
* Function Desc : Power Handler
*
*/
void WINAPI KeybdPdd_PowerHandler(BOOL bOff)
{
if (!bOff)
{
Keyboard->KeybdPowerOn();
}
else
{
Keyboard->KeybdPowerOff();
}
return;
}
/****************************************************************************/
/*****************************************************************************
* Function Name : KeybdDriverInitializeAddresses
* Function Desc : KeyBoard Driver Initialization
* Read Registry
*
*/
BOOL KeybdDriverInitializeAddresses(void)
{
bool RetValue = TRUE;
DWORD dwSYSCONBase;
DWORD dwIOBase;
DWORD dwIOCTRLBase;
PHYSICAL_ADDRESS ioPhysicalBase = {0,0};
DEBUGMSG(ZONE_INIT,(TEXT("++KeybdDriverInitializeAddresses\r\n")));
ReadRegDWORD(TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("SYSCONBase"), &dwSYSCONBase );
if(dwSYSCONBase == 0)
{
DEBUGMSG(ZONE_ERROR, (TEXT("Can't fount registry entry : HARDWARE\\DEVICEMAP\\KEYBD\\SYSCONBase\r\n")));
goto error_return;
}
DEBUGMSG(ZONE_INIT, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\SYSCONBase:%x\r\n"), dwSYSCONBase));
ReadRegDWORD(TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("IOBase"), &dwIOBase );
if(dwIOBase == 0)
{
DEBUGMSG(ZONE_ERROR, (TEXT("Can't fount registry entry : HARDWARE\\DEVICEMAP\\KEYBD\\IOBase\r\n")));
goto error_return;
}
DEBUGMSG(ZONE_INIT, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\IOBase:%x\r\n"), dwIOBase));
ReadRegDWORD(TEXT("HARDWARE\\DEVICEMAP\\KEYBD"), _T("IOCTRLBase"), &dwIOCTRLBase );
if(dwIOCTRLBase == 0)
{
DEBUGMSG(ZONE_ERROR, (TEXT("Can't fount registry entry : HARDWARE\\DEVICEMAP\\KEYBD\\IOCTRLBase\r\n")));
goto error_return;
}
DEBUGMSG(1, (TEXT("HARDWARE\\DEVICEMAP\\KEYBD\\IOCTRLBase:%x\r\n"), dwIOCTRLBase));
// Syscon Virtual alloc
ioPhysicalBase.LowPart = dwSYSCONBase;
pSysConReg = (S3C6410_SYSCON_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_SYSCON_REG), FALSE);
if (pSysConReg == NULL)
{
DEBUGMSG(ZONE_INIT,(TEXT("[KBD] pSysConReg : MmMapIoSpace failed!\r\n")));
goto error_return;
}
DEBUGMSG(ZONE_INIT, (TEXT("[KBD] pSysConReg mapped at %x\r\n"), pSysConReg));
// GPIO Virtual alloc
ioPhysicalBase.LowPart = dwIOBase;
pGPIOReg = (S3C6410_GPIO_REG *)MmMapIoSpace(ioPhysicalBase, sizeof(S3C6410_GPIO_REG), FALSE);
if (pGPIOReg == NULL)
{
DEBUGMSG(ZONE_ERROR,(TEXT("[KBD] pGPIOReg : MmMapIoSpace failed!\r\n")));
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -