VirtualBox

source: vbox/trunk/src/VBox/Devices/EFI/FirmwareNew/OvmfPkg/VirtioKeyboardDxe/VirtioKeyboard.h@ 108794

Last change on this file since 108794 was 108794, checked in by vboxsync, 2 weeks ago

Devices/EFI/FirmwareNew: Merge edk2-stable202502 from the vendor branch and make it build for the important platforms, bugref:4643

  • Property svn:eol-style set to native
File size: 6.1 KB
Line 
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
32typedef 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
40typedef struct {
41 UINT16 Type;
42 UINT16 Code;
43 UINT32 Value;
44} VIRTIO_KBD_EVENT;
45
46// Data structure representing ring buffer
47typedef 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
64typedef 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
128EFI_STATUS
129EFIAPI
130VirtioKeyboardSimpleTextInputReset (
131 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
132 IN BOOLEAN ExtendedVerification
133 );
134
135// -----------------------------------------------------------------------------
136// EFI_SIMPLE_TEXT_INPUT_PROTOCOL API
137EFI_STATUS
138EFIAPI
139VirtioKeyboardSimpleTextInputReadKeyStroke (
140 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
141 OUT EFI_INPUT_KEY *Key
142 );
143
144// -----------------------------------------------------------------------------
145// EFI_SIMPLE_TEXT_INPUT_PROTOCOL API
146VOID
147EFIAPI
148VirtioKeyboardWaitForKey (
149 IN EFI_EVENT Event,
150 IN VOID *Context
151 );
152
153// -----------------------------------------------------------------------------
154// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
155EFI_STATUS
156EFIAPI
157VirtioKeyboardResetEx (
158 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
159 IN BOOLEAN ExtendedVerification
160 );
161
162// -----------------------------------------------------------------------------
163// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
164EFI_STATUS
165EFIAPI
166VirtioKeyboardReadKeyStrokeEx (
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
173VOID
174EFIAPI
175VirtioKeyboardWaitForKeyEx (
176 IN EFI_EVENT Event,
177 IN VOID *Context
178 );
179
180// -----------------------------------------------------------------------------
181// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API
182EFI_STATUS
183EFIAPI
184VirtioKeyboardSetState (
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
191EFI_STATUS
192EFIAPI
193VirtioKeyboardRegisterKeyNotify (
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
202EFI_STATUS
203EFIAPI
204VirtioKeyboardUnregisterKeyNotify (
205 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
206 IN VOID *NotificationHandle
207 );
208
209#endif
Note: See TracBrowser for help on using the repository browser.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette