Files
gps/soc/software/bsp/drivers/uart.c
T
2026-07-12 11:01:51 +03:00

69 lines
1.4 KiB
C

#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);
}