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;
44 int cdi_ioports_alloc(uint16_t start
, uint16_t count
)
52 int cdi_ioports_free(uint16_t start
, uint16_t count
)
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");