OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
AIKTranslate.c
Go to the documentation of this file.
1
15#include "AIKTranslate.h"
16
17#include <Library/DebugLib.h>
18
19STATIC
21
22STATIC
23VOID
25 IN AMI_EFI_KEY_DATA *KeyData,
26 OUT APPLE_MODIFIER_MAP *Modifiers
27 )
28{
29 UINT32 KeyShiftState;
30
31 KeyShiftState = KeyData->KeyState.KeyShiftState;
32
33 *Modifiers = 0;
34
35 //
36 // Handle EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL Shift support, which is not included
37 // in KeyShiftState on APTIO and VMware.
38 // UPD: Recent APTIO V also does not include it in its own protocol.
39 //
40 if ((KeyShiftState & EFI_SHIFT_STATE_VALID) && (KeyData->Key.UnicodeChar < AIK_MAX_EFIKEY_NUM)) {
41 KeyShiftState |= gAikAsciiToUsbMap[KeyData->Key.UnicodeChar].ShiftState;
42 }
43
44 //
45 // Handle legacy EFI_SIMPLE_TEXT_INPUT_PROTOCOL by guessing from EfiKey
46 //
47 if ( ((KeyShiftState & EFI_SHIFT_STATE_VALID) != EFI_SHIFT_STATE_VALID)
48 && (KeyData->Key.UnicodeChar < AIK_MAX_EFIKEY_NUM))
49 {
50 KeyShiftState = gAikAsciiToUsbMap[KeyData->Key.UnicodeChar].ShiftState;
51 }
52
53 if (KeyShiftState & EFI_SHIFT_STATE_VALID) {
54 if (KeyShiftState & EFI_RIGHT_SHIFT_PRESSED) {
55 *Modifiers |= mModifierRemap[AIK_RIGHT_SHIFT];
56 }
57
58 if (KeyShiftState & EFI_LEFT_SHIFT_PRESSED) {
59 *Modifiers |= mModifierRemap[AIK_LEFT_SHIFT];
60 }
61
62 if (KeyShiftState & EFI_RIGHT_CONTROL_PRESSED) {
63 *Modifiers |= mModifierRemap[AIK_RIGHT_CONTROL];
64 }
65
66 if (KeyShiftState & EFI_LEFT_CONTROL_PRESSED) {
67 *Modifiers |= mModifierRemap[AIK_LEFT_CONTROL];
68 }
69
70 if (KeyShiftState & EFI_RIGHT_ALT_PRESSED) {
71 *Modifiers |= mModifierRemap[AIK_RIGHT_ALT];
72 }
73
74 if (KeyShiftState & EFI_LEFT_ALT_PRESSED) {
75 *Modifiers |= mModifierRemap[AIK_LEFT_ALT];
76 }
77
78 if (KeyShiftState & EFI_RIGHT_LOGO_PRESSED) {
79 *Modifiers |= mModifierRemap[AIK_RIGHT_GUI];
80 }
81
82 if (KeyShiftState & EFI_LEFT_LOGO_PRESSED) {
83 *Modifiers |= mModifierRemap[AIK_LEFT_GUI];
84 }
85 }
86}
87
88STATIC
89VOID
91 IN OUT UINT8 *UsbKey,
92 IN EFI_KEY EfiKey
93 )
94{
95 switch (EfiKey) {
96 case EfiKeyZero:
98 break;
99 case EfiKeyOne:
100 *UsbKey = UsbHidUsageIdKbKpKeyOne;
101 break;
102 case EfiKeyTwo:
103 *UsbKey = UsbHidUsageIdKbKpKeyTwo;
104 break;
105 case EfiKeyThree:
107 break;
108 case EfiKeyFour:
109 *UsbKey = UsbHidUsageIdKbKpKeyFour;
110 break;
111 case EfiKeyFive:
112 *UsbKey = UsbHidUsageIdKbKpKeyFive;
113 break;
114 case EfiKeySix:
115 *UsbKey = UsbHidUsageIdKbKpKeySix;
116 break;
117 case EfiKeySeven:
119 break;
120 case EfiKeyEight:
122 break;
123 case EfiKeyNine:
124 *UsbKey = UsbHidUsageIdKbKpKeyNine;
125 break;
126 default:
127 break;
128 }
129}
130
131VOID
133 IN BOOLEAN KeySwap
134 )
135{
136 UINTN Index;
137 CONST APPLE_MODIFIER_MAP DefaultModifierMap[AIK_MODIFIER_MAX] = {
146 };
147
148 UINTN DefaultModifierConfig[AIK_MODIFIER_MAX / 2];
149
150 DefaultModifierConfig[0] = AIK_RIGHT_SHIFT;
151 DefaultModifierConfig[1] = AIK_RIGHT_CONTROL;
152 if (!KeySwap) {
153 DefaultModifierConfig[2] = AIK_RIGHT_ALT;
154 DefaultModifierConfig[3] = AIK_RIGHT_GUI;
155 } else {
156 DefaultModifierConfig[2] = AIK_RIGHT_GUI;
157 DefaultModifierConfig[3] = AIK_RIGHT_ALT;
158 }
159
160 for (Index = 0; Index < AIK_MODIFIER_MAX/2; Index++) {
161 mModifierRemap[Index*2] = DefaultModifierMap[DefaultModifierConfig[Index]];
162 mModifierRemap[Index*2+1] = DefaultModifierMap[DefaultModifierConfig[Index]+1];
163 }
164}
165
166VOID
168 IN AMI_EFI_KEY_DATA *KeyData,
169 OUT APPLE_MODIFIER_MAP *Modifiers,
170 OUT APPLE_KEY_CODE *Key
171 )
172{
173 AIK_PS2KEY_TO_USB Ps2Key;
174
175 AIKTranslateModifiers (KeyData, Modifiers);
176
177 *Key = UsbHidUndefined;
178
179 //
180 // Firstly check for APTIO protocol, which reported a PS/2 key to us.
181 // Otherwise try to decode UnicodeChar and Scancode from simple input.
182 //
183 if ((KeyData->PS2ScanCodeIsValid == 1) && (KeyData->PS2ScanCode < AIK_MAX_PS2KEY_NUM)) {
184 Ps2Key = gAikPs2KeyToUsbMap[KeyData->PS2ScanCode];
185 if (Ps2Key.UsbCode != UsbHidUndefined) {
186 //
187 // We need to process numpad keys separately.
188 //
189 AIKTranslateNumpad (&Ps2Key.UsbCode, KeyData->EfiKey);
190 *Key = APPLE_HID_USB_KB_KP_USAGE (Ps2Key.UsbCode);
191 }
192 } else if ( (KeyData->Key.UnicodeChar >= 0)
193 && (KeyData->Key.UnicodeChar < AIK_MAX_ASCII_NUM)
194 && (gAikAsciiToUsbMap[KeyData->Key.UnicodeChar].UsbCode != UsbHidUndefined))
195 {
196 *Key = APPLE_HID_USB_KB_KP_USAGE (gAikAsciiToUsbMap[KeyData->Key.UnicodeChar].UsbCode);
197 } else if ( (KeyData->Key.ScanCode < AIK_MAX_SCANCODE_NUM)
198 && (gAikScanCodeToUsbMap[KeyData->Key.ScanCode].UsbCode != UsbHidUndefined))
199 {
200 *Key = APPLE_HID_USB_KB_KP_USAGE (gAikScanCodeToUsbMap[KeyData->Key.ScanCode].UsbCode);
201 }
202
203 if (*Key != UsbHidUndefined) {
204 DEBUG ((
205 DEBUG_VERBOSE,
206 "\nAIKTranslate P1 MOD %a APPLE 0x%X (%a) PS2 0x%X Ps2Name %a\n",
207 AIK_MODIFIERS_TO_NAME (*Modifiers),
208 *Key,
210 KeyData->PS2ScanCode,
211 AIK_PS2KEY_TO_NAME (KeyData->PS2ScanCode, *Modifiers)
212 ));
213 DEBUG ((
214 DEBUG_VERBOSE,
215 "AIKTranslate P2 AsciiName %a ScanName %a EfiKey %a Scan 0x%X Uni 0x%X SState 0x%X\n",
216 AIK_ASCII_TO_NAME (KeyData->Key.UnicodeChar),
217 AIK_SCANCODE_TO_NAME (KeyData->Key.ScanCode),
218 AIK_EFIKEY_TO_NAME (KeyData->EfiKey),
219 KeyData->Key.ScanCode,
220 KeyData->Key.UnicodeChar,
221 KeyData->KeyState.KeyShiftState
222 ));
223 }
224}
AIK_SCANCODE_TO_USB gAikScanCodeToUsbMap[AIK_MAX_SCANCODE_NUM]
Definition AIKMap.c:1955
AIK_PS2KEY_TO_USB gAikPs2KeyToUsbMap[AIK_MAX_PS2KEY_NUM]
Definition AIKMap.c:23
AIK_ASCII_TO_USB gAikAsciiToUsbMap[AIK_MAX_ASCII_NUM]
Definition AIKMap.c:667
STATIC APPLE_MODIFIER_MAP mModifierRemap[AIK_MODIFIER_MAX]
STATIC VOID AIKTranslateModifiers(IN AMI_EFI_KEY_DATA *KeyData, OUT APPLE_MODIFIER_MAP *Modifiers)
VOID AIKTranslateConfigure(IN BOOLEAN KeySwap)
STATIC VOID AIKTranslateNumpad(IN OUT UINT8 *UsbKey, IN EFI_KEY EfiKey)
VOID AIKTranslate(IN AMI_EFI_KEY_DATA *KeyData, OUT APPLE_MODIFIER_MAP *Modifiers, OUT APPLE_KEY_CODE *Key)
#define AIK_MODIFIERS_TO_NAME(k)
#define AIK_APPLEKEY_TO_NAME(k)
#define AIK_MAX_ASCII_NUM
#define AIK_PS2KEY_TO_NAME(k, m)
#define AIK_EFIKEY_TO_NAME(k)
#define AIK_MAX_SCANCODE_NUM
#define AIK_MAX_PS2KEY_NUM
#define AIK_ASCII_TO_NAME(k)
#define AIK_SCANCODE_TO_NAME(k)
#define AIK_MAX_EFIKEY_NUM
@ AIK_LEFT_CONTROL
@ AIK_RIGHT_GUI
@ AIK_LEFT_ALT
@ AIK_RIGHT_SHIFT
@ AIK_MODIFIER_MAX
@ AIK_RIGHT_CONTROL
@ AIK_LEFT_SHIFT
@ AIK_RIGHT_ALT
@ AIK_LEFT_GUI
#define APPLE_HID_USB_KB_KP_USAGE(UsbHidUsageIdKbKp)
Definition AppleHid.h:21
APPLE_HID_USAGE APPLE_KEY_CODE
Definition AppleHid.h:317
UINT16 APPLE_MODIFIER_MAP
Definition AppleHid.h:102
#define USB_HID_KB_KP_MODIFIER_LEFT_CONTROL
Definition UsbHid.h:89
@ UsbHidUndefined
Definition UsbHid.h:26
#define USB_HID_KB_KP_MODIFIER_LEFT_SHIFT
Definition UsbHid.h:90
#define USB_HID_KB_KP_MODIFIER_RIGHT_ALT
Definition UsbHid.h:95
@ UsbHidUsageIdKbKpKeyEight
Definition UsbHid.h:159
@ UsbHidUsageIdKbKpKeyFour
Definition UsbHid.h:155
@ UsbHidUsageIdKbKpKeyFive
Definition UsbHid.h:156
@ UsbHidUsageIdKbKpKeyThree
Definition UsbHid.h:154
@ UsbHidUsageIdKbKpKeySix
Definition UsbHid.h:157
@ UsbHidUsageIdKbKpKeyZero
Definition UsbHid.h:161
@ UsbHidUsageIdKbKpKeyTwo
Definition UsbHid.h:153
@ UsbHidUsageIdKbKpKeyNine
Definition UsbHid.h:160
@ UsbHidUsageIdKbKpKeySeven
Definition UsbHid.h:158
@ UsbHidUsageIdKbKpKeyOne
Definition UsbHid.h:152
#define USB_HID_KB_KP_MODIFIER_RIGHT_GUI
Definition UsbHid.h:96
#define USB_HID_KB_KP_MODIFIER_LEFT_GUI
Definition UsbHid.h:92
#define USB_HID_KB_KP_MODIFIER_RIGHT_SHIFT
Definition UsbHid.h:94
#define USB_HID_KB_KP_MODIFIER_RIGHT_CONTROL
Definition UsbHid.h:93
#define USB_HID_KB_KP_MODIFIER_LEFT_ALT
Definition UsbHid.h:91