API Reference
The NEORV32 RISC-V Processor
Loading...
Searching...
No Matches
neorv32_uart.h
Go to the documentation of this file.
1// ================================================================================ //
2// The NEORV32 RISC-V Processor - https://github.com/stnolting/neorv32 //
3// Copyright (c) NEORV32 contributors. //
4// Copyright (c) Stephan Nolting. All rights reserved. //
5// Licensed under the BSD-3-Clause license, see LICENSE for details. //
6// SPDX-License-Identifier: BSD-3-Clause //
7// ================================================================================ //
8
13
14#ifndef NEORV32_UART_H
15#define NEORV32_UART_H
16
17#include <neorv32.h>
18#include <stdint.h>
19#include <stdarg.h>
20
21/**********************************************************************/
26typedef volatile struct __attribute__((packed,aligned(4))) {
27 uint32_t CTRL;
28 uint32_t BAUD;
29 uint32_t DATA;
30 const uint32_t _rsv;
32
34#define NEORV32_UART0 ((neorv32_uart_t*) (NEORV32_UART0_BASE))
35
37#define NEORV32_UART1 ((neorv32_uart_t*) (NEORV32_UART1_BASE))
38
68
76
84
85
86/**********************************************************************/
91void neorv32_uart_setup(neorv32_uart_t *uartx, uint32_t baud, int rx_irq, int tx_irq);
92void neorv32_uart_putc(neorv32_uart_t *uartx, char c);
94void neorv32_uart_puts(neorv32_uart_t *uartx, const char *s);
95void neorv32_uart_vprintf(neorv32_uart_t *uartx, const char *format, va_list args);
96void neorv32_uart_printf(neorv32_uart_t *uartx, const char *format, ...);
97int neorv32_uart_scan(neorv32_uart_t *uartx, char *buffer, int max_size, int echo);
99
100
101/**********************************************************************/
106static inline int __attribute__((always_inline)) neorv32_uart_rx_fifo_depth(neorv32_uart_t *uartx) {
107 return (int)(1U << ((uartx->CTRL >> UART_CTRL_RX_FIFO_LSB) & 0x0fU));
108}
109
110/**********************************************************************/
115static inline int __attribute__((always_inline)) neorv32_uart_tx_fifo_depth(neorv32_uart_t *uartx) {
116 return (int)(1U <<((uartx->CTRL >> UART_CTRL_TX_FIFO_LSB) & 0x0fU));
117}
118
119/**********************************************************************/
124static inline int __attribute__((always_inline)) neorv32_uart_rx_irq(neorv32_uart_t *uartx) {
125 return (int)((uartx->CTRL >> UART_CTRL_RX_IRQ_PEND) & 1U);
126}
127
128/**********************************************************************/
133static inline int __attribute__((always_inline)) neorv32_uart_tx_irq(neorv32_uart_t *uartx) {
134 return (int)((uartx->CTRL >> UART_CTRL_TX_IRQ_PEND) & 1U);
135}
136
137/**********************************************************************/
142static inline int __attribute__((always_inline)) neorv32_uart_rx_avail(neorv32_uart_t *uartx) {
143 return (int)((~uartx->CTRL >> UART_CTRL_RX_EMPTY) & 1U);
144}
145
146/**********************************************************************/
151static inline int __attribute__((always_inline)) neorv32_uart_tx_full(neorv32_uart_t *uartx) {
152 return (int)((uartx->CTRL >> UART_CTRL_TX_FULL) & 1U);
153}
154
155/**********************************************************************/
160static inline int __attribute__((always_inline)) neorv32_uart_tx_busy(neorv32_uart_t *uartx) {
161 return (int)((uartx->CTRL >> UART_CTRL_TX_BUSY) & 1U);
162}
163
164/**********************************************************************/
169static inline void __attribute__((always_inline)) neorv32_uart_tx_put(neorv32_uart_t *uartx, char data) {
170 uartx->DATA = (uint32_t)data;
171}
172
173/**********************************************************************/
179static inline char __attribute__((always_inline)) neorv32_uart_rx_get(neorv32_uart_t *uartx) {
180 return (char)(uartx->DATA);
181}
182
183/**********************************************************************/
188static inline int __attribute__((always_inline)) neorv32_uart_rx_overflow(neorv32_uart_t *uartx) {
189 return (int)((uartx->CTRL >> UART_CTRL_RX_OVER) & 1U);
190}
191
192/**********************************************************************/
196#define neorv32_uart0_available() neorv32_uart_available(NEORV32_UART0)
197#define neorv32_uart0_setup(baud, rx_irq, tx_irq) neorv32_uart_setup(NEORV32_UART0, baud, rx_irq, tx_irq)
198#define neorv32_uart0_putc(c) neorv32_uart_putc(NEORV32_UART0, c)
199#define neorv32_uart0_getc() neorv32_uart_getc(NEORV32_UART0)
200#define neorv32_uart0_puts(s) neorv32_uart_puts(NEORV32_UART0, s)
201#define neorv32_uart0_printf(...) neorv32_uart_printf(NEORV32_UART0, __VA_ARGS__)
202#define neorv32_uart0_scan(buffer, max_size, echo) neorv32_uart_scan(NEORV32_UART0, buffer, max_size, echo)
203
204#define neorv32_uart1_available() neorv32_uart_available(NEORV32_UART1)
205#define neorv32_uart1_setup(baud, rx_irq, tx_irq) neorv32_uart_setup(NEORV32_UART1, baud, rx_irq, tx_irq)
206#define neorv32_uart1_putc(c) neorv32_uart_putc(NEORV32_UART1, c)
207#define neorv32_uart1_getc() neorv32_uart_getc(NEORV32_UART1)
208#define neorv32_uart1_puts(s) neorv32_uart_puts(NEORV32_UART1, s)
209#define neorv32_uart1_printf(...) neorv32_uart_printf(NEORV32_UART1, __VA_ARGS__)
210#define neorv32_uart1_scan(buffer, max_size, echo) neorv32_uart_scan(NEORV32_UART1, buffer, max_size, echo)
212
213#endif // NEORV32_UART_H
Main NEORV32 core library / driver / HAL include file.
NEORV32_UART_RX_IRQ_SEL_enum
Definition neorv32_uart.h:70
@ UART_RX_IRQ_FULL
Definition neorv32_uart.h:74
@ UART_RX_IRQ_NONE
Definition neorv32_uart.h:71
@ UART_RX_IRQ_HALF
Definition neorv32_uart.h:73
@ UART_RX_IRQ_AVAIL
Definition neorv32_uart.h:72
static void neorv32_uart_tx_put(neorv32_uart_t *uartx, char data)
Definition neorv32_uart.h:169
void neorv32_uart_vprintf(neorv32_uart_t *uartx, const char *format, va_list args)
Definition neorv32_uart.c:149
char neorv32_uart_getc(neorv32_uart_t *uartx)
Definition neorv32_uart.c:116
static int neorv32_uart_tx_irq(neorv32_uart_t *uartx)
Definition neorv32_uart.h:133
void neorv32_uart_setup(neorv32_uart_t *uartx, uint32_t baud, int rx_irq, int tx_irq)
Definition neorv32_uart.c:44
static int neorv32_uart_rx_fifo_depth(neorv32_uart_t *uartx)
Definition neorv32_uart.h:106
void neorv32_uart_puts(neorv32_uart_t *uartx, const char *s)
Definition neorv32_uart.c:129
int neorv32_uart_available(neorv32_uart_t *uartx)
Definition neorv32_uart.c:24
void neorv32_uart_printf(neorv32_uart_t *uartx, const char *format,...)
Definition neorv32_uart.c:243
static int neorv32_uart_rx_avail(neorv32_uart_t *uartx)
Definition neorv32_uart.h:142
static int neorv32_uart_tx_busy(neorv32_uart_t *uartx)
Definition neorv32_uart.h:160
static int neorv32_uart_tx_fifo_depth(neorv32_uart_t *uartx)
Definition neorv32_uart.h:115
void neorv32_uart_putc(neorv32_uart_t *uartx, char c)
Definition neorv32_uart.c:104
NEORV32_UART_TX_IRQ_SEL_enum
Definition neorv32_uart.h:78
@ UART_TX_IRQ_NONE
Definition neorv32_uart.h:79
@ UART_TX_IRQ_IDLE
Definition neorv32_uart.h:80
@ UART_TX_IRQ_NFULL
Definition neorv32_uart.h:82
@ UART_TX_IRQ_NHALF
Definition neorv32_uart.h:81
static char neorv32_uart_rx_get(neorv32_uart_t *uartx)
Definition neorv32_uart.h:179
static int neorv32_uart_rx_irq(neorv32_uart_t *uartx)
Definition neorv32_uart.h:124
static int neorv32_uart_rx_overflow(neorv32_uart_t *uartx)
Definition neorv32_uart.h:188
static int neorv32_uart_tx_full(neorv32_uart_t *uartx)
Definition neorv32_uart.h:151
NEORV32_UART_CTRL_enum
Definition neorv32_uart.h:40
@ UART_CTRL_RX_IRQ_SEL0
Definition neorv32_uart.h:56
@ UART_CTRL_TX_IRQ_SEL0
Definition neorv32_uart.h:58
@ UART_CTRL_TX_BUSY
Definition neorv32_uart.h:54
@ UART_CTRL_RX_FIFO_LSB
Definition neorv32_uart.h:63
@ UART_CTRL_TX_IRQ_PEND
Definition neorv32_uart.h:61
@ UART_CTRL_RX_IRQ_PEND
Definition neorv32_uart.h:60
@ UART_CTRL_TX_FULL
Definition neorv32_uart.h:53
@ UART_CTRL_TX_IRQ_SEL1
Definition neorv32_uart.h:59
@ UART_CTRL_RX_HALF
Definition neorv32_uart.h:48
@ UART_CTRL_RX_FULL
Definition neorv32_uart.h:49
@ UART_CTRL_TX_SIM_EN
Definition neorv32_uart.h:43
@ UART_CTRL_RX_IRQ_SEL1
Definition neorv32_uart.h:57
@ UART_CTRL_RTS_EN
Definition neorv32_uart.h:44
@ UART_CTRL_TX_FIFO_LSB
Definition neorv32_uart.h:65
@ UART_CTRL_TX_EN
Definition neorv32_uart.h:42
@ UART_CTRL_RX_OVER
Definition neorv32_uart.h:50
@ UART_CTRL_TX_HALF
Definition neorv32_uart.h:52
@ UART_CTRL_RX_FIFO_MSB
Definition neorv32_uart.h:64
@ UART_CTRL_RX_EN
Definition neorv32_uart.h:41
@ UART_CTRL_CTS_EN
Definition neorv32_uart.h:45
@ UART_CTRL_TX_EMPTY
Definition neorv32_uart.h:51
@ UART_CTRL_RX_EMPTY
Definition neorv32_uart.h:47
@ UART_CTRL_TX_FIFO_MSB
Definition neorv32_uart.h:66
int neorv32_uart_scan(neorv32_uart_t *uartx, char *buffer, int max_size, int echo)
Definition neorv32_uart.c:260
Definition neorv32_uart.h:26
uint32_t CTRL
Definition neorv32_uart.h:27
uint32_t DATA
Definition neorv32_uart.h:29
uint32_t BAUD
Definition neorv32_uart.h:28
const uint32_t _rsv
Definition neorv32_uart.h:30