7#ifndef _HARDWARE_UART_H
8#define _HARDWARE_UART_H
11#include "hardware/structs/uart.h"
14#ifndef PARAM_ASSERTIONS_ENABLED_HARDWARE_UART
15#ifdef PARAM_ASSERTIONS_ENABLED_UART
16#define PARAM_ASSERTIONS_ENABLED_HARDWARE_UART PARAM_ASSERTIONS_ENABLED_UART
18#define PARAM_ASSERTIONS_ENABLED_HARDWARE_UART 0
27#ifndef PICO_UART_ENABLE_CRLF_SUPPORT
28#define PICO_UART_ENABLE_CRLF_SUPPORT 1
32#ifndef PICO_UART_DEFAULT_CRLF
33#define PICO_UART_DEFAULT_CRLF 0
41#ifndef PICO_DEFAULT_UART_BAUD_RATE
42#define PICO_DEFAULT_UART_BAUD_RATE 115200
77typedef struct uart_inst uart_inst_t;
86#define uart0 ((uart_inst_t *)uart0_hw)
87#define uart1 ((uart_inst_t *)uart1_hw)
97#if !defined(PICO_DEFAULT_UART_INSTANCE) && defined(PICO_DEFAULT_UART)
98#define PICO_DEFAULT_UART_INSTANCE() (__CONCAT(uart,PICO_DEFAULT_UART))
108#ifdef PICO_DEFAULT_UART_INSTANCE
109#define uart_default PICO_DEFAULT_UART_INSTANCE()
121static_assert(NUM_UARTS == 2,
"");
122#define UART_NUM(uart) ((uart) == uart1)
134static_assert(NUM_UARTS == 2,
"");
135#define UART_INSTANCE(num) ((num) ? uart1 : uart0)
148#include "hardware/regs/dreq.h"
152#define UART_DREQ_NUM(uart, is_tx) ({ \
153 DREQ_UART0_TX + UART_NUM(uart) * 2 + !(is_tx); \
165#ifndef UART_CLOCK_NUM
166#define UART_CLOCK_NUM(uart) clk_peri
177#ifndef UART_FUNCSEL_NUM
179#define UART_FUNCSEL_NUM(uart, gpio) GPIO_FUNC_UART
181#define UART_FUNCSEL_NUM(uart, gpio) ((gpio) & 0x2 ? GPIO_FUNC_UART_AUX : GPIO_FUNC_UART)
194#include "hardware/regs/intctrl.h"
196#define UART_IRQ_NUM(uart) (UART0_IRQ + UART_NUM(uart))
207#ifndef UART_RESET_NUM
209#define UART_RESET_NUM(uart) (uart_get_index(uart) ? RESET_UART1 : RESET_UART0)
219 invalid_params_if(HARDWARE_UART, uart !=
uart0 && uart !=
uart1);
230 invalid_params_if(HARDWARE_UART, num >= NUM_UARTS);
280uint
uart_init(uart_inst_t *uart, uint baudrate);
323 (bool_to_bit(cts) << UART_UARTCR_CTSEN_LSB) | (bool_to_bit(rts) << UART_UARTCR_RTSEN_LSB),
324 UART_UARTCR_RTSEN_BITS | UART_UARTCR_CTSEN_BITS);
365 uart_get_hw(uart)->imsc = (bool_to_bit(tx_needs_data) << UART_UARTIMSC_TXIM_LSB) |
366 (bool_to_bit(rx_has_data) << UART_UARTIMSC_RXIM_LSB) |
367 (bool_to_bit(rx_has_data) << UART_UARTIMSC_RTIM_LSB);
371 UART_UARTIFLS_RXIFLSEL_BITS);
376 UART_UARTIFLS_TXIFLSEL_BITS);
381static inline void uart_set_irq_enables(uart_inst_t *uart,
bool rx_has_data,
bool tx_needs_data) {
392 return uart_get_hw(uart)->cr & UART_UARTCR_UARTEN_BITS;
423 return !(
uart_get_hw(uart)->fr & UART_UARTFR_TXFF_BITS);
444 return !(
uart_get_hw(uart)->fr & UART_UARTFR_RXFE_BITS);
460 for (
size_t i = 0; i < len; ++i) {
477 for (
size_t i = 0; i < len; ++i) {
507static inline void uart_putc(uart_inst_t *uart,
char c) {
508#if PICO_UART_ENABLE_CRLF_SUPPORT
509 extern short uart_char_to_line_feed[NUM_UARTS];
524static inline void uart_puts(uart_inst_t *uart,
const char *s) {
525#if PICO_UART_ENABLE_CRLF_SUPPORT
526 bool last_was_cr =
false;
533 last_was_cr = *s++ ==
'\r';
612static inline uint uart_get_dreq(uart_inst_t *uart,
bool is_tx) {
static __force_inline void hw_write_masked(io_rw_32 *addr, uint32_t values, uint32_t write_mask)
Set new values for a sub-set of the bits in a HW register.
Definition address_mapped.h:171
@ DREQ_UART0_RX
Select UART0's RX FIFO as DREQ.
Definition dreq.h:88
@ DREQ_UART0_TX
Select UART0's TX FIFO as DREQ.
Definition dreq.h:87
@ DREQ_UART1_TX
Select UART1's TX FIFO as DREQ.
Definition dreq.h:89
@ DREQ_UART1_RX
Select UART1's RX FIFO as DREQ.
Definition dreq.h:90
@ UART1_IRQ
Select UART1's IRQ output.
Definition intctrl.h:69
@ UART0_IRQ
Select UART0's IRQ output.
Definition intctrl.h:68
bool uart_is_readable_within_us(uart_inst_t *uart, uint32_t us)
Wait for up to a certain number of microseconds for the RX FIFO to be non empty.
Definition uart.c:229
static uint uart_get_index(uart_inst_t *uart)
Convert UART instance to hardware instance number.
Definition uart.h:218
static uint uart_get_reset_num(uart_inst_t *uart)
Return the reset_num_t to use for pacing transfers to/from a particular UART instance.
Definition uart.h:607
void uart_set_format(uart_inst_t *uart, uint data_bits, uint stop_bits, uart_parity_t parity)
Set UART data format.
Definition uart.c:183
#define UART_DREQ_NUM(uart, is_tx)
Returns the dreq_num_t used for pacing DMA transfers to or from this UART instance....
Definition uart.h:152
#define UART_NUM(uart)
Returns the UART number for a UART instance.
Definition uart.h:122
static void uart_set_irqs_enabled(uart_inst_t *uart, bool rx_has_data, bool tx_needs_data)
Enable/Disable UART interrupt outputs.
Definition uart.h:360
static void uart_putc(uart_inst_t *uart, char c)
Write single character to UART for transmission, with optional CR/LF conversions.
Definition uart.h:507
static uart_hw_t * uart_get_hw(uart_inst_t *uart)
Get the real hardware UART instance from a UART instance.
Definition uart.h:243
static bool uart_is_readable(uart_inst_t *uart)
Determine whether data is waiting in the RX FIFO.
Definition uart.h:442
#define uart0
Identifier for UART instance 0.
Definition uart.h:86
void uart_set_translate_crlf(uart_inst_t *uart, bool translate)
Set CR/LF conversion on UART.
Definition uart.c:221
static void uart_set_hw_flow(uart_inst_t *uart, bool cts, bool rts)
Set UART flow control CTS/RTS.
Definition uart.h:321
uint uart_init(uart_inst_t *uart, uint baudrate)
Initialise a UART.
Definition uart.c:42
static bool uart_is_enabled(uart_inst_t *uart)
Test if specific UART is enabled.
Definition uart.h:391
static void uart_putc_raw(uart_inst_t *uart, char c)
Write single character to UART for transmission.
Definition uart.h:495
static char uart_getc(uart_inst_t *uart)
Read a single character from the UART.
Definition uart.h:549
uart_parity_t
UART Parity enumeration.
Definition uart.h:251
void uart_deinit(uart_inst_t *uart)
DeInitialise a UART.
Definition uart.c:95
static void uart_puts(uart_inst_t *uart, const char *s)
Write string to UART for transmission, doing any CR/LF conversions.
Definition uart.h:524
static bool uart_is_writable(uart_inst_t *uart)
Determine if space is available in the TX FIFO.
Definition uart.h:422
static void uart_default_tx_wait_blocking(void)
Wait for the default UART's TX FIFO to be drained.
Definition uart.h:574
uint uart_set_baudrate(uart_inst_t *uart, uint baudrate)
Set UART baud rate.
Definition uart.c:155
void uart_set_fifo_enabled(uart_inst_t *uart, bool enabled)
Enable/Disable the FIFOs on specified UART.
Definition uart.c:199
#define uart1
Identifier for UART instance 1.
Definition uart.h:87
static void uart_write_blocking(uart_inst_t *uart, const uint8_t *src, size_t len)
Write to the UART for transmission.
Definition uart.h:459
#define UART_INSTANCE(num)
Returns the UART instance with the given UART number.
Definition uart.h:135
void uart_set_break(uart_inst_t *uart, bool en)
Assert a break condition on the UART transmission.
Definition uart.c:210
static void uart_read_blocking(uart_inst_t *uart, uint8_t *dst, size_t len)
Read from the UART.
Definition uart.h:476
static uint uart_get_dreq_num(uart_inst_t *uart, bool is_tx)
Return the dreq_num_t to use for pacing transfers to/from a particular UART instance.
Definition uart.h:597
static uart_inst_t * uart_get_instance(uint num)
Get the UART instance from an instance number.
Definition uart.h:229
static void uart_tx_wait_blocking(uart_inst_t *uart)
Wait for the UART TX fifo to be drained.
Definition uart.h:431
#define UART_RESET_NUM(uart)
Returns the reset_num_t used to reset a given UART instance.
Definition uart.h:209