Feat: gura!!!

This commit is contained in:
2025-05-03 22:29:36 +08:00
parent e73f90395d
commit 8d1045f20d
6 changed files with 41 additions and 168 deletions

View File

@@ -8,6 +8,7 @@
#include <gpio.h>
#include <stddef.h>
#include <ringbuffer.h>
#include <thread.h>
/* Auxilary mini UART registers */
#define AUX_ENABLE ((volatile uint32_t*)(MMIO_BASE + 0x00215004))
@@ -81,8 +82,8 @@ void uart_init(void)
_uart_enable_transmit_interrupt(false);
// uint64_t ier = *AUX_MU_IER;
// uart_getb = uart_getb_async;
// uart_putb = uart_putb_async;
uart_getb = uart_getb_async;
uart_putb = uart_putb_async;
is_uart_inited = true;
}
@@ -145,11 +146,12 @@ void uart_irq_handler(void)
size_t uart_putb_async(const uint8_t *bytes, size_t len)
{
size_t sentlen = 0;
for (; sentlen < len; ++bytes, ++sentlen)
ringbuffer_push(uart_writebuf, *bytes);
if (!is_uart_in_interrupt_queue && uart_writebuf)
_enable_uart_interrupt();
for (; sentlen < len; ++bytes, ++sentlen) {
while(!_uart_transmitter_idle())
yield();
_uart_write_data(*bytes);
}
return sentlen;
}
@@ -171,10 +173,10 @@ size_t uart_getb_async(uint8_t *bytes, size_t len)
{
size_t recvlen = 0;
for (; recvlen < len; ++bytes, ++recvlen) {
while (!uart_readbuf->size)
wfe(); // wait for interrupt
*bytes = ringbuffer_bump(uart_readbuf);
while (!_uart_data_ready())
yield();
*bytes = _uart_read_data();
}
return recvlen;