#include "bsp/uart.h" #include "bsp/mmio.h" #include "bsp/soc.h" #define UART_TXDATA (BSP_UART_BASE + 0x00u) #define UART_RXDATA (BSP_UART_BASE + 0x04u) #define UART_TXREADY (BSP_UART_BASE + 0x08u) #define UART_RXVALID (BSP_UART_BASE + 0x0cu) #define UART_CLOCKFREQ (BSP_UART_BASE + 0x10u) #define UART_BAUDRATE (BSP_UART_BASE + 0x14u) #define UART_DIVISOR (BSP_UART_BASE + 0x18u) void bsp_uart_putc(char c) { if (c == '\n') { bsp_uart_putc('\r'); } while ((bsp_read32(UART_TXREADY) & 1u) == 0u) { } bsp_write32(UART_TXDATA, (uint32_t)(uint8_t)c); } int bsp_uart_getc_nonblocking(void) { if ((bsp_read32(UART_RXVALID) & 1u) == 0u) { return -1; } return (int)(bsp_read32(UART_RXDATA) & 0xffu); } void bsp_uart_wait_tx_idle(void) { while ((bsp_read32(UART_TXREADY) & 1u) == 0u) { } } void bsp_uart_init_baudrate(uint32_t clock_hz, uint32_t baudrate) { if (clock_hz == 0u || baudrate == 0u) { return; } uint32_t divisor = (clock_hz + (baudrate / 2u)) / baudrate; if (divisor < 2u) { divisor = 2u; } bsp_uart_wait_tx_idle(); bsp_write32(UART_CLOCKFREQ, clock_hz); bsp_write32(UART_BAUDRATE, baudrate); bsp_write32(UART_DIVISOR, divisor); } uint32_t bsp_uart_clock_hz(void) { return bsp_read32(UART_CLOCKFREQ); } uint32_t bsp_uart_baudrate(void) { return bsp_read32(UART_BAUDRATE); } uint32_t bsp_uart_divisor(void) { return bsp_read32(UART_DIVISOR); }