mirror of
https://github.com/acidanthera/audk.git
synced 2025-07-31 01:24:12 +02:00
This is virtio based keyboard driver designed to be used on ARM platform. The driver implements basic and extended text input interface. UEFI shell requires only basic text input interface, but Grub needs extended text input to work on. Signed-off-by: Paweł Poławski <ppolawsk@redhat.com>
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
|