The Pedigree Project 0.1
VirtioInput.h
1/* Copyright (c) 2026, Pedigree Developers. SPDX-License-Identifier: ISC */
2#ifndef VIRTIO_INPUT_H
3#define VIRTIO_INPUT_H
4
5#include "pedigree/kernel/machine/Device.h"
6#include "pedigree/kernel/machine/IrqHandler.h"
7#include "pedigree/kernel/process/Mutex.h"
8#include "pedigree/kernel/processor/MemoryRegion.h"
9
10#include "modules/drivers/common/virtio/VirtioPci.h"
11#include "modules/drivers/common/virtio/Virtqueue.h"
12
13class VirtioInputDevice final : public Device, public IrqHandler {
14 public:
15 explicit VirtioInputDevice(Device* pci);
16 ~VirtioInputDevice() override;
17
18 bool initialise();
19 IrqDisposition irq(irq_id_t number) override;
20
21 private:
22 static constexpr size_t MaxSlots = 64;
23 static constexpr uint32_t AbsoluteMaximum = 0x7fff;
24
25 enum DeviceType { Keyboard, Mouse, Tablet };
26
27 struct Event {
28 uint16_t type;
29 uint16_t code;
30 uint32_t value;
31 };
32 static_assert(sizeof(Event) == 8, "unexpected virtio input event size");
33
34 struct Slot {
35 Event* data;
36 physical_uintptr_t physical;
37 };
38
39 bool supportsEvent(uint8_t type, uint16_t code, bool& supported);
40 bool readAxis(uint8_t axis, int32_t& minimum, int32_t& maximum);
41 bool postReceive(Slot& slot);
42 void handle(const Event& event);
43 void reportPointer();
44 uint32_t scaleAxis(int32_t value, unsigned axis) const;
45
46 Device* m_Pci;
47 Virtio::PciTransport m_Transport;
48 Virtio::Queue m_EventQueue;
49 Virtio::Queue m_StatusQueue;
50 MemoryRegion m_Events;
51 Mutex m_Lock;
52 Slot m_Slots[MaxSlots];
53 size_t m_SlotCount;
54 irq_id_t m_Irq;
55 DeviceType m_Type;
56 int32_t m_AbsMinimum[2];
57 int32_t m_AbsMaximum[2];
58 uint32_t m_AbsPosition[2];
59 ssize_t m_Relative[3];
60 uint32_t m_Buttons;
61 bool m_KeyDown[256];
62 bool m_PointerChanged;
63 bool m_Active;
64 bool m_Stopping;
65
66 VirtioInputDevice(const VirtioInputDevice&) = delete;
67 VirtioInputDevice& operator=(const VirtioInputDevice&) = delete;
68};
69
70#endif
Special memory entity in the kernel's virtual address space.
Definition Mutex.h:56
IrqDisposition irq(irq_id_t number) override
IrqDisposition
Definition IrqHandler.h:31