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

Windows CE

开发平台:

Windows_Unix

  1. /*++
  2. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. PARTICULAR PURPOSE.
  6. Copyright (c) 2002. Samsung Electronics, co. ltd  All rights reserved.
  7. Module Name:  
  8. Abstract:
  9. This file implements Keyboard driver entry function
  10. rev:
  11. 2002.4.4 : First S3C2410 version (kwangyoon LEE, kwangyoon@samsung.com)
  12. 2002.1.31 : CE.NET port (kwangyoon LEE, kwangyoon@samsung.com)
  13. Notes: 
  14. --*/
  15. #include <windows.h>
  16. #include <ceddk.h>
  17. #include <keybddbg.h>
  18. #include <keybdpdd.h>
  19. #include "s3c2440kbd.hpp"
  20. extern Ps2Keybd *v_pp2k;
  21. UINT v_uiPddId;
  22. PFN_KEYBD_EVENT v_pfnKeybdEvent;
  23. // We read our SysIntr Value from the registry
  24. void
  25. ReadRegDWORD(
  26. LPCWSTR szKeyName,
  27. LPCWSTR szValueName,
  28.     LPDWORD pdwValue
  29.     )
  30. {
  31.     HKEY hKeybd;
  32.     DWORD ValType;
  33.     DWORD ValLen;
  34.     DWORD status;
  35.     //
  36.     // Get the device key from the active device registry key
  37.     //
  38.     status = RegOpenKeyEx(
  39.                 HKEY_LOCAL_MACHINE,
  40.                 szKeyName,
  41.                 0,
  42.                 0,
  43.                 &hKeybd);
  44.     if (status) {
  45.         DEBUGMSG(1, (TEXT("ReadRegDWORD: RegOpenKeyEx(HLM\%s) returned %d!!!rn"),
  46.                   szKeyName, status));
  47. *pdwValue = 0;   // Fail
  48.         return;
  49.     }
  50.     ValLen = sizeof(DWORD);
  51.     status = RegQueryValueEx(       // Retrieve the value
  52.                 hKeybd,
  53.                 szValueName,
  54.                 NULL,
  55.                 &ValType,
  56.                 (PUCHAR)pdwValue,
  57.                 &ValLen);
  58.     if (status != ERROR_SUCCESS) {
  59.         DEBUGMSG(1, (TEXT("ReadSysIntr: RegQueryValueEx(%s) returned %drn"),
  60.                   szValueName, status));
  61. *pdwValue = 0;   // Fail
  62.     }
  63. DEBUGMSG(1, (_T("ReadRegDWORD(): %s -> %s is 0x%xrn"), szKeyName, szValueName, *pdwValue));
  64.     RegCloseKey(hKeybd);
  65. }   // OpenDeviceKey
  66. void
  67. WINAPI
  68. KeybdPdd_PowerHandler(
  69. BOOL bOff
  70. );
  71. static
  72. void
  73. WINAPI
  74. Matrix_PowerHandler(
  75.     UINT uiPddId,
  76.     BOOL fTurnOff
  77.     )
  78. {
  79.     KeybdPdd_PowerHandler(fTurnOff);
  80. }
  81. static
  82. void 
  83. WINAPI
  84. Matrix_ToggleLights(
  85.     UINT uiPddId,
  86.     KEY_STATE_FLAGS KeyStateFlags
  87.     )
  88. {
  89. static const KEY_STATE_FLAGS ksfLightMask = KeyShiftCapitalFlag | 
  90. KeyShiftNumLockFlag | KeyShiftScrollLockFlag; 
  91. static KEY_STATE_FLAGS ksfCurr;
  92.     SETFNAME(_T("Matrix_ToggleLights"));
  93. KEY_STATE_FLAGS ksfNewState = (ksfLightMask & KeyStateFlags);
  94. if (ksfNewState != ksfCurr) 
  95.     {
  96.         DEBUGMSG(ZONE_PDD, (_T("%s: PDD %u: Changing light statern"), 
  97.             pszFname, uiPddId));
  98. KeybdPdd_ToggleKeyNotification(ksfNewState);
  99. ksfCurr = ksfNewState;
  100. }
  101.     return;
  102. }
  103. static KEYBD_PDD MatrixPdd = {
  104.     MATRIX_PDD,
  105.     _T("Matrix"),
  106.     Matrix_PowerHandler,
  107.     Matrix_ToggleLights
  108. };
  109. BOOL KeybdDriverInitializeAddresses(void);
  110. BOOL
  111. WINAPI
  112. Matrix_Entry(
  113.     UINT uiPddId,
  114.     PFN_KEYBD_EVENT pfnKeybdEvent,
  115.     PKEYBD_PDD *ppKeybdPdd
  116.     )
  117. {
  118.     SETFNAME(_T("PS2_8042_Entry"));
  119. BOOL fRet = FALSE;
  120.     v_uiPddId = uiPddId;
  121.     v_pfnKeybdEvent = pfnKeybdEvent;
  122.     DEBUGMSG(ZONE_INIT, (_T("%s: Initialize Matrix ID %urn"), pszFname, 
  123.         uiPddId));
  124.     DEBUGCHK(ppKeybdPdd != NULL);
  125.     *ppKeybdPdd = &MatrixPdd;
  126.     if (v_pp2k) {
  127.         fRet = TRUE;
  128.         goto leave;
  129.     }
  130.     // We always assume that there is a keyboard.
  131.     v_pp2k = new Ps2Keybd;
  132.     if (v_pp2k->Initialize()) {
  133.         v_pp2k ->IsrThreadStart();
  134.     } 
  135.     else {
  136.         ERRORMSG(1,(TEXT("Could not initialize ps2 keyboard.rn")));
  137.         delete v_pp2k;
  138.         v_pp2k = NULL;
  139.     }
  140. if (!KeybdDriverInitializeAddresses()) {
  141. goto leave;
  142. }
  143. v_pp2k->KeybdPowerOn();
  144. fRet = TRUE;
  145. leave:
  146.     DEBUGMSG(ZONE_INIT, (_T("%s: Initialization completern"), pszFname));
  147. return fRet;
  148. }
  149. #ifdef DEBUG
  150. // Verify function declaration against the typedef.
  151. static PFN_KEYBD_PDD_ENTRY v_pfnKeybdEntry = Matrix_Entry;
  152. #endif