[ros-diffs] [janderwald] 54858: [USB-BRINGUP] - Partly implement HidP_TranslateUsageAndPagesToI8042ScanCodes - Needs key modifier state function to work correctly - KBDHID should now receive translated keys (w...

janderwald at svn.reactos.org janderwald at svn.reactos.org
Sat Jan 7 10:24:12 UTC 2012


Author: janderwald
Date: Sat Jan  7 10:24:10 2012
New Revision: 54858

URL: http://svn.reactos.org/svn/reactos?rev=54858&view=rev
Log:
[USB-BRINGUP]
- Partly implement HidP_TranslateUsageAndPagesToI8042ScanCodes
- Needs key modifier state function to work correctly
- KBDHID should now receive translated keys (without key modifiers)

Modified:
    branches/usb-bringup/drivers/hid/hidparse/hidparse.c
    branches/usb-bringup/lib/drivers/hidparser/api.c
    branches/usb-bringup/lib/drivers/hidparser/hidparser.c
    branches/usb-bringup/lib/drivers/hidparser/hidparser.h

Modified: branches/usb-bringup/drivers/hid/hidparse/hidparse.c
URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/drivers/hid/hidparse/hidparse.c?rev=54858&r1=54857&r2=54858&view=diff
==============================================================================
--- branches/usb-bringup/drivers/hid/hidparse/hidparse.c [iso-8859-1] (original)
+++ branches/usb-bringup/drivers/hid/hidparse/hidparse.c [iso-8859-1] Sat Jan  7 10:24:10 2012
@@ -322,6 +322,37 @@
 HIDAPI
 NTSTATUS
 NTAPI
+HidP_TranslateUsageAndPagesToI8042ScanCodes(
+   IN PUSAGE_AND_PAGE  ChangedUsageList,
+   IN ULONG  UsageListLength,
+   IN HIDP_KEYBOARD_DIRECTION  KeyAction,
+   IN OUT PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
+   IN PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
+   IN PVOID  InsertCodesContext)
+{
+    HID_PARSER Parser;
+
+    //
+    // sanity check
+    //
+    ASSERT(ReportType == HidP_Input || ReportType == HidP_Output || ReportType == HidP_Feature);
+
+    //
+    // init parser
+    //
+    HidParser_InitParser(AllocFunction, FreeFunction, ZeroFunction, CopyFunction, DebugFunction, NULL, &Parser);
+
+    //
+    // translate usage pages
+    //
+    return HidParser_TranslateUsageAndPagesToI8042ScanCodes(Parser, UsageListLength, KeyAction, ModifierState, InsertCodesProcedure, InsertCodesContext);
+}
+
+
+
+HIDAPI
+NTSTATUS
+NTAPI
 HidP_GetButtonCaps(
     HIDP_REPORT_TYPE ReportType,
     PHIDP_BUTTON_CAPS ButtonCaps,
@@ -491,22 +522,6 @@
 HIDAPI
 NTSTATUS
 NTAPI
-HidP_TranslateUsageAndPagesToI8042ScanCodes(
-   IN PUSAGE_AND_PAGE  ChangedUsageList,
-   IN ULONG  UsageListLength,
-   IN HIDP_KEYBOARD_DIRECTION  KeyAction,
-   IN OUT PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
-   IN PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
-   IN PVOID  InsertCodesContext)
-{
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-HIDAPI
-NTSTATUS
-NTAPI
 HidP_SetUsages(
   IN HIDP_REPORT_TYPE  ReportType,
   IN USAGE  UsagePage,

Modified: branches/usb-bringup/lib/drivers/hidparser/api.c
URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/lib/drivers/hidparser/api.c?rev=54858&r1=54857&r2=54858&view=diff
==============================================================================
--- branches/usb-bringup/lib/drivers/hidparser/api.c [iso-8859-1] (original)
+++ branches/usb-bringup/lib/drivers/hidparser/api.c [iso-8859-1] Sat Jan  7 10:24:10 2012
@@ -11,6 +11,27 @@
 
 #include "parser.h"
 
+static ULONG KeyboardScanCodes[256] =
+{
+    0,  0,  0,  0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
+    50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44,  2,  3,
+    4,  5,  6,  7,  8,  9, 10, 11, 28,  1, 14, 15, 57, 12, 13, 26,
+    27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
+    65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
+    105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
+    72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
+    191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
+    115,114,  0,  0,  0,121,  0, 89, 93,124, 92, 94, 95,  0,  0,  0,
+    122,123, 90, 91, 85,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+    29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
+    150,158,159,128,136,177,178,176,142,152,173,140
+};
+
+
 
 ULONG
 HidParser_NumberOfTopCollections(
@@ -951,3 +972,106 @@
     //
     return HIDPARSER_STATUS_USAGE_NOT_FOUND;
 }
+
+ULONG
+HidParser_GetScanCode(
+    IN USAGE Usage)
+{
+    if (Usage < sizeof(KeyboardScanCodes) / sizeof(KeyboardScanCodes[0]))
+    {
+        //
+        // valid usage
+        //
+        return KeyboardScanCodes[Usage];
+    }
+
+    //
+    // invalid usage
+    //
+    return 0;
+}
+
+VOID
+HidParser_DispatchKey(
+    IN PCHAR ScanCodes,
+    IN HIDP_KEYBOARD_DIRECTION KeyAction,
+    IN PHIDP_INSERT_SCANCODES InsertCodesProcedure,
+    IN PVOID InsertCodesContext)
+{
+    ULONG Index;
+    ULONG Length = 0;
+
+    //
+    // count code length
+    //
+    for(Index = 0; Index < sizeof(ULONG); Index++)
+    {
+        if (ScanCodes[Index] == 0)
+        {
+            //
+            // last scan code
+            //
+            break;
+        }
+
+        //
+        // is this a key break
+        //
+        if (KeyAction == HidP_KeyboardBreak)
+        {
+            //
+            // add break
+            //
+            ScanCodes[Index] |= KEY_BREAK;
+        }
+
+        //
+        // more scan counts
+        //
+        Length++;
+    }
+
+    if (Length > 0)
+    {
+         //
+         // dispatch scan codes
+         //
+         InsertCodesProcedure(InsertCodesContext, ScanCodes, Length);
+    }
+}
+
+
+HIDPARSER_STATUS
+HidParser_TranslateUsage(
+    IN PHID_PARSER Parser,
+    IN USAGE Usage,
+    IN HIDP_KEYBOARD_DIRECTION  KeyAction,
+    IN OUT PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
+    IN PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
+    IN PVOID  InsertCodesContext)
+{
+    ULONG ScanCode;
+
+    //
+    // get scan code
+    //
+    ScanCode = HidParser_GetScanCode(Usage);
+    if (!ScanCode)
+    {
+        //
+        // invalid lookup or no scan code available
+        //
+        return HIDPARSER_STATUS_I8042_TRANS_UNKNOWN;
+    }
+
+    //
+    // FIXME: translate modifier states
+    //
+
+    HidParser_DispatchKey((PCHAR)&ScanCode, KeyAction, InsertCodesProcedure, InsertCodesContext);
+
+    //
+    // done
+    //
+    return HIDPARSER_STATUS_SUCCESS;
+}

Modified: branches/usb-bringup/lib/drivers/hidparser/hidparser.c
URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/lib/drivers/hidparser/hidparser.c?rev=54858&r1=54857&r2=54858&view=diff
==============================================================================
--- branches/usb-bringup/lib/drivers/hidparser/hidparser.c [iso-8859-1] (original)
+++ branches/usb-bringup/lib/drivers/hidparser/hidparser.c [iso-8859-1] Sat Jan  7 10:24:10 2012
@@ -14,8 +14,29 @@
 TranslateHidParserStatus(
     IN HIDPARSER_STATUS Status)
 {
-    UNIMPLEMENTED
-    return STATUS_NOT_IMPLEMENTED;
+    switch(Status)
+    {
+        case HIDPARSER_STATUS_INSUFFICIENT_RESOURCES:
+             return HIDP_STATUS_INTERNAL_ERROR;
+        case HIDPARSER_STATUS_NOT_IMPLEMENTED:
+            return HIDP_STATUS_NOT_IMPLEMENTED;
+        case HIDPARSER_STATUS_REPORT_NOT_FOUND:
+            return HIDP_STATUS_REPORT_DOES_NOT_EXIST;
+        case HIDPARSER_STATUS_INVALID_REPORT_LENGTH:
+            return HIDP_STATUS_INVALID_REPORT_LENGTH;
+        case HIDPARSER_STATUS_INVALID_REPORT_TYPE:
+            return HIDP_STATUS_INVALID_REPORT_TYPE;
+        case HIDPARSER_STATUS_BUFFER_TOO_SMALL:
+            return HIDP_STATUS_BUFFER_TOO_SMALL;
+        case HIDPARSER_STATUS_USAGE_NOT_FOUND:
+            return HIDP_STATUS_USAGE_NOT_FOUND;
+        case HIDPARSER_STATUS_I8042_TRANS_UNKNOWN:
+            return HIDP_STATUS_I8042_TRANS_UNKNOWN;
+        case HIDPARSER_STATUS_COLLECTION_NOT_FOUND:
+            return HIDP_STATUS_NOT_IMPLEMENTED; //FIXME
+    }
+    DPRINT1("TranslateHidParserStatus Status %ld not implemented\n", Status);
+    return HIDP_STATUS_NOT_IMPLEMENTED;
 }
 
 NTSTATUS
@@ -631,6 +652,77 @@
     //
     return TranslateHidParserStatus(ParserStatus);
 }
+
+HIDAPI
+NTSTATUS
+NTAPI
+HidParser_TranslateUsageAndPagesToI8042ScanCodes(
+   IN PHID_PARSER Parser,
+   IN PUSAGE_AND_PAGE  ChangedUsageList,
+   IN ULONG  UsageListLength,
+   IN HIDP_KEYBOARD_DIRECTION  KeyAction,
+   IN OUT PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
+   IN PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
+   IN PVOID  InsertCodesContext)
+{
+    ULONG Index;
+    HIDPARSER_STATUS Status = HIDPARSER_STATUS_SUCCESS;
+
+    for(Index = 0; Index < UsageListLength; Index++)
+    {
+        //
+        // check current usage
+        //
+        if (ChangedUsageList[Index].UsagePage == HID_USAGE_PAGE_KEYBOARD)
+        {
+            //
+            // process usage
+            //
+            Status = HidParser_TranslateUsage(Parser, ChangedUsageList[Index].Usage, KeyAction, ModifierState, InsertCodesProcedure, InsertCodesContext);
+        }
+        else if (ChangedUsageList[Index].UsagePage == HID_USAGE_PAGE_CONSUMER)
+        {
+            //
+            // FIXME: implement me
+            //
+            UNIMPLEMENTED
+            Status = HIDPARSER_STATUS_NOT_IMPLEMENTED;
+        }
+        else
+        {
+            //
+            // invalid page
+            //
+            DPRINT1("[HIDPARSE] Error unexpected usage page %x\n", ChangedUsageList[Index].UsagePage);
+            return HIDP_STATUS_I8042_TRANS_UNKNOWN;
+        }
+
+        //
+        // check status
+        //
+        if (Status != HIDPARSER_STATUS_SUCCESS)
+        {
+            //
+            // failed
+            //
+            return TranslateHidParserStatus(Status);
+        }
+    }
+
+    if (Status != HIDPARSER_STATUS_SUCCESS)
+    {
+        //
+        // failed
+        //
+        return TranslateHidParserStatus(Status);
+    }
+
+    //
+    // done
+    //
+    return HIDP_STATUS_SUCCESS;
+}
+
 
 HIDAPI
 NTSTATUS
@@ -937,22 +1029,6 @@
 HIDAPI
 NTSTATUS
 NTAPI
-HidParser_TranslateUsageAndPagesToI8042ScanCodes(
-   IN PUSAGE_AND_PAGE  ChangedUsageList,
-   IN ULONG  UsageListLength,
-   IN HIDP_KEYBOARD_DIRECTION  KeyAction,
-   IN OUT PHIDP_KEYBOARD_MODIFIER_STATE  ModifierState,
-   IN PHIDP_INSERT_SCANCODES  InsertCodesProcedure,
-   IN PVOID  InsertCodesContext)
-{
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
-}
-
-HIDAPI
-NTSTATUS
-NTAPI
 HidParser_SetUsages(
   IN HIDP_REPORT_TYPE  ReportType,
   IN USAGE  UsagePage,

Modified: branches/usb-bringup/lib/drivers/hidparser/hidparser.h
URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup/lib/drivers/hidparser/hidparser.h?rev=54858&r1=54857&r2=54858&view=diff
==============================================================================
--- branches/usb-bringup/lib/drivers/hidparser/hidparser.h [iso-8859-1] (original)
+++ branches/usb-bringup/lib/drivers/hidparser/hidparser.h [iso-8859-1] Sat Jan  7 10:24:10 2012
@@ -44,7 +44,8 @@
     HIDPARSER_STATUS_INVALID_REPORT_LENGTH = -5,
     HIDPARSER_STATUS_INVALID_REPORT_TYPE = -6,
     HIDPARSER_STATUS_BUFFER_TOO_SMALL = -7,
-    HIDPARSER_STATUS_USAGE_NOT_FOUND = 8
+    HIDPARSER_STATUS_USAGE_NOT_FOUND = -8,
+    HIDPARSER_STATUS_I8042_TRANS_UNKNOWN = -9
 }HIDPARSER_STATUS_CODES;
 
 typedef struct




More information about the Ros-diffs mailing list