5 #include "sw/device/silicon_creator/lib/drivers/uart.h"
10 #include "dt/dt_uart.h"
14 #include "sw/device/silicon_creator/lib/drivers/ibex.h"
15 #include "sw/device/silicon_creator/lib/error.h"
17 #include "uart_regs.h"
19 static const dt_uart_t kUartDt = kDtUart0;
24 static inline uint32_t uart_reg_base(
void) {
25 return dt_uart_reg_block(kUartDt, kDtUartRegBlockCore);
28 static void uart_reset(
void) {
29 abs_mmio_write32(uart_reg_base() + UART_CTRL_REG_OFFSET, 0u);
35 abs_mmio_write32(uart_reg_base() + UART_FIFO_CTRL_REG_OFFSET, reg);
37 abs_mmio_write32(uart_reg_base() + UART_OVRD_REG_OFFSET, 0u);
38 abs_mmio_write32(uart_reg_base() + UART_TIMEOUT_CTRL_REG_OFFSET, 0u);
39 abs_mmio_write32(uart_reg_base() + UART_INTR_ENABLE_REG_OFFSET, 0u);
40 abs_mmio_write32(uart_reg_base() + UART_INTR_STATE_REG_OFFSET, UINT32_MAX);
43 void uart_init(uint32_t precalculated_nco) {
52 abs_mmio_write32(uart_reg_base() + UART_CTRL_REG_OFFSET, reg);
55 abs_mmio_write32(uart_reg_base() + UART_INTR_ENABLE_REG_OFFSET, 0u);
58 void uart_enable_receiver(
void) {
59 uint32_t reg = abs_mmio_read32(uart_reg_base() + UART_CTRL_REG_OFFSET);
61 abs_mmio_write32(uart_reg_base() + UART_CTRL_REG_OFFSET, reg);
65 static bool uart_tx_full(
void) {
66 uint32_t reg = abs_mmio_read32(uart_reg_base() + UART_STATUS_REG_OFFSET);
71 static bool uart_rx_empty(
void) {
72 uint32_t reg = abs_mmio_read32(uart_reg_base() + UART_STATUS_REG_OFFSET);
76 bool uart_tx_idle(
void) {
77 uint32_t reg = abs_mmio_read32(uart_reg_base() + UART_STATUS_REG_OFFSET);
81 static void putchar_nonblocking(uint8_t
byte) {
83 while (uart_tx_full()) {
86 abs_mmio_write32(uart_reg_base() + UART_WDATA_REG_OFFSET, reg);
89 void uart_putchar(uint8_t
byte) {
90 putchar_nonblocking(
byte);
92 while (!uart_tx_idle()) {
96 int uart_getchar(uint32_t timeout_ms) {
98 size_t n = uart_read(&ch, 1, timeout_ms);
99 return n ? (int)ch : -1;
102 void uart_write(
const void *data,
size_t len) {
103 const uint8_t *d = (
const uint8_t *)data;
110 void uart_write_hex(uint32_t val,
size_t len, uint32_t after) {
111 HARDENED_CHECK_LE(len,
sizeof(uint32_t));
112 static const uint8_t kHexTable[16] =
"0123456789abcdef";
116 putchar_nonblocking(kHexTable[(val >> i) & 0xF]);
118 uart_write_imm(after);
121 void uart_write_imm(uint64_t imm) {
123 putchar_nonblocking(imm & 0xFF);
128 size_t uart_read(uint8_t *data,
size_t len, uint32_t timeout_ms) {
129 uint64_t time = ibex_mcycle();
130 uint64_t deadline = timeout_ms == UINT32_MAX
132 : time + ibex_time_to_cycles(timeout_ms * 1000);
135 for (n = 0; n < len; ++n) {
137 while (uart_rx_empty()) {
138 time = ibex_mcycle();
142 uint32_t reg = abs_mmio_read32(uart_reg_base() + UART_RDATA_REG_OFFSET);
143 *data++ = (uint8_t)reg;
149 uint64_t time = ibex_mcycle();
150 uint64_t deadline = time + ibex_time_to_cycles(timeout_us);
151 while (time < deadline) {
152 uint32_t val = abs_mmio_read32(uart_reg_base() + UART_VAL_REG_OFFSET);
155 time = ibex_mcycle();
160 size_t uart_sink(
void *uart,
const char *data,
size_t len) {
162 uart_write((
const uint8_t *)data, len);