mirror of https://github.com/acidanthera/audk.git
210 lines
6.3 KiB
C
210 lines
6.3 KiB
C
/** @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
|