Less aggressive colour change in the title
[snowy-minesweeper.git] / cdi / cdi-misc.c
blobd1061d6ea364c7a6ab00a6c07f84b6cf3f10bd3d
1 #include <stdbool.h>
2 #include <stdint.h>
3 #include <cdi.h>
4 #include <cdi/misc.h>
6 extern volatile uint64_t elapsed_milliseconds;
8 static bool irq_occured[16];
9 static void (*irq_handlers[16])(struct cdi_device *);
10 static struct cdi_device *irq_devices[16];
12 void cdi_try_handle_irq(int irq)
14 irq_occured[irq] = true;
16 if (irq_handlers[irq]) {
17 irq_handlers[irq](irq_devices[irq]);
21 void cdi_register_irq(uint8_t irq, void (*handler)(struct cdi_device *), struct cdi_device *device)
23 irq_handlers[irq] = handler;
24 irq_devices[irq] = device;
27 int cdi_wait_irq(uint8_t irq, uint32_t timeout)
29 uint64_t ems_start = elapsed_milliseconds;
31 while (!irq_occured[irq] && timeout > elapsed_milliseconds - ems_start) {
32 __asm__ __volatile__ ("hlt");
35 return irq_occured[irq] ? 0 : -1;
38 int cdi_reset_wait_irq(uint8_t irq)
40 irq_occured[irq] = false;
41 return 0;
44 int cdi_ioports_alloc(uint16_t start, uint16_t count)
46 (void)start;
47 (void)count;
49 return 0;
52 int cdi_ioports_free(uint16_t start, uint16_t count)
54 (void)start;
55 (void)count;
57 return 0;
60 void cdi_sleep_ms(uint32_t ms)
62 uint64_t ems_start = elapsed_milliseconds;
64 while (ms > elapsed_milliseconds - ems_start) {
65 __asm__ __volatile__ ("hlt");