/** @file | |
Private definitions of the VirtioKeyboard driver | |
Copyright (C) 2024, Red Hat | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef _VIRTIO_KEYBOARD_DXE_H_ | |
#define _VIRTIO_KEYBOARD_DXE_H_ | |
#include <Protocol/ComponentName.h> | |
#include <Protocol/DriverBinding.h> | |
#include <Protocol/SimpleTextIn.h> | |
#include <Protocol/SimpleTextInEx.h> | |
#include <IndustryStandard/Virtio.h> | |
#define VIRTIO_KBD_SIG SIGNATURE_32 ('V', 'K', 'B', 'D') | |
#define KEYBOARD_MAX_RINGS 2 | |
#define KEYBOARD_RX_BUFSIZE 64 | |
// Fetch new key from VirtIO every 50ms | |
#define KEYBOARD_PROBE_TIME_MS 50 | |
// Max range of recognized keyboard codes | |
#define MAX_KEYBOARD_CODE 255 | |
typedef struct { | |
UINTN Signature; | |
EFI_KEY_DATA KeyData; | |
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn; | |
LIST_ENTRY NotifyEntry; | |
} VIRTIO_KBD_IN_EX_NOTIFY; | |
// Data structure representing payload delivered from VirtIo | |
typedef struct { | |
UINT16 Type; | |
UINT16 Code; | |
UINT32 Value; | |
} VIRTIO_KBD_EVENT; | |
// Data structure representing ring buffer | |
typedef struct { | |
VRING Ring; | |
VOID *RingMap; | |
DESC_INDICES Indices; /* Avail Ring */ | |
UINT16 LastUsedIdx; /* Used Ring */ | |
UINT32 BufferSize; | |
UINT32 BufferCount; | |
UINT32 BufferPages; | |
UINT8 *Buffers; | |
VOID *BufferMap; | |
EFI_PHYSICAL_ADDRESS DeviceAddress; | |
BOOLEAN Ready; | |
} VIRTIO_KBD_RING; | |
// Declaration of data structure representing driver context | |
typedef struct { | |
// Device signature | |
UINT32 Signature; | |
// Hook for the function which shall be caled when driver is closed | |
// before system state changes to boot | |
EFI_EVENT ExitBoot; | |
// Hooks for functions required by UEFI keyboard API | |
// struct _EFI_SIMPLE_TEXT_INPUT_PROTOCOL { | |
// EFI_INPUT_RESET Reset; | |
// EFI_INPUT_READ_KEY ReadKeyStroke; | |
// EFI_EVENT WaitForKey; | |
// }; | |
EFI_SIMPLE_TEXT_INPUT_PROTOCOL Txt; | |
// struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL { | |
// EFI_INPUT_RESET_EX Reset; | |
// EFI_INPUT_READ_KEY_EX ReadKeyStrokeEx; | |
// EFI_EVENT WaitForKeyEx; | |
// EFI_SET_STATE SetState; | |
// EFI_REGISTER_KEYSTROKE_NOTIFY RegisterKeyNotify; | |
// EFI_UNREGISTER_KEYSTROKE_NOTIFY UnregisterKeyNotify; | |
// } | |
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL TxtEx; | |
// Virtio device hook | |
VIRTIO_DEVICE_PROTOCOL *VirtIo; | |
// Hook for ring buffer | |
VIRTIO_KBD_RING Rings[KEYBOARD_MAX_RINGS]; | |
// Timer event for checking key presses from VirtIo | |
EFI_EVENT KeyReadTimer; | |
// List for notifications | |
LIST_ENTRY NotifyList; | |
EFI_EVENT KeyNotifyTimer; | |
// Last pressed key | |
// typedef struct { | |
// UINT16 ScanCode; | |
// CHAR16 UnicodeChar; | |
// } EFI_INPUT_KEY; | |
EFI_INPUT_KEY LastKey; | |
// Key modifiers | |
BOOLEAN KeyActive[MAX_KEYBOARD_CODE]; | |
// If key is ready | |
BOOLEAN KeyReady; | |
} VIRTIO_KBD_DEV; | |
// Helper functions to extract VIRTIO_KBD_DEV structure pointers | |
#define VIRTIO_KEYBOARD_FROM_THIS(KbrPointer) \ | |
CR (KbrPointer, VIRTIO_KBD_DEV, Txt, VIRTIO_KBD_SIG) | |
#define VIRTIO_KEYBOARD_EX_FROM_THIS(KbrPointer) \ | |
CR (KbrPointer, VIRTIO_KBD_DEV, TxtEx, VIRTIO_KBD_SIG) | |
// Bellow candidates to be included as Linux header | |
#define KEY_PRESSED 1 | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_PROTOCOL API | |
EFI_STATUS | |
EFIAPI | |
VirtioKeyboardSimpleTextInputReset ( | |
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, | |
IN BOOLEAN ExtendedVerification | |
); | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_PROTOCOL API | |
EFI_STATUS | |
EFIAPI | |
VirtioKeyboardSimpleTextInputReadKeyStroke ( | |
IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, | |
OUT EFI_INPUT_KEY *Key | |
); | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_PROTOCOL API | |
VOID | |
EFIAPI | |
VirtioKeyboardWaitForKey ( | |
IN EFI_EVENT Event, | |
IN VOID *Context | |
); | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API | |
EFI_STATUS | |
EFIAPI | |
VirtioKeyboardResetEx ( | |
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, | |
IN BOOLEAN ExtendedVerification | |
); | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API | |
EFI_STATUS | |
EFIAPI | |
VirtioKeyboardReadKeyStrokeEx ( | |
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, | |
OUT EFI_KEY_DATA *KeyData | |
); | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API | |
VOID | |
EFIAPI | |
VirtioKeyboardWaitForKeyEx ( | |
IN EFI_EVENT Event, | |
IN VOID *Context | |
); | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API | |
EFI_STATUS | |
EFIAPI | |
VirtioKeyboardSetState ( | |
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, | |
IN EFI_KEY_TOGGLE_STATE *KeyToggleState | |
); | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API | |
EFI_STATUS | |
EFIAPI | |
VirtioKeyboardRegisterKeyNotify ( | |
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, | |
IN EFI_KEY_DATA *KeyData, | |
IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction, | |
OUT VOID **NotifyHandle | |
); | |
// ----------------------------------------------------------------------------- | |
// EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL API | |
EFI_STATUS | |
EFIAPI | |
VirtioKeyboardUnregisterKeyNotify ( | |
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, | |
IN VOID *NotificationHandle | |
); | |
#endif |