📄 bspkeypad.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.
//
//------------------------------------------------------------------------------
//
// Copyright (C) 2004, Motorola Inc. All Rights Reserved
//
//------------------------------------------------------------------------------
//
// Copyright (C) 2004-2006,2007 Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//
// File: bspkeypad.c
//
// Provides BSP-specific configuration routines for the KPP peripheral.
// Implementation of the keyboard platform dependent scan code to
// Virtual Key mapping for keyboard driver.
//
// Exports ScanCodeToVKey for the PDD to use to map scan codes to virtual
// keys. A version of this will be needed for every physical/virtual key
// configuration.
//
//------------------------------------------------------------------------------
#include <windows.h>
#include <winuser.h>
#include <winuserm.h>
#include <ceddk.h>
#include <keybddr.h>
#include <laymgr.h>
#include <devicelayout.h>
#include "bsp.h"
#include "Keypad.hpp"
//------------------------------------------------------------------------------
// External Functions
//------------------------------------------------------------------------------
// External Variables
extern PCSP_KPP_REGS g_pKPP;
//------------------------------------------------------------------------------
// Defines
#define ScanCodeTableFirst 0x00
#define ScanCodeTableLast 0x99
#define E0ScanCodeTableFirst 0xE010
#define E0ScanCodeTableLast 0xE07F
#define KEY_DEBOUNCE_PERIOD 40 // msec
#define MAX_KEY_EVENTS 16
#define KPP_COLUMN_INUSE 8
#define KPP_ROW_INUSE 8
#define KEY_NUMBER (KPP_COLUMN_INUSE*KPP_ROW_INUSE)
#define KPP_COLUMN_MASK ((0x1<<KPP_COLUMN_INUSE) -1)
#define KPP_ROW_MASK ((0x1<<KPP_ROW_INUSE) - 1)
//------------------------------------------------------------------------------
// Types
struct VirtualKeyMapping {
UINT32 uiVk;
UINT32 uiVkGenerated;
};
//------------------------------------------------------------------------------
// Global Variables
//------------------------------------------------------------------------------
// Local Variables
static volatile BOOL g_SysSuspend = FALSE;
static volatile BOOL g_bRestoreClocks = FALSE;
// This variable is global to this file because it
// will later be used in BSPKppPowerOff.
// Record of which keys were down the last time columns were scanned.
static UINT8 keyDown[KPP_COLUMN_INUSE];
static UINT32 prevDownTime[KEY_NUMBER]; // Time that the key went down.
static BOOL keyDownSent[KEY_NUMBER]; // Tells whether the key down event
// has already been passed up.
// Reset to false after key goes up.
static UINT8 kppStatus[KPP_COLUMN_INUSE]; // Row data from the last time
// columns were scanned.
// Copies of scan sequence variables used to store and restore
// key data in case system enters suspend state
static UINT8 IntermediateScanCode[]=
{
0x5A,//0x00
0x05,
0x26,
0x46,
0x1C,
0x68,//0x05
0x32,
0x29,
0x96,
0x04,
0x1E,//0x0A
0x01,
0x1B,
0x78,
0x33,
0x94,
0x98,//0x10
0x99,
0x16,
0x3E,
0x23,
0x58,//0x15
0x31,
0x49,
0x97,
0x90,
0x25,//0x1A
0x45,
0x24,
0x1A,
0x3A,
0x5A,
0x95,//0x20
0x0B,
0x83,
0x0A,
0x2B,
0x22,//0x25
0x3B,
0x4B,
0x06,
0x91,
0x3D,//0x2A
0x09,
0x2D,
0x21,
0x42,
0x66,
0x0C,//0x30
0x92,
0x2E,
0x15,
0x2C,
0x2A,//0x35
0x3C,
0x4D,
0x76,
0x93,
0x36,//0x3A
0x1D,
0x35,
0x34,
0x43,
0x44 //0x3F
};
static WORD g_wKPSRStored;
static UINT8 keyDownStored[KPP_COLUMN_INUSE];
static UINT32 prevDownTimeStored[KEY_NUMBER];
static BOOL keyDownSentStored[KEY_NUMBER];
static UINT8 kppStatusStored[KPP_COLUMN_INUSE];
static UINT8 ScanCodeToVKeyTable[] =
{
#ifdef PLAT_PMC
VK_RETURN, //SW60
#else
VK_TACTION, // Scan Code 0x0
#endif
VK_F9, // Scan Code 0x1
0 , // Scan Code 0x2
VK_F5, // Scan Code 0x3
VK_F3, // Scan Code 0x4
VK_F1, // Scan Code 0x5
VK_F2, // Scan Code 0x6
VK_F12, // Scan Code 0x7
VK_F13, // Scan Code 0x8
VK_F10, // Scan Code 0x9
VK_F8, // Scan Code 0xA
VK_F6, // Scan Code 0xB
VK_F4, // Scan Code 0xC
VK_TAB, // Scan Code 0xD
VK_BACKQUOTE, // Scan Code 0xE
VK_CLEAR, // Scan Code 0xF
VK_F14, // Scan Code 0x10
VK_LMENU, // Scan Code 0x11
VK_LSHIFT, // Scan Code 0x12
VK_DBE_HIRAGANA, // Scan Code 0x13
VK_LCONTROL, // Scan Code 0x14
'Q', // Scan Code 0x15
'1', // Scan Code 0x16
0, // Scan Code 0x17
VK_F15, // Scan Code 0x18
0, // Scan Code 0x19
'Z', // Scan Code 0x1A
'S', // Scan Code 0x1B
'A', // Scan Code 0x1C
'W', // Scan Code 0x1D
'2', // Scan Code 0x1E
0xf1, // Scan Code 0x1F
VK_F16, // Scan Code 0x20
'C', // Scan Code 0x21
'X', // Scan Code 0x22
'D', // Scan Code 0x23
'E', // Scan Code 0x24
'4', // Scan Code 0x25
'3', // Scan Code 0x26
0, // Scan Code 0x27
VK_F17, // Scan Code 0x28
VK_SPACE, // Scan Code 0x29
'V', // Scan Code 0x2A
'F', // Scan Code 0x2B
'T', // Scan Code 0x2C
'R', // Scan Code 0x2D
'5', // Scan Code 0x2E
VK_DBE_FLUSHSTRING, // Scan Code 0x2F
VK_F18, // Scan Code 0x30
'N', // Scan Code 0x31
'B', // Scan Code 0x32
'H', // Scan Code 0x33
'G', // Scan Code 0x34
'Y', // Scan Code 0x35
'6', // Scan Code 0x36
VK_DBE_ROMAN, // Scan Code 0x37
VK_F19, // Scan Code 0x38
0, // Scan Code 0x39
'M', // Scan Code 0x3A
'J', // Scan Code 0x3B
'U', // Scan Code 0x3C
'7', // Scan Code 0x3D
'8', // Scan Code 0x3E
VK_DBE_SBCSCHAR, // Scan Code 0x3F
VK_F20, // Scan Code 0x40
VK_COMMA, // Scan Code 0x41
'K', // Scan Code 0x42
'I', // Scan Code 0x43
'O', // Scan Code 0x44
'0', // Scan Code 0x45
'9', // Scan Code 0x46
0, // Scan Code 0x47
VK_F21, // Scan Code 0x48
VK_PERIOD, // Scan Code 0x49
VK_SLASH, // Scan Code 0x4A
'L', // Scan Code 0x4B
VK_SEMICOLON, // Scan Code 0x4C
'P', // Scan Code 0x4D
VK_HYPHEN, // Scan Code 0x4E
0, // Scan Code 0x4F
VK_F22, // Scan Code 0x50
VK_EXTEND_BSLASH, // Scan Code 0x51
VK_APOSTROPHE, // Scan Code 0x52
0, // Scan Code 0x53
VK_LBRACKET, // Scan Code 0x54
VK_EQUAL, // Scan Code 0x55
VK_DBE_NOCODEINPUT, // Scan Code 0x56
VK_F23, // Scan Code 0x57
VK_CAPITAL, // Scan Code 0x58
VK_RSHIFT, // Scan Code 0x59
VK_RETURN, // Scan Code 0x5A
VK_RBRACKET, // Scan Code 0x5B
0, // Scan Code 0x5C
VK_BACKSLASH, // Scan Code 0x5D
VK_HELP, // Scan Code 0x5E
VK_F24, // Scan Code 0x5F
0, // Scan Code 0x60
VK_EXTEND_BSLASH, // Scan Code 0x61
0, // Scan Code 0x62
0, // Scan Code 0x63
VK_CONVERT, // Scan Code 0x64
0, // Scan Code 0x65
VK_BACK, // Scan Code 0x66
VK_NOCONVERT, // Scan Code 0x67
VK_TAB, // Scan Code 0x68
VK_NUMPAD1, // Scan Code 0x69
VK_DBE_ALPHANUMERIC,// Scan Code 0x6A
VK_NUMPAD4, // Scan Code 0x6B
VK_NUMPAD7, // Scan Code 0x6C
0, // Scan Code 0x6D
0, // Scan Code 0x6E
0, // Scan Code 0x6F
VK_NUMPAD0, // Scan Code 0x70
VK_DECIMAL, // Scan Code 0x71
VK_NUMPAD2, // Scan Code 0x72
VK_NUMPAD5, // Scan Code 0x73
VK_NUMPAD6, // Scan Code 0x74
VK_NUMPAD8, // Scan Code 0x75
VK_ESCAPE, // Scan Code 0x76
VK_NUMLOCK, // Scan Code 0x77
VK_F11, // Scan Code 0x78
VK_ADD, // Scan Code 0x79
VK_NUMPAD3, // Scan Code 0x7A
VK_SUBTRACT, // Scan Code 0x7B
VK_MULTIPLY, // Scan Code 0x7C
VK_NUMPAD9, // Scan Code 0x7D
VK_SCROLL, // Scan Code 0x7E
0, // Scan Code 0x7F
0, // Scan Code 0x80
0, // Scan Code 0x81
0, // Scan Code 0x82
VK_F7, // Scan Code 0x83
VK_SNAPSHOT, // Scan Code 0x84
0, // Scan Code 0x85
0, // Scan Code 0x86
0, // Scan Code 0x87
0, // Scan Code 0x88
0, // Scan Code 0x89
0, // Scan Code 0x8A
0, // Scan Code 0x8B
0, // Scan Code 0x8C
0, // Scan Code 0x8D
0, // Scan Code 0x8E
0, // Scan Code 0x8F
#ifdef PLAT_PMC
VK_F1, //SW8
#else
VK_APP1, // Scan Code 0x90
#endif
#ifdef PLAT_PMC
VK_F2, //SW6
#else
VK_APP2, // Scan Code 0x91
#endif
#ifdef PLAT_PMC
VK_F3, //SW5
#else
VK_APP3, //SW5 // Scan Code 0x92
#endif
#ifdef PLAT_PMC
VK_F4, //SW5
#else
VK_APP4, //SW5 // Scan Code 0x93
#endif
VK_MENU, // Scan Code 0x94
VK_UP, // Scan Code 0x95
VK_LEFT, // Scan Code 0x96
VK_RIGHT, // Scan Code 0x97
VK_DOWN, // Scan Code 0x98
VK_LWIN, // Scan Code 0x99
};
static UINT8 E0ScanCodeToVKeyTable[] =
{
VK_BROWSER_SEARCH, // Scan Code 0xE010
VK_RMENU, // Scan Code 0xE011
0, // Scan Code 0xE012 which must be 0 or extra WM_KEYDOWN/UP messages will occur
0, // Scan Code 0xE013
VK_RCONTROL, // Scan Code 0xE014
VK_MEDIA_PREV_TRACK,// Scan Code 0xE015
0, // Scan Code 0xE016
0, // Scan Code 0xE017
VK_BROWSER_FAVORITES,// Scan Code 0xE018
0, // Scan Code 0xE019
0, // Scan Code 0xE01A
0, // Scan Code 0xE01B
0, // Scan Code 0xE01C
0, // Scan Code 0xE01D
0, // Scan Code 0xE01E
VK_LWIN, // Scan Code 0xE01F
VK_BROWSER_REFRESH, // Scan Code 0xE020
VK_VOLUME_DOWN, // Scan Code 0xE021
0, // Scan Code 0xE022
VK_VOLUME_MUTE, // Scan Code 0xE023
0, // Scan Code 0xE024
0, // Scan Code 0xE025
0, // Scan Code 0xE026
VK_RWIN, // Scan Code 0xE027
VK_BROWSER_STOP, // Scan Code 0xE028
0, // Scan Code 0xE029
0, // Scan Code 0xE02A
VK_LAUNCH_APP2, // Scan Code 0xE02B
0, // Scan Code 0xE02C
0, // Scan Code 0xE02D
0, // Scan Code 0xE02E
VK_APPS, // Scan Code 0xE02F
VK_BROWSER_FORWARD, // Scan Code 0xE030
0, // Scan Code 0xE031
VK_VOLUME_UP, // Scan Code 0xE032
0, // Scan Code 0xE033
VK_MEDIA_PLAY_PAUSE,// Scan Code 0xE034
0, // Scan Code 0xE035
0, // Scan Code 0xE036
0, // Scan Code 0xE037
VK_BROWSER_BACK, // Scan Code 0xE038
0, // Scan Code 0xE039
VK_BROWSER_HOME, // Scan Code 0xE03A
VK_MEDIA_STOP, // Scan Code 0xE03B
0, // Scan Code 0xE03C
0, // Scan Code 0xE03D
0, // Scan Code 0xE03E
VK_OFF, // Scan Code 0xE03F
VK_LAUNCH_APP1, // Scan Code 0xE040
0, // Scan Code 0xE041
0, // Scan Code 0xE042
0, // Scan Code 0xE043
0, // Scan Code 0xE044
0, // Scan Code 0xE045
0, // Scan Code 0xE046
0, // Scan Code 0xE047
VK_LAUNCH_MAIL, // Scan Code 0xE048
0, // Scan Code 0xE049
VK_DIVIDE, // Scan Code 0xE04A
0, // Scan Code 0xE04B
0, // Scan Code 0xE04C
VK_MEDIA_NEXT_TRACK,// Scan Code 0xE04D
0, // Scan Code 0xE04E
0, // Scan Code 0xE04F
VK_LAUNCH_MEDIA_SELECT,// Scan Code 0xE050
0, // Scan Code 0xE051
0, // Scan Code 0xE052
0, // Scan Code 0xE053
0, // Scan Code 0xE054
0, // Scan Code 0xE055
0, // Scan Code 0xE056
0, // Scan Code 0xE057
0, // Scan Code 0xE058
0, // Scan Code 0xE059
VK_RETURN, // Scan Code 0xE05A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -