s3c2440.cpp
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:10k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. //
  2. // Copyright (c) Microsoft Corporation.  All rights reserved.
  3. //
  4. //
  5. // Use of this source code is subject to the terms of the Microsoft end-user
  6. // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
  7. // If you did not accept the terms of the EULA, you are not authorized to use
  8. // this source code. For a copy of the EULA, please see the LICENSE.RTF on your
  9. // install media.
  10. //
  11. /*++
  12. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  13. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  14. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  15. PARTICULAR PURPOSE.
  16. @doc    EXTERNAL
  17. @module sctovk.cpp |
  18. Sample implementation of the keyboard platform dependent scan code to
  19. Virtual Key mapping for keyboard driver.
  20. Exports ScanCodeToVKey for the PDD to use to map scan codes to virtual
  21. keys.  A version of this will be needed for every physical/virtual key
  22. configuration.
  23. */
  24. #include <windows.h>
  25. #include <keybddr.h>
  26. #include <laymgr.h>
  27. #include <devicelayout.h>
  28. #include "s3c2440kbd.hpp"
  29. #define VK_MATRIX_FN   0xC1
  30. #define ScanCodeTableFirst  0x00
  31. #define ScanCodeTableLast   0x6F
  32. UINT8 ScanCodeToVKeyTable[] =
  33. {
  34. 0,  // Scan Code 0x0
  35. VK_MENU, // Scan Code 0x1
  36. 0, // Scan Code 0x2
  37. 0, // Scan Code 0x3
  38. 0, // Scan Code 0x4
  39. 0, // Scan Code 0x5
  40. 0, // Scan Code 0x6
  41. 0, // Scan Code 0x7
  42. 0, // Scan Code 0x8
  43. VK_BACKQUOTE, // Scan Code 0x9 
  44. VK_BACKSLASH, // Scan Code 0xA
  45. VK_TAB, // Scan Code 0xB
  46. 'Z', // Scan Code 0xC
  47. 'A', // Scan Code 0xD
  48. 'X', // Scan Code 0xE
  49. 0, // Scan Code 0xF
  50. 0, // Scan Code 0x10
  51. 0, // Scan Code 0x11
  52. VK_LSHIFT, // Scan Code 0x12
  53. 0, // Scan Code 0x13
  54. 0, // Scan Code 0x14
  55. 0, // Scan Code 0x15
  56. 0, // Scan Code 0x16
  57. 0, // Scan Code 0x17
  58. 0, // Scan Code 0x18
  59. VK_CONTROL, // Scan Code 0x19
  60. 0, // Scan Code 0x1A
  61. 0, // Scan Code 0x1B
  62. 0, // Scan Code 0x1C
  63. 0, // Scan Code 0x1D
  64. 0, // Scan Code 0x1E
  65. 0, // Scan Code 0x1F
  66. 0, // Scan Code 0x20
  67. VK_MATRIX_FN, // Scan Code 0x21, Fn
  68. 0, // Scan Code 0x22
  69. 0, // Scan Code 0x23
  70. 0, // Scan Code 0x24
  71. 0, // Scan Code 0x25
  72. 0, // Scan Code 0x26
  73. 0, // Scan Code 0x27
  74. 0, // Scan Code 0x28
  75. VK_ESCAPE, // Scan Code 0x29
  76. VK_DELETE, // Scan Code 0x2A
  77. 'Q', // Scan Code 0x2B
  78. VK_CAPITAL, // Scan Code 0x2C
  79. 'S', // Scan Code 0x2D
  80. 'C', // Scan Code 0x2E
  81. '3', // Scan Code 0x2F
  82. 0, // Scan Code 0x30
  83. '1', // Scan Code 0x31
  84. 0, // Scan Code 0x32
  85. 'W', // Scan Code 0x33
  86. 0, // Scan Code 0x34
  87. 'D', // Scan Code 0x35
  88. 'V', // Scan Code 0x36
  89. '4', // Scan Code 0x37
  90. 0, // Scan Code 0x38
  91. '2', // Scan Code 0x39
  92. 'T', // Scan Code 0x3A
  93. 'E', // Scan Code 0x3B
  94. 0, // Scan Code 0x3C
  95. 'F', // Scan Code 0x3D
  96. 'B', // Scan Code 0x3E
  97. '5', // Scan Code 0x3F
  98. 0, // Scan Code 0x40
  99. '9', // Scan Code 0x41
  100. 'Y', // Scan Code 0x42
  101. 'R', // Scan Code 0x43
  102. 'K', // Scan Code 0x44
  103. 'G', // Scan Code 0x45
  104. 'N', // Scan Code 0x46
  105. '6', // Scan Code 0x47
  106. 0, // Scan Code 0x48
  107. '0', // Scan Code 0x49
  108. 'U', // Scan Code 0x4A
  109. 'O', // Scan Code 0x4B
  110. 'L', // Scan Code 0x4C
  111. 'H', // Scan Code 0x4D
  112. 'M', // Scan Code 0x4E
  113. '7', // Scan Code 0x4F
  114. 0, // Scan Code 0x50
  115. VK_HYPHEN, // Scan Code 0x51
  116. 'I', // Scan Code 0x52
  117. 'P', // Scan Code 0x53
  118. VK_SEMICOLON, // Scan Code 0x54
  119. 'J', // Scan Code 0x55
  120. VK_COMMA, // Scan Code 0x56
  121. '8', // Scan Code 0x57
  122. 0, // Scan Code 0x58
  123. VK_EQUAL, // Scan Code 0x59
  124. VK_RETURN, // Scan Code 0x5A
  125. VK_LBRACKET, // Scan Code 0x5B
  126. VK_APOSTROPHE, // Scan Code 0x5C
  127. VK_SLASH, // Scan Code 0x5D
  128. VK_PERIOD, // Scan Code 0x5E
  129. VK_RWIN, // Scan Code 0x5F, Prog
  130. 0, // Scan Code 0x60
  131. 0, // Scan Code 0x61
  132. VK_RSHIFT, // Scan Code 0x62
  133. 0, // Scan Code 0x63
  134. 0, // Scan Code 0x64
  135. 0, // Scan Code 0x65
  136. 0, // Scan Code 0x66
  137. 0, // Scan Code 0x67
  138. 0, // Scan Code 0x68
  139. VK_BACK, // Scan Code 0x69
  140. VK_DOWN, // Scan Code 0x6A
  141. VK_RBRACKET, // Scan Code 0x6B
  142. VK_UP, // Scan Code 0x6C
  143. VK_LEFT, // Scan Code 0x6D
  144. VK_SPACE, // Scan Code 0x6E
  145. VK_RIGHT, // Scan Code 0x6F
  146. };
  147. static ScanCodeToVKeyData scvkEngUS = 
  148. {
  149.     0,
  150.     ScanCodeTableFirst,
  151.     ScanCodeTableLast,
  152.     ScanCodeToVKeyTable
  153. };
  154. static ScanCodeToVKeyData *rgscvkMatrixEngUSTables[] = 
  155.     { &scvkEngUS };
  156. struct VirtualKeyMapping {
  157.     UINT32 uiVk;
  158.     UINT32 uiVkGenerated;
  159. };
  160. static const VirtualKeyMapping g_rgvkMapFn[] = {
  161.     {  '1', VK_F1 },
  162.     {  '2', VK_F2 },
  163.     {  '3', VK_F3 },
  164.     {  '4', VK_F4 },
  165.     {  '5', VK_F5 },
  166.     {  '6', VK_F6 },
  167.     {  '7', VK_F7 },
  168.     {  '8', VK_F8 },
  169.     {  '9', VK_F9 },
  170.     {  '0', VK_F10 },
  171.     { VK_HYPHEN, VK_NUMLOCK },
  172.     { VK_EQUAL, VK_CANCEL },
  173.     {  'P', VK_INSERT },
  174.     { VK_LBRACKET, VK_PAUSE },
  175.     { VK_RBRACKET, VK_SCROLL },
  176.     { VK_SEMICOLON, VK_SNAPSHOT },
  177.     { VK_APOSTROPHE, VK_SNAPSHOT },
  178.     {  VK_LEFT, VK_HOME },
  179.     {  VK_UP, VK_PRIOR},
  180.     {  VK_DOWN, VK_NEXT },
  181.     {  VK_RIGHT, VK_END },
  182. };
  183. static const VirtualKeyMapping g_rgvkMapNumLock[] = {
  184.     {  '7', VK_NUMPAD7 },
  185.     {  '8', VK_NUMPAD8 },
  186.     {  '9', VK_NUMPAD9 },
  187.     {  '0', VK_MULTIPLY },
  188.     {  'U', VK_NUMPAD4 },
  189.     {  'I', VK_NUMPAD5 },
  190.     {  'O', VK_NUMPAD6 },
  191.     {  'P', VK_SUBTRACT },
  192.     {  'J', VK_NUMPAD1 },
  193.     {  'K', VK_NUMPAD2 },
  194.     {  'L', VK_NUMPAD3 },
  195.     {  VK_SEMICOLON, VK_ADD },
  196.     {  'M', VK_NUMPAD0 },
  197.     {  VK_PERIOD, VK_DECIMAL },
  198.     {  VK_SLASH, VK_DIVIDE },
  199. };
  200. // Find a virtual key mapping in the given array.
  201. static
  202. const VirtualKeyMapping * 
  203. FindRemappedKey(
  204.     UINT32 uiVk,
  205.     const VirtualKeyMapping *pvkMap,
  206.     DWORD cvkMap
  207.     )
  208. {
  209.     const VirtualKeyMapping *pvkMapMatch = NULL;
  210.     UINT ui;
  211.     
  212.     DEBUGCHK(pvkMap);
  213.     for (ui = 0; ui < cvkMap; ++ui) {
  214.         if (pvkMap[ui].uiVk == uiVk) {
  215.             pvkMapMatch = &pvkMap[ui];
  216.             break;
  217.         }
  218.     }
  219.     return pvkMapMatch;
  220. }
  221. #define IS_NUMLOCK_ON(ksf) (ksf & KeyShiftNumLockFlag)
  222. // Remapping function for the matrix keyboard
  223. static
  224. UINT
  225. WINAPI
  226. MatrixUsRemapVKey(
  227.     const KEYBD_EVENT *pKbdEvents,
  228.     UINT               cKbdEvents,
  229.     KEYBD_EVENT       *pRmpKbdEvents,
  230.     UINT               cMaxRmpKbdEvents
  231.     )
  232. {
  233.     SETFNAME(_T("MatrixUsRemapVKey"));
  234.     
  235.     static BOOL fFnDown = FALSE;
  236.     
  237.     UINT cRmpKbdEvents = 0;
  238.     UINT ui;
  239.     if (pRmpKbdEvents == NULL) {
  240.         // 1 to 1 mapping
  241.         DEBUGCHK(cMaxRmpKbdEvents == 0);
  242.         return cKbdEvents;
  243.     }
  244.     
  245.     DEBUGCHK(pKbdEvents != NULL);
  246.     if (cMaxRmpKbdEvents < cKbdEvents) {
  247.         DEBUGMSG(ZONE_ERROR, (_T("%s: Buffer is not large enough!rn"),
  248.             pszFname));
  249.         return 0;
  250.     }
  251.     
  252.     for (ui = 0; ui < cKbdEvents; ++ui) {
  253.         const KEYBD_EVENT *pKbdEventCurr = &pKbdEvents[ui];
  254.         KEYBD_EVENT *pKbdEventRmpCurr = &pRmpKbdEvents[cRmpKbdEvents];
  255.         // Copy the input key event to our remapped list
  256.         pKbdEventRmpCurr->uiVk = pKbdEventCurr->uiVk;
  257.         pKbdEventRmpCurr->uiSc = pKbdEventCurr->uiSc;
  258.         pKbdEventRmpCurr->KeyStateFlags = pKbdEventCurr->KeyStateFlags;
  259.         const VirtualKeyMapping *pvkMap = NULL;
  260.         BOOL fKeyDown = (pKbdEventCurr->KeyStateFlags & KeyStateDownFlag) != 0;
  261.         UINT32 uiVkCurr = pKbdEventCurr->uiVk;
  262.         if (uiVkCurr == VK_MATRIX_FN) {
  263.             fFnDown = fKeyDown;
  264.             // Fn virtual key does not get sent to the system so
  265.             // do not increment cRmpKbdEvents.
  266.             DEBUGMSG(ZONE_DEVICELAYOUT, (_T("%s: Fn key is now %srn"),
  267.                 pszFname, (fFnDown ? _T("DOWN") : _T("UP"))));
  268.         }
  269.         else {
  270.             // We have one key event
  271.             ++cRmpKbdEvents;
  272.             if (fKeyDown) {
  273.                 // Handle key down
  274.                 if (fFnDown) {
  275.                     // Fn key is on
  276.                     if (IS_NUMLOCK_ON(pKbdEventCurr->KeyStateFlags)) {
  277.                         pvkMap = FindRemappedKey(uiVkCurr,
  278.                             g_rgvkMapNumLock, dim(g_rgvkMapNumLock));
  279.                     }
  280.                     if (pvkMap == NULL) {
  281.                         // NumLock did not effect this key. See if the
  282.                         // Fn key by itself does.                        
  283.                         pvkMap = FindRemappedKey(uiVkCurr, 
  284.                             g_rgvkMapFn, dim(g_rgvkMapFn));
  285.                     }
  286.                 }
  287.             }
  288.             else {
  289.                 // Handle key up
  290.                 if (fFnDown) {
  291.                     // Fn key is on
  292.                     if (IS_NUMLOCK_ON(pKbdEventCurr->KeyStateFlags)) {
  293.                         pvkMap = FindRemappedKey(uiVkCurr,
  294.                             g_rgvkMapNumLock, dim(g_rgvkMapNumLock));
  295.                     }
  296.                     if (pvkMap == NULL) {
  297.                         // NumLock did not effect this key. See if the
  298.                         // Fn key by itself does.                        
  299.                         pvkMap = FindRemappedKey(uiVkCurr, 
  300.                             g_rgvkMapFn, dim(g_rgvkMapFn));
  301.                     }
  302.                 }
  303.             }
  304.             if (pvkMap != NULL) {
  305.                 // This combination generates a different virtual key
  306.                 DEBUGCHK(pvkMap->uiVkGenerated != 0);
  307.                 pKbdEventRmpCurr->uiVk = pvkMap->uiVkGenerated;
  308.             }
  309.         }
  310.     }
  311.     return cRmpKbdEvents;    
  312. }
  313.     
  314. static DEVICE_LAYOUT dlMatrixEngUs =
  315. {
  316.     sizeof(DEVICE_LAYOUT),
  317.     MATRIX_PDD,
  318.     rgscvkMatrixEngUSTables,
  319.     dim(rgscvkMatrixEngUSTables),
  320.     MatrixUsRemapVKey,
  321. };
  322. extern "C"
  323. BOOL
  324. Matrix(
  325.     PDEVICE_LAYOUT pDeviceLayout
  326.     )
  327. {
  328.     DEBUGCHK(pDeviceLayout != NULL);
  329.     BOOL fRet = FALSE;
  330.     if (pDeviceLayout->dwSize != sizeof(DEVICE_LAYOUT)) {
  331.         RETAILMSG(1, (_T("Matrix: data structure size mismatchrn")));
  332.         goto leave;
  333.     }
  334.     // Make sure that the Sc->Vk tables are the sizes that we expect
  335.     DEBUGCHK(dim(ScanCodeToVKeyTable) == (1 + ScanCodeTableLast - ScanCodeTableFirst));
  336.     *pDeviceLayout = dlMatrixEngUs;
  337.     fRet = TRUE;
  338. leave:
  339.     return fRet;
  340. }
  341. #ifdef DEBUG
  342. // Verify function declaration against the typedef.
  343. static PFN_DEVICE_LAYOUT_ENTRY v_pfnDeviceLayout = Matrix;
  344. #endif