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

📄 keymatrix.cpp

📁 6410BSP3
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//
// 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 + -