Skip to content

Commit e8ff1fa

Browse files
committed
Implement virtio-input devices
1 parent f72aba4 commit e8ff1fa

File tree

9 files changed

+1988
-12
lines changed

9 files changed

+1988
-12
lines changed

Makefile

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,16 @@ LDFLAGS += -lm
116116
# after git submodule.
117117
.DEFAULT_GOAL := all
118118

119+
# virtio-input
120+
ENABLE_VIRTIOINPUT ?= 1
121+
ifneq ($(UNAME_S),Linux)
122+
ENABLE_VIRTIOINPUT := 0
123+
endif
124+
$(call set-feature, VIRTIOINPUT)
125+
ifeq ($(call has, VIRTIOINPUT), 1)
126+
OBJS_EXTRA += virtio-input.o
127+
endif
128+
119129
# virtio-gpu
120130
ENABLE_VIRTIOGPU ?= 1
121131
ifneq ($(UNAME_S),Linux)

common.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
#include "feature.h"
44

5+
#define BITS_PER_CHAR 8
6+
#define BITS_PER_LONG (BITS_PER_CHAR * sizeof(long))
7+
58
#define unlikely(x) __builtin_expect((x), 0)
69
#define likely(x) __builtin_expect((x), 1)
710

@@ -17,6 +20,16 @@ static inline int ilog2(int x)
1720
return 31 - __builtin_clz(x | 1);
1821
}
1922

23+
static inline void set_bit(unsigned long bit, unsigned long *word)
24+
{
25+
*word |= (1 << bit);
26+
}
27+
28+
static inline void bitmap_set_bit(unsigned long *map, unsigned long bit)
29+
{
30+
set_bit(bit % BITS_PER_LONG, &map[bit / BITS_PER_LONG]);
31+
}
32+
2033
/* Range check
2134
* For any variable range checking:
2235
* if (x >= minx && x <= maxx) ...

device.h

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
#define DTB_SIZE (1 * 1024 * 1024)
1313
#define INITRD_SIZE (8 * 1024 * 1024)
1414

15+
#define SCREEN_WIDTH 1024
16+
#define SCREEN_HEIGHT 768
17+
1518
void ram_read(hart_t *core,
1619
uint32_t *mem,
1720
const uint32_t addr,
@@ -275,6 +278,64 @@ void virtio_gpu_add_scanout(virtio_gpu_state_t *vgpu,
275278
uint32_t height);
276279
#endif /* SEMU_HAS(VIRTIOGPU) */
277280

281+
/* VirtIO Input */
282+
283+
#if SEMU_HAS(VIRTIOINPUT)
284+
285+
#define IRQ_VINPUT_KEYBOARD 7
286+
#define IRQ_VINPUT_KEYBOARD_BIT (1 << IRQ_VINPUT_KEYBOARD)
287+
288+
#define IRQ_VINPUT_MOUSE 8
289+
#define IRQ_VINPUT_MOUSE_BIT (1 << IRQ_VINPUT_MOUSE)
290+
291+
typedef struct {
292+
uint32_t QueueNum;
293+
uint32_t QueueDesc;
294+
uint32_t QueueAvail;
295+
uint32_t QueueUsed;
296+
uint16_t last_avail;
297+
bool ready;
298+
} virtio_input_queue_t;
299+
300+
typedef struct {
301+
/* feature negotiation */
302+
uint32_t DeviceFeaturesSel;
303+
uint32_t DriverFeatures;
304+
uint32_t DriverFeaturesSel;
305+
/* queue config */
306+
uint32_t QueueSel;
307+
virtio_input_queue_t queues[2];
308+
/* status */
309+
uint32_t Status;
310+
uint32_t InterruptStatus;
311+
/* supplied by environment */
312+
uint32_t *ram;
313+
/* implementation-specific */
314+
int id; // FIXME
315+
void *priv;
316+
} virtio_input_state_t;
317+
318+
void virtio_input_read(hart_t *vm,
319+
virtio_input_state_t *vinput,
320+
uint32_t addr,
321+
uint8_t width,
322+
uint32_t *value);
323+
324+
void virtio_input_write(hart_t *vm,
325+
virtio_input_state_t *vinput,
326+
uint32_t addr,
327+
uint8_t width,
328+
uint32_t value);
329+
330+
void virtio_input_init(virtio_input_state_t *vinput);
331+
332+
void virtio_input_update_key(uint32_t key, uint32_t state);
333+
334+
void virtio_input_update_mouse_button_state(uint32_t button, bool pressed);
335+
336+
void virtio_input_update_cursor(uint32_t x, uint32_t y);
337+
#endif /* SEMU_HAS(VIRTIOINPUT) */
338+
278339
/* ACLINT MTIMER */
279340
typedef struct {
280341
/* A MTIMER device has two separate base addresses: one for the MTIME
@@ -430,6 +491,10 @@ typedef struct {
430491
#endif
431492
#if SEMU_HAS(VIRTIOGPU)
432493
virtio_gpu_state_t vgpu;
494+
#endif
495+
#if SEMU_HAS(VIRTIOINPUT)
496+
virtio_input_state_t vkeyboard;
497+
virtio_input_state_t vmouse;
433498
#endif
434499
/* ACLINT */
435500
mtimer_state_t mtimer;

feature.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,10 @@
2222
#define SEMU_FEATURE_VIRTIOGPU 1
2323
#endif
2424

25+
/* virtio-input */
26+
#ifndef SEMU_FEATURE_VIRTIOINPUT
27+
#define SEMU_FEATURE_VIRTIOINPUT 1
28+
#endif
29+
2530
/* Feature test macro */
2631
#define SEMU_HAS(x) SEMU_FEATURE_##x

0 commit comments

Comments
 (0)