69 lines
1.4 KiB
C
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);
|
|
}
|