Feat: lab 3
This commit is contained in:
@@ -1,4 +1,6 @@
|
||||
#include <uart.h>
|
||||
#include <kmalloc.h>
|
||||
#include <interrupt.h>
|
||||
#include <logger.h>
|
||||
#include <errcode.h>
|
||||
#include <utils.h>
|
||||
@@ -87,11 +89,31 @@ void uart_transmit_interrupt_handler()
|
||||
_uart_write_data(ringbuffer_bump(uart_writebuf));
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
ringbuffer_t *buf;
|
||||
uint8_t val;
|
||||
} uart_interrupt_callback_payload_t;
|
||||
|
||||
static inline
|
||||
void uart_receive_interrupt_callback(uint64_t param)
|
||||
{
|
||||
uart_interrupt_callback_payload_t *payload = (void *)param;
|
||||
ringbuffer_push(payload->buf, payload->val);
|
||||
kfree(payload);
|
||||
}
|
||||
|
||||
void uart_receive_interrupt_handler()
|
||||
{
|
||||
if (uart_readbuf->size < uart_readbuf->cap) {
|
||||
uint8_t b = _uart_read_data();
|
||||
ringbuffer_push(uart_readbuf, b);
|
||||
|
||||
uart_interrupt_callback_payload_t *param = kmalloc(
|
||||
sizeof(uart_interrupt_callback_payload_t));
|
||||
*param = (uart_interrupt_callback_payload_t){
|
||||
.buf = uart_readbuf,
|
||||
.val = b,
|
||||
};
|
||||
add_interrupt_task(10, uart_receive_interrupt_callback, (uint64_t)param);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -139,7 +161,7 @@ size_t uart_getb_async(uint8_t *bytes, size_t len)
|
||||
size_t recvlen = 0;
|
||||
for (; recvlen < len; ++bytes, ++recvlen) {
|
||||
while (!uart_readbuf->size)
|
||||
asm volatile("wfe"); // wait for interrupt
|
||||
wfe(); // wait for interrupt
|
||||
*bytes = ringbuffer_bump(uart_readbuf);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user