|
10 | 10 | #define DTB_SIZE (1 * 1024 * 1024) |
11 | 11 | #define INITRD_SIZE (65 * 1024 * 1024) |
12 | 12 |
|
| 13 | +#define SCREEN_WIDTH 1024 |
| 14 | +#define SCREEN_HEIGHT 768 |
| 15 | + |
13 | 16 | void ram_read(hart_t *core, |
14 | 17 | uint32_t *mem, |
15 | 18 | const uint32_t addr, |
@@ -271,6 +274,64 @@ void virtio_gpu_add_scanout(virtio_gpu_state_t *vgpu, |
271 | 274 | uint32_t height); |
272 | 275 | #endif /* SEMU_HAS(VIRTIOGPU) */ |
273 | 276 |
|
| 277 | +/* VirtIO Input */ |
| 278 | + |
| 279 | +#if SEMU_HAS(VIRTIOINPUT) |
| 280 | + |
| 281 | +#define IRQ_VINPUT_KEYBOARD 6 |
| 282 | +#define IRQ_VINPUT_KEYBOARD_BIT (1 << IRQ_VINPUT_KEYBOARD) |
| 283 | + |
| 284 | +#define IRQ_VINPUT_MOUSE 7 |
| 285 | +#define IRQ_VINPUT_MOUSE_BIT (1 << IRQ_VINPUT_MOUSE) |
| 286 | + |
| 287 | +typedef struct { |
| 288 | + uint32_t QueueNum; |
| 289 | + uint32_t QueueDesc; |
| 290 | + uint32_t QueueAvail; |
| 291 | + uint32_t QueueUsed; |
| 292 | + uint16_t last_avail; |
| 293 | + bool ready; |
| 294 | +} virtio_input_queue_t; |
| 295 | + |
| 296 | +typedef struct { |
| 297 | + /* feature negotiation */ |
| 298 | + uint32_t DeviceFeaturesSel; |
| 299 | + uint32_t DriverFeatures; |
| 300 | + uint32_t DriverFeaturesSel; |
| 301 | + /* queue config */ |
| 302 | + uint32_t QueueSel; |
| 303 | + virtio_input_queue_t queues[2]; |
| 304 | + /* status */ |
| 305 | + uint32_t Status; |
| 306 | + uint32_t InterruptStatus; |
| 307 | + /* supplied by environment */ |
| 308 | + uint32_t *ram; |
| 309 | + /* implementation-specific */ |
| 310 | + int id; // FIXME |
| 311 | + void *priv; |
| 312 | +} virtio_input_state_t; |
| 313 | + |
| 314 | +void virtio_input_read(hart_t *vm, |
| 315 | + virtio_input_state_t *vinput, |
| 316 | + uint32_t addr, |
| 317 | + uint8_t width, |
| 318 | + uint32_t *value); |
| 319 | + |
| 320 | +void virtio_input_write(hart_t *vm, |
| 321 | + virtio_input_state_t *vinput, |
| 322 | + uint32_t addr, |
| 323 | + uint8_t width, |
| 324 | + uint32_t value); |
| 325 | + |
| 326 | +void virtio_input_init(virtio_input_state_t *vinput); |
| 327 | + |
| 328 | +void virtio_input_update_key(uint32_t key, uint32_t state); |
| 329 | + |
| 330 | +void virtio_input_update_mouse_button_state(uint32_t button, bool pressed); |
| 331 | + |
| 332 | +void virtio_input_update_cursor(uint32_t x, uint32_t y); |
| 333 | +#endif /* SEMU_HAS(VIRTIOINPUT) */ |
| 334 | + |
274 | 335 | /* ACLINT MTIMER */ |
275 | 336 | typedef struct { |
276 | 337 | /* A MTIMER device has two separate base addresses: one for the MTIME |
@@ -377,6 +438,10 @@ typedef struct { |
377 | 438 | #endif |
378 | 439 | #if SEMU_HAS(VIRTIOGPU) |
379 | 440 | virtio_gpu_state_t vgpu; |
| 441 | +#endif |
| 442 | +#if SEMU_HAS(VIRTIOINPUT) |
| 443 | + virtio_input_state_t vkeyboard; |
| 444 | + virtio_input_state_t vmouse; |
380 | 445 | #endif |
381 | 446 | /* ACLINT */ |
382 | 447 | mtimer_state_t mtimer; |
|
0 commit comments