1 | /** @file
|
---|
2 |
|
---|
3 | Private definitions of the VirtioKeyboard driver
|
---|
4 |
|
---|
5 | Copyright (C) 2024, Red Hat
|
---|
6 |
|
---|
7 | SPDX-License-Identifier: BSD-2-Clause-Patent
|
---|
8 |
|
---|
9 | **/
|
---|
10 |
|
---|
11 | #ifndef _VIRTIO_KEYBOARD_DXE_H_
|
---|
12 | #define _VIRTIO_KEYBOARD_DXE_H_
|
---|
13 |
|
---|
14 | #include <Protocol/ComponentName.h>
|
---|
15 | #include <Protocol/DriverBinding.h>
|
---|
16 | #include <Protocol/SimpleTextIn.h>
|
---|
17 | #include <Protocol/SimpleTextInEx.h>
|
---|
18 |
|
---|
19 | #include <IndustryStandard/Virtio.h>
|
---|
20 |
|
---|
21 | #define VIRTIO_KBD_SIG SIGNATURE_32 ('V', 'K', 'B', 'D')
|
---|
22 |
|
---|
23 | #define KEYBOARD_MAX_RINGS 2
|
---|
24 | #define KEYBOARD_RX_BUFSIZE 64
|
---|
25 |
|
---|
26 | // Fetch new key from VirtIO every 50ms
|
---|
27 | #define KEYBOARD_PROBE_TIME_MS 50
|
---|
28 |
|
---|
29 | // Max range of recognized keyboard codes
|
---|
30 | #define MAX_KEYBOARD_CODE 255
|
---|
31 |
|
---|
32 | typedef struct {
|
---|
33 | UINTN Signature;
|
---|
34 | EFI_KEY_DATA KeyData;
|
---|
35 | EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
---|
36 | LIST_ENTRY NotifyEntry;
|
---|
37 | } VIRTIO_KBD_IN_EX_NOTIFY;
|
---|
38 |
|
---|
39 | // Data structure representing payload delivered from VirtIo
|
---|
40 | typedef struct {
|
---|
41 | UINT16 Type;
|
---|
42 | UINT16 Code;
|
---|
43 | UINT32 Value;
|
---|
44 | } VIRTIO_KBD_EVENT;
|
---|
45 |
|
---|
46 | // Data structure representing ring buffer
|
---|
47 | typedef struct {
|
---|
48 | VRING Ring;
|
---|
49 | VOID *RingMap;
|
---|
50 | DESC_INDICES Indices; /* Avail Ring */
|
---|
51 | UINT16 LastUsedIdx; /* Used Ring */
|
---|
52 |
|
---|
53 | UINT32 BufferSize;
|
---|
54 | UINT32 BufferCount;
|
---|
55 | UINT32 BufferPages;
|
---|
56 | UINT8 *Buffers;
|
---|
57 | VOID *BufferMap;
|
---|
58 | EFI_PHYSICAL_ADDRESS DeviceAddress;
|
---|
59 |
|
---|
60 | BOOLEAN Ready;
|
---|
61 | } VIRTIO_KBD_RING;
|
---|
62 |
|
---|
63 | // Declaration of data structure representing driver context
|
---|
64 | typedef struct {
|
---|
65 | // Device signature
|
---|
66 | UINT32 Signature;
|
---|
67 |
|
---|
68 | // Hook for the function which shall be caled when driver is closed
|
---|
69 | // before system state changes to boot
|
---|
70 | EFI_EVENT ExitBoot;
|
---|
71 |
|
---|
72 | // Hooks for functions required by UEFI keyboard API
|
---|
73 | // struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL {
|
---|
74 | // EFI_INPUT_RESET Reset;
|
---|
75 | // EFI_INPUT_READ_KEY ReadKeyStroke;
|
---|
76 | // EFI_EVENT WaitForKey;
|
---|
77 | // };
|
---|
78 | EFI_SIMPLE_TEXT_INPUT_PROTOCOL Txt;
|
---|
79 |
|
---|
80 | // struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL {
|
---|
81 | // EFI_INPUT_RESET_EX Reset;
|
---|
82 | // EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx;
|
---|
83 | // EFI_EVENT WaitForKeyEx;
|
---|
84 | // EFI_SET_STATE SetState;
|
---|
85 | // EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify;
|
---|
86 | // EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify;
|
---|
87 | // }
|
---|
88 | EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL TxtEx;
|
---|
89 |
|
---|
90 | // Virtio device hook
|
---|
91 | VIRTIO_DEVICE_PROTOCOL *VirtIo;
|
---|
92 |
|
---|
93 | // Hook for ring buffer
|
---|
94 | VIRTIO_KBD_RING Rings[KEYBOARD_MAX_RINGS];
|
---|
95 |
|
---|
96 | // Timer event for checking key presses from VirtIo
|
---|
97 | EFI_EVENT KeyReadTimer;
|
---|
98 |
|
---|
99 | // List for notifications
|
---|
100 | LIST_ENTRY NotifyList;
|
---|
101 | EFI_EVENT KeyNotifyTimer;
|
---|
102 |
|
---|
103 | // Last pressed key
|
---|
104 | // typedef struct {
|
---|
105 | // UINT16 ScanCode;
|
---|
106 | // CHAR16 UnicodeChar;
|
---|
107 | // } EFI_INPUT_KEY;
|
---|
108 | EFI_INPUT_KEY LastKey;
|
---|
109 |
|
---|
110 | // Key modifiers
|
---|
111 | BOOLEAN KeyActive[MAX_KEYBOARD_CODE];
|
---|
112 |
|
---|
113 | // If key is ready
|
---|
114 | BOOLEAN KeyReady;
|
---|
115 | } VIRTIO_KBD_DEV;
|
---|
116 |
|
---|
117 | // Helper functions to extract VIRTIO_KBD_DEV structure pointers
|
---|
118 | #define VIRTIO_KEYBOARD_FROM_THIS(KbrPointer) \
|
---|
119 | CR (KbrPointer, VIRTIO_KBD_DEV, Txt, VIRTIO_KBD_SIG)
|
---|
120 | #define VIRTIO_KEYBOARD_EX_FROM_THIS(KbrPointer) \
|
---|
121 | CR (KbrPointer, VIRTIO_KBD_DEV, TxtEx, VIRTIO_KBD_SIG)
|
---|
122 |
|
---|
123 | // Bellow candidates to be included as Linux header
|
---|
124 | #define KEY_PRESSED 1
|
---|
125 |
|
---|
126 | // -----------------------------------------------------------------------------
|
---|
127 | // EFI_SIMPLE_TEXT_INPUT_PROTOCOL API
|
---|
128 | EFI_STATUS
|
---|
129 | EFIAPI
|
---|
130 | VirtioKeyboardSimpleTextInputReset (
|
---|
131 | IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
---|
132 | IN BOOLEAN ExtendedVerification
|
---|
133 | );
|
---|
134 |
|
---|
135 | // -----------------------------------------------------------------------------
|
---|
136 | // EFI_SIMPLE_TEXT_INPUT_PROTOCOL API
|
---|
137 | EFI_STATUS
|
---|
138 | EFIAPI
|
---|
139 | VirtioKeyboardSimpleTextInputReadKeyStroke (
|
---|
140 | IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
|
---|
141 | OUT EFI_INPUT_KEY *Key
|
---|
142 | );
|
---|
143 |
|
---|
144 | // -----------------------------------------------------------------------------
|
---|
145 | // EFI_SIMPLE_TEXT_INPUT_PROTOCOL API
|
---|
146 | VOID
|
---|
147 | EFIAPI
|
---|
148 | VirtioKeyboardWaitForKey (
|
---|
149 | IN EFI_EVENT Event,
|
---|
150 | IN VOID *Context
|
---|
151 | );
|
---|
152 |
|
---|
153 | // -----------------------------------------------------------------------------
|
---|
154 | // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
|
---|
155 | EFI_STATUS
|
---|
156 | EFIAPI
|
---|
157 | VirtioKeyboardResetEx (
|
---|
158 | IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
---|
159 | IN BOOLEAN ExtendedVerification
|
---|
160 | );
|
---|
161 |
|
---|
162 | // -----------------------------------------------------------------------------
|
---|
163 | // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
|
---|
164 | EFI_STATUS
|
---|
165 | EFIAPI
|
---|
166 | VirtioKeyboardReadKeyStrokeEx (
|
---|
167 | IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
---|
168 | OUT EFI_KEY_DATA *KeyData
|
---|
169 | );
|
---|
170 |
|
---|
171 | // -----------------------------------------------------------------------------
|
---|
172 | // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
|
---|
173 | VOID
|
---|
174 | EFIAPI
|
---|
175 | VirtioKeyboardWaitForKeyEx (
|
---|
176 | IN EFI_EVENT Event,
|
---|
177 | IN VOID *Context
|
---|
178 | );
|
---|
179 |
|
---|
180 | // -----------------------------------------------------------------------------
|
---|
181 | // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
|
---|
182 | EFI_STATUS
|
---|
183 | EFIAPI
|
---|
184 | VirtioKeyboardSetState (
|
---|
185 | IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
---|
186 | IN EFI_KEY_TOGGLE_STATE *KeyToggleState
|
---|
187 | );
|
---|
188 |
|
---|
189 | // -----------------------------------------------------------------------------
|
---|
190 | // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
|
---|
191 | EFI_STATUS
|
---|
192 | EFIAPI
|
---|
193 | VirtioKeyboardRegisterKeyNotify (
|
---|
194 | IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
---|
195 | IN EFI_KEY_DATA *KeyData,
|
---|
196 | IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
|
---|
197 | OUT VOID **NotifyHandle
|
---|
198 | );
|
---|
199 |
|
---|
200 | // -----------------------------------------------------------------------------
|
---|
201 | // EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
|
---|
202 | EFI_STATUS
|
---|
203 | EFIAPI
|
---|
204 | VirtioKeyboardUnregisterKeyNotify (
|
---|
205 | IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
---|
206 | IN VOID *NotificationHandle
|
---|
207 | );
|
---|
208 |
|
---|
209 | #endif
|
---|