[USB-BRINGUP-TRUNK]
[reactos.git] / lib / drivers / hidparser / api.c
index 45765f0..6c39d10 100644 (file)
 
 #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 @@ HidParser_GetScaledUsageValueWithReport(
     //
     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;
+}
\ No newline at end of file