Skip to content

Commit

Permalink
Common neorv32 uart functions (#509)
Browse files Browse the repository at this point in the history
  • Loading branch information
stnolting authored Mar 4, 2023
2 parents f5047ef + 68bcf0a commit efb94ac
Show file tree
Hide file tree
Showing 5 changed files with 173 additions and 494 deletions.
40 changes: 20 additions & 20 deletions sw/example/processor_check/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ int main() {

// setup UARTs at default baud rate, no parity bits, no HW flow control
neorv32_uart0_setup(BAUD_RATE, PARITY_NONE, FLOW_CONTROL_NONE);
NEORV32_UART1.CTRL = NEORV32_UART0.CTRL; // copy configuration to initialize UART1
NEORV32_UART1->CTRL = NEORV32_UART0->CTRL; // copy configuration to initialize UART1

#ifdef SUPPRESS_OPTIONAL_UART_PRINT
neorv32_uart0_disable(); // do not generate any UART0 output
Expand Down Expand Up @@ -975,12 +975,12 @@ int main() {
while(neorv32_uart0_tx_busy());

// backup current UART0 configuration
tmp_a = NEORV32_UART0.CTRL;
tmp_a = NEORV32_UART0->CTRL;

// make sure UART is enabled
NEORV32_UART0.CTRL |= (1 << UART_CTRL_EN);
NEORV32_UART0->CTRL |= (1 << UART_CTRL_EN);
// make sure sim mode is disabled
NEORV32_UART0.CTRL &= ~(1 << UART_CTRL_SIM_MODE);
NEORV32_UART0->CTRL &= ~(1 << UART_CTRL_SIM_MODE);

// enable fast interrupt
neorv32_cpu_csr_write(CSR_MIE, 1 << UART0_RX_FIRQ_ENABLE);
Expand All @@ -997,7 +997,7 @@ int main() {
neorv32_cpu_csr_write(CSR_MIE, 0);

// restore original configuration
NEORV32_UART0.CTRL = tmp_a;
NEORV32_UART0->CTRL = tmp_a;

if (neorv32_cpu_csr_read(CSR_MCAUSE) == UART0_RX_TRAP_CODE) {
test_ok();
Expand All @@ -1018,12 +1018,12 @@ int main() {
while(neorv32_uart0_tx_busy());

// backup current UART0 configuration
tmp_a = NEORV32_UART0.CTRL;
tmp_a = NEORV32_UART0->CTRL;

// make sure UART is enabled
NEORV32_UART0.CTRL |= (1 << UART_CTRL_EN);
NEORV32_UART0->CTRL |= (1 << UART_CTRL_EN);
// make sure sim mode is disabled
NEORV32_UART0.CTRL &= ~(1 << UART_CTRL_SIM_MODE);
NEORV32_UART0->CTRL &= ~(1 << UART_CTRL_SIM_MODE);

// UART0 TX interrupt enable
neorv32_cpu_csr_write(CSR_MIE, 1 << UART0_TX_FIRQ_ENABLE);
Expand All @@ -1040,7 +1040,7 @@ int main() {
neorv32_cpu_csr_write(CSR_MIE, 0);

// restore original configuration
NEORV32_UART0.CTRL = tmp_a;
NEORV32_UART0->CTRL = tmp_a;

if (neorv32_cpu_csr_read(CSR_MCAUSE) == UART0_TX_TRAP_CODE) {
test_ok();
Expand All @@ -1058,12 +1058,12 @@ int main() {
cnt_test++;

// backup current UART1 configuration
tmp_a = NEORV32_UART1.CTRL;
tmp_a = NEORV32_UART1->CTRL;

// make sure UART is enabled
NEORV32_UART1.CTRL |= (1 << UART_CTRL_EN);
NEORV32_UART1->CTRL |= (1 << UART_CTRL_EN);
// make sure sim mode is disabled
NEORV32_UART1.CTRL &= ~(1 << UART_CTRL_SIM_MODE);
NEORV32_UART1->CTRL &= ~(1 << UART_CTRL_SIM_MODE);

// UART1 RX interrupt enable
neorv32_cpu_csr_write(CSR_MIE, 1 << UART1_RX_FIRQ_ENABLE);
Expand All @@ -1080,7 +1080,7 @@ int main() {
neorv32_cpu_csr_write(CSR_MIE, 0);

// restore original configuration
NEORV32_UART1.CTRL = tmp_a;
NEORV32_UART1->CTRL = tmp_a;

if (neorv32_cpu_csr_read(CSR_MCAUSE) == UART1_RX_TRAP_CODE) {
test_ok();
Expand All @@ -1098,12 +1098,12 @@ int main() {
cnt_test++;

// backup current UART1 configuration
tmp_a = NEORV32_UART1.CTRL;
tmp_a = NEORV32_UART1->CTRL;

// make sure UART is enabled
NEORV32_UART1.CTRL |= (1 << UART_CTRL_EN);
NEORV32_UART1->CTRL |= (1 << UART_CTRL_EN);
// make sure sim mode is disabled
NEORV32_UART1.CTRL &= ~(1 << UART_CTRL_SIM_MODE);
NEORV32_UART1->CTRL &= ~(1 << UART_CTRL_SIM_MODE);

// UART1 RX interrupt enable
neorv32_cpu_csr_write(CSR_MIE, 1 << UART1_TX_FIRQ_ENABLE);
Expand All @@ -1120,7 +1120,7 @@ int main() {
neorv32_cpu_csr_write(CSR_MIE, 0);

// restore original configuration
NEORV32_UART1.CTRL = tmp_a;
NEORV32_UART1->CTRL = tmp_a;

if (neorv32_cpu_csr_read(CSR_MCAUSE) == UART1_TX_TRAP_CODE) {
test_ok();
Expand Down Expand Up @@ -1732,9 +1732,9 @@ void test_fail(void) {
void __neorv32_crt0_after_main(int32_t return_code) {

// make sure sim mode is disabled and UARTs are actually enabled
NEORV32_UART0.CTRL |= (1 << UART_CTRL_EN);
NEORV32_UART0.CTRL &= ~(1 << UART_CTRL_SIM_MODE);
NEORV32_UART1.CTRL = NEORV32_UART0.CTRL;
NEORV32_UART0->CTRL |= (1 << UART_CTRL_EN);
NEORV32_UART0->CTRL &= ~(1 << UART_CTRL_SIM_MODE);
NEORV32_UART1->CTRL = NEORV32_UART0->CTRL;

// minimal result report
PRINT_CRITICAL("%u/%u\n", (uint32_t)return_code, (uint32_t)cnt_test);
Expand Down
38 changes: 38 additions & 0 deletions sw/lib/include/legacy.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,44 @@
// UART0 & UART1
// ================================================================================================

/**********************************************************************//**
* @name UART0: Backward compatibility Wrapper, #neorv32_uart_h
**************************************************************************/
/**@{*/
#define neorv32_uart0_available() neorv32_uart_available(NEORV32_UART0)
#define neorv32_uart0_setup(baudrate, parity, flow_con) neorv32_uart_setup(NEORV32_UART0, baudrate, parity, flow_con)
#define neorv32_uart0_disable() neorv32_uart_disable(NEORV32_UART0)
#define neorv32_uart0_enable() neorv32_uart_enable(NEORV32_UART0)
#define neorv32_uart0_putc(c) neorv32_uart_putc(NEORV32_UART0, c)
#define neorv32_uart0_tx_busy() neorv32_uart_tx_busy(NEORV32_UART0)
#define neorv32_uart0_getc() neorv32_uart_getc(NEORV32_UART0)
#define neorv32_uart0_char_received() neorv32_uart_char_received(NEORV32_UART0)
#define neorv32_uart0_getc_safe(data) neorv32_uart_getc_safe(NEORV32_UART0, *data)
#define neorv32_uart0_char_received_get() neorv32_uart_char_received_get(NEORV32_UART0)
#define neorv32_uart0_puts(s) neorv32_uart_puts(NEORV32_UART0, s)
#define neorv32_uart0_printf(...) neorv32_uart_printf(NEORV32_UART0, __VA_ARGS__)
#define neorv32_uart0_scan(buffer, max_size, echo) neorv32_uart_scan(NEORV32_UART0, buffer, max_size, echo)
/**@}*/

/**********************************************************************//**
* @name UART1: Backward compatibility Wrapper, #neorv32_uart_h
**************************************************************************/
/**@{*/
#define neorv32_uart1_available() neorv32_uart_available(NEORV32_UART1)
#define neorv32_uart1_setup(baudrate, parity, flow_con) neorv32_uart_setup(NEORV32_UART1, baudrate, parity, flow_con)
#define neorv32_uart1_disable() neorv32_uart_disable(NEORV32_UART1)
#define neorv32_uart1_enable() neorv32_uart_enable(NEORV32_UART1)
#define neorv32_uart1_putc(c) neorv32_uart_putc(NEORV32_UART1, c)
#define neorv32_uart1_tx_busy() neorv32_uart_tx_busy(NEORV32_UART1)
#define neorv32_uart1_getc() neorv32_uart_getc(NEORV32_UART1)
#define neorv32_uart1_char_received() neorv32_uart_char_received(NEORV32_UART1)
#define neorv32_uart1_getc_safe(data) neorv32_uart_getc_safe(NEORV32_UART1, *data)
#define neorv32_uart1_char_received_get() neorv32_uart_char_received_get(NEORV32_UART1)
#define neorv32_uart1_puts(s) neorv32_uart_puts(NEORV32_UART1, s)
#define neorv32_uart1_printf(...) neorv32_uart_printf(NEORV32_UART1, __VA_ARGS__)
#define neorv32_uart1_scan(buffer, max_size, echo) neorv32_uart_scan(NEORV32_UART1, buffer, max_size, echo)
/**@}*/

/**********************************************************************//**
* Print string (zero-terminated) via UART0. Print full line break "\r\n" for every '\n'.
* @note This function is blocking.
Expand Down
6 changes: 3 additions & 3 deletions sw/lib/include/neorv32.h
Original file line number Diff line number Diff line change
Expand Up @@ -968,7 +968,7 @@ typedef volatile struct __attribute__((packed,aligned(4))) {
**************************************************************************/
/**@{*/
/** UART module prototype */
typedef struct __attribute__((packed,aligned(4))) {
typedef volatile struct __attribute__((packed,aligned(4))) {
uint32_t CTRL; /**< offset 0: control register (#NEORV32_UART_CTRL_enum) */
uint32_t DATA; /**< offset 4: data register (#NEORV32_UART_DATA_enum) */
} neorv32_uart_t;
Expand All @@ -977,13 +977,13 @@ typedef struct __attribute__((packed,aligned(4))) {
#define NEORV32_UART0_BASE (0xFFFFFFA0U)

/** UART0 module hardware access (#neorv32_uart_t) */
#define NEORV32_UART0 (*((volatile neorv32_uart_t*) (NEORV32_UART0_BASE)))
#define NEORV32_UART0 ((neorv32_uart_t*) (NEORV32_UART0_BASE))

/** UART1 module base address */
#define NEORV32_UART1_BASE (0xFFFFFFD0U)

/** UART1 module hardware access (#neorv32_uart_t) */
#define NEORV32_UART1 (*((volatile neorv32_uart_t*) (NEORV32_UART1_BASE)))
#define NEORV32_UART1 ((neorv32_uart_t*) (NEORV32_UART1_BASE))

/** UART0/UART1 control register bits */
enum NEORV32_UART_CTRL_enum {
Expand Down
45 changes: 15 additions & 30 deletions sw/lib/include/neorv32_uart.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// # ********************************************************************************************* #
// # BSD 3-Clause License #
// # #
// # Copyright (c) 2021, Stephan Nolting. All rights reserved. #
// # Copyright (c) 2023, Stephan Nolting. All rights reserved. #
// # #
// # Redistribution and use in source and binary forms, with or without modification, are #
// # permitted provided that the following conditions are met: #
Expand Down Expand Up @@ -48,34 +48,19 @@
// Libs required by functions
#include <stdarg.h>

// prototypes for UART0 (primary UART)
int neorv32_uart0_available(void);
void neorv32_uart0_setup(uint32_t baudrate, uint8_t parity, uint8_t flow_con);
void neorv32_uart0_disable(void);
void neorv32_uart0_enable(void);
void neorv32_uart0_putc(char c);
int neorv32_uart0_tx_busy(void);
char neorv32_uart0_getc(void);
int neorv32_uart0_char_received(void);
int neorv32_uart0_getc_safe(char *data);
char neorv32_uart0_char_received_get(void);
void neorv32_uart0_puts(const char *s);
void neorv32_uart0_printf(const char *format, ...);
int neorv32_uart0_scan(char *buffer, int max_size, int echo);

// prototypes for UART1 (secondary UART)
int neorv32_uart1_available(void);
void neorv32_uart1_setup(uint32_t baudrate, uint8_t parity, uint8_t flow_con);
void neorv32_uart1_disable(void);
void neorv32_uart1_enable(void);
void neorv32_uart1_putc(char c);
int neorv32_uart1_tx_busy(void);
char neorv32_uart1_getc(void);
int neorv32_uart1_char_received(void);
int neorv32_uart1_getc_safe(char *data);
char neorv32_uart1_char_received_get(void);
void neorv32_uart1_puts(const char *s);
void neorv32_uart1_printf(const char *format, ...);
int neorv32_uart1_scan(char *buffer, int max_size, int echo);
// prototypes for common used UART functions, applicable to UART0 and UART1
int neorv32_uart_available(neorv32_uart_t *UARTx);
void neorv32_uart_setup(neorv32_uart_t *UARTx, uint32_t baudrate, uint8_t parity, uint8_t flow_con);
void neorv32_uart_enable(neorv32_uart_t *UARTx);
void neorv32_uart_disable(neorv32_uart_t *UARTx);
void neorv32_uart_putc(neorv32_uart_t *UARTx, char c);
int neorv32_uart_tx_busy(neorv32_uart_t *UARTx);
char neorv32_uart_getc(neorv32_uart_t *UARTx);
int neorv32_uart_getc_safe(neorv32_uart_t *UARTx, char *data);
int neorv32_uart_char_received(neorv32_uart_t *UARTx);
char neorv32_uart_char_received_get(neorv32_uart_t *UARTx);
void neorv32_uart_puts(neorv32_uart_t *UARTx, const char *s);
void neorv32_uart_printf(neorv32_uart_t *UARTx, const char *format, ...);
int neorv32_uart_scan(neorv32_uart_t *UARTx, char *buffer, int max_size, int echo);

#endif // neorv32_uart_h
Loading

0 comments on commit efb94ac

Please sign in to comment.