Line 224... |
Line 224... |
*
|
*
|
* @return 0 if UART0 was not synthesized, 1 if UART0 is available.
|
* @return 0 if UART0 was not synthesized, 1 if UART0 is available.
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_uart0_available(void) {
|
int neorv32_uart0_available(void) {
|
|
|
if (SYSINFO_FEATURES & (1 << SYSINFO_FEATURES_IO_UART0)) {
|
if (NEORV32_SYSINFO.SOC & (1 << SYSINFO_SOC_IO_UART0)) {
|
return 1;
|
return 1;
|
}
|
}
|
else {
|
else {
|
return 0;
|
return 0;
|
}
|
}
|
Line 247... |
Line 247... |
* @param[in] parity Parity configuration (00=off, 10=even, 11=odd), see #NEORV32_UART_PARITY_enum.
|
* @param[in] parity Parity configuration (00=off, 10=even, 11=odd), see #NEORV32_UART_PARITY_enum.
|
* @param[in] flow_con Hardware flow control configuration (00=off, 01=RTS, 10=CTS, 11=RTS/CTS), see #NEORV32_UART_FLOW_CONTROL_enum.
|
* @param[in] flow_con Hardware flow control configuration (00=off, 01=RTS, 10=CTS, 11=RTS/CTS), see #NEORV32_UART_FLOW_CONTROL_enum.
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_uart0_setup(uint32_t baudrate, uint8_t parity, uint8_t flow_con) {
|
void neorv32_uart0_setup(uint32_t baudrate, uint8_t parity, uint8_t flow_con) {
|
|
|
UART0_CT = 0; // reset
|
NEORV32_UART0.CTRL = 0; // reset
|
|
|
uint32_t clock = SYSINFO_CLK;
|
uint32_t clock = NEORV32_SYSINFO.CLK;
|
uint16_t i = 0; // BAUD rate divisor
|
uint16_t i = 0; // BAUD rate divisor
|
uint8_t p = 0; // initial prsc = CLK/2
|
uint8_t p = 0; // initial prsc = CLK/2
|
|
|
// raw clock prescaler
|
// raw clock prescaler
|
#ifdef __riscv_div
|
#ifdef __riscv_div
|
Line 275... |
Line 275... |
i >>= 1;
|
i >>= 1;
|
p++;
|
p++;
|
}
|
}
|
|
|
uint32_t clk_prsc = (uint32_t)p;
|
uint32_t clk_prsc = (uint32_t)p;
|
clk_prsc = clk_prsc << UART_CT_PRSC0;
|
clk_prsc = clk_prsc << UART_CTRL_PRSC0;
|
|
|
uint32_t baud_prsc = (uint32_t)i;
|
uint32_t baud_prsc = (uint32_t)i;
|
baud_prsc = baud_prsc - 1;
|
baud_prsc = baud_prsc - 1;
|
baud_prsc = baud_prsc << UART_CT_BAUD00;
|
baud_prsc = baud_prsc << UART_CTRL_BAUD00;
|
|
|
uint32_t uart_en = 1;
|
uint32_t uart_en = 1;
|
uart_en = uart_en << UART_CT_EN;
|
uart_en = uart_en << UART_CTRL_EN;
|
|
|
uint32_t parity_config = (uint32_t)(parity & 3);
|
uint32_t parity_config = (uint32_t)(parity & 3);
|
parity_config = parity_config << UART_CT_PMODE0;
|
parity_config = parity_config << UART_CTRL_PMODE0;
|
|
|
uint32_t flow_control = (uint32_t)(flow_con & 3);
|
uint32_t flow_control = (uint32_t)(flow_con & 3);
|
flow_control = flow_control << UART_CT_RTS_EN;
|
flow_control = flow_control << UART_CTRL_RTS_EN;
|
|
|
/* Enable UART0 for SIM mode. */
|
/* Enable UART0 for SIM mode. */
|
/* USE THIS ONLY FOR SIMULATION! */
|
/* USE THIS ONLY FOR SIMULATION! */
|
#ifdef UART_SIM_MODE
|
#ifdef UART_SIM_MODE
|
#warning <UART_SIM_MODE> is obsolete (but still supported for compatibility). Please consider using the new flag <UART0_SIM_MODE>.
|
#warning <UART_SIM_MODE> is obsolete (but still supported for compatibility). Please consider using the new flag <UART0_SIM_MODE>.
|
#endif
|
#endif
|
#if defined UART0_SIM_MODE || defined UART_SIM_MODE
|
#if defined UART0_SIM_MODE || defined UART_SIM_MODE
|
#warning UART0_SIM_MODE (primary UART) enabled! Sending all UART0.TX data to text.io simulation output instead of real UART0 transmitter. Use this for simulations only!
|
#warning UART0_SIM_MODE (primary UART) enabled! Sending all UART0.TX data to text.io simulation output instead of real UART0 transmitter. Use this for simulations only!
|
uint32_t sim_mode = 1 << UART_CT_SIM_MODE;
|
uint32_t sim_mode = 1 << UART_CTRL_SIM_MODE;
|
#else
|
#else
|
uint32_t sim_mode = 0;
|
uint32_t sim_mode = 0;
|
#endif
|
#endif
|
|
|
UART0_CT = clk_prsc | baud_prsc | uart_en | parity_config | sim_mode | flow_control;
|
NEORV32_UART0.CTRL = clk_prsc | baud_prsc | uart_en | parity_config | sim_mode | flow_control;
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Disable UART0.
|
* Disable UART0.
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_uart0_disable(void) {
|
void neorv32_uart0_disable(void) {
|
|
|
UART0_CT &= ~((uint32_t)(1 << UART_CT_EN));
|
NEORV32_UART0.CTRL &= ~((uint32_t)(1 << UART_CTRL_EN));
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Enable UART0.
|
* Enable UART0.
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_uart0_enable(void) {
|
void neorv32_uart0_enable(void) {
|
|
|
UART0_CT = ((uint32_t)(1 << UART_CT_EN));
|
NEORV32_UART0.CTRL = ((uint32_t)(1 << UART_CTRL_EN));
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Send single char via UART0.
|
* Send single char via UART0.
|
Line 334... |
Line 334... |
* @param[in] c Char to be send.
|
* @param[in] c Char to be send.
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_uart0_putc(char c) {
|
void neorv32_uart0_putc(char c) {
|
|
|
// wait for previous transfer to finish
|
// wait for previous transfer to finish
|
while ((UART0_CT & (1<<UART_CT_TX_BUSY)) != 0);
|
while ((NEORV32_UART0.CTRL & (1<<UART_CTRL_TX_BUSY)) != 0);
|
UART0_DATA = ((uint32_t)c) << UART_DATA_LSB;
|
NEORV32_UART0.DATA = ((uint32_t)c) << UART_DATA_LSB;
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Check if UART0 TX is busy.
|
* Check if UART0 TX is busy.
|
Line 348... |
Line 348... |
*
|
*
|
* @return 0 if idle, 1 if busy
|
* @return 0 if idle, 1 if busy
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_uart0_tx_busy(void) {
|
int neorv32_uart0_tx_busy(void) {
|
|
|
if ((UART0_CT & (1<<UART_CT_TX_BUSY)) != 0) {
|
if ((NEORV32_UART0.CTRL & (1<<UART_CTRL_TX_BUSY)) != 0) {
|
return 1;
|
return 1;
|
}
|
}
|
return 0;
|
return 0;
|
}
|
}
|
|
|
Line 366... |
Line 366... |
**************************************************************************/
|
**************************************************************************/
|
char neorv32_uart0_getc(void) {
|
char neorv32_uart0_getc(void) {
|
|
|
uint32_t d = 0;
|
uint32_t d = 0;
|
while (1) {
|
while (1) {
|
d = UART0_DATA;
|
d = NEORV32_UART0.DATA;
|
if ((d & (1<<UART_DATA_AVAIL)) != 0) { // char received?
|
if ((d & (1<<UART_DATA_AVAIL)) != 0) { // char received?
|
return (char)d;
|
return (char)d;
|
}
|
}
|
}
|
}
|
}
|
}
|
Line 384... |
Line 384... |
* @param[in,out] data Received char.
|
* @param[in,out] data Received char.
|
* @return Status code (0=nothing received, 1: char received without errors; -1: char received with frame error; -2: char received with parity error; -3 char received with frame & parity error).
|
* @return Status code (0=nothing received, 1: char received without errors; -1: char received with frame error; -2: char received with parity error; -3 char received with frame & parity error).
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_uart0_getc_safe(char *data) {
|
int neorv32_uart0_getc_safe(char *data) {
|
|
|
uint32_t uart_rx = UART0_DATA;
|
uint32_t uart_rx = NEORV32_UART0.DATA;
|
if (uart_rx & (1<<UART_DATA_AVAIL)) { // char available at all?
|
if (uart_rx & (1<<UART_DATA_AVAIL)) { // char available at all?
|
|
|
int status = 0;
|
int status = 0;
|
|
|
// check for frame error
|
// check for frame error
|
Line 424... |
Line 424... |
*
|
*
|
* @return =!0 when a char has been received.
|
* @return =!0 when a char has been received.
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_uart0_char_received(void) {
|
int neorv32_uart0_char_received(void) {
|
|
|
if ((UART0_DATA & (1<<UART_DATA_AVAIL)) != 0) {
|
if ((NEORV32_UART0.DATA & (1<<UART_DATA_AVAIL)) != 0) {
|
return 1;
|
return 1;
|
}
|
}
|
else {
|
else {
|
return 0;
|
return 0;
|
}
|
}
|
Line 443... |
Line 443... |
*
|
*
|
* @return Received char.
|
* @return Received char.
|
**************************************************************************/
|
**************************************************************************/
|
char neorv32_uart0_char_received_get(void) {
|
char neorv32_uart0_char_received_get(void) {
|
|
|
return (char)UART0_DATA;
|
return (char)NEORV32_UART0.DATA;
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Print string (zero-terminated) via UART0. Print full line break "\r\n" for every '\n'.
|
* Print string (zero-terminated) via UART0. Print full line break "\r\n" for every '\n'.
|
Line 587... |
Line 587... |
*
|
*
|
* @return 0 if UART1 was not synthesized, 1 if UART1 is available.
|
* @return 0 if UART1 was not synthesized, 1 if UART1 is available.
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_uart1_available(void) {
|
int neorv32_uart1_available(void) {
|
|
|
if (SYSINFO_FEATURES & (1 << SYSINFO_FEATURES_IO_UART1)) {
|
if (NEORV32_SYSINFO.SOC & (1 << SYSINFO_SOC_IO_UART1)) {
|
return 1;
|
return 1;
|
}
|
}
|
else {
|
else {
|
return 0;
|
return 0;
|
}
|
}
|
Line 610... |
Line 610... |
* @param[in] parity Parity configuration (00=off, 10=even, 11=odd), see #NEORV32_UART_PARITY_enum.
|
* @param[in] parity Parity configuration (00=off, 10=even, 11=odd), see #NEORV32_UART_PARITY_enum.
|
* @param[in] flow_con Hardware flow control configuration (00=off, 01=RTS, 10=CTS, 11=RTS/CTS), see #NEORV32_UART_FLOW_CONTROL_enum.
|
* @param[in] flow_con Hardware flow control configuration (00=off, 01=RTS, 10=CTS, 11=RTS/CTS), see #NEORV32_UART_FLOW_CONTROL_enum.
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_uart1_setup(uint32_t baudrate, uint8_t parity, uint8_t flow_con) {
|
void neorv32_uart1_setup(uint32_t baudrate, uint8_t parity, uint8_t flow_con) {
|
|
|
UART1_CT = 0; // reset
|
NEORV32_UART1.CTRL = 0; // reset
|
|
|
uint32_t clock = SYSINFO_CLK;
|
uint32_t clock = NEORV32_SYSINFO.CLK;
|
uint16_t i = 0; // BAUD rate divisor
|
uint16_t i = 0; // BAUD rate divisor
|
uint8_t p = 0; // initial prsc = CLK/2
|
uint8_t p = 0; // initial prsc = CLK/2
|
|
|
// raw clock prescaler
|
// raw clock prescaler
|
#ifdef __riscv_div
|
#ifdef __riscv_div
|
Line 638... |
Line 638... |
i >>= 1;
|
i >>= 1;
|
p++;
|
p++;
|
}
|
}
|
|
|
uint32_t clk_prsc = (uint32_t)p;
|
uint32_t clk_prsc = (uint32_t)p;
|
clk_prsc = clk_prsc << UART_CT_PRSC0;
|
clk_prsc = clk_prsc << UART_CTRL_PRSC0;
|
|
|
uint32_t baud_prsc = (uint32_t)i;
|
uint32_t baud_prsc = (uint32_t)i;
|
baud_prsc = baud_prsc - 1;
|
baud_prsc = baud_prsc - 1;
|
baud_prsc = baud_prsc << UART_CT_BAUD00;
|
baud_prsc = baud_prsc << UART_CTRL_BAUD00;
|
|
|
uint32_t uart_en = 1;
|
uint32_t uart_en = 1;
|
uart_en = uart_en << UART_CT_EN;
|
uart_en = uart_en << UART_CTRL_EN;
|
|
|
uint32_t parity_config = (uint32_t)(parity & 3);
|
uint32_t parity_config = (uint32_t)(parity & 3);
|
parity_config = parity_config << UART_CT_PMODE0;
|
parity_config = parity_config << UART_CTRL_PMODE0;
|
|
|
uint32_t flow_control = (uint32_t)(flow_con & 3);
|
uint32_t flow_control = (uint32_t)(flow_con & 3);
|
flow_control = flow_control << UART_CT_RTS_EN;
|
flow_control = flow_control << UART_CTRL_RTS_EN;
|
|
|
/* Enable UART1 for SIM mode. */
|
/* Enable UART1 for SIM mode. */
|
/* USE THIS ONLY FOR SIMULATION! */
|
/* USE THIS ONLY FOR SIMULATION! */
|
#ifdef UART1_SIM_MODE
|
#ifdef UART1_SIM_MODE
|
#warning UART1_SIM_MODE (secondary UART) enabled! Sending all UART1.TX data to text.io simulation output instead of real UART1 transmitter. Use this for simulations only!
|
#warning UART1_SIM_MODE (secondary UART) enabled! Sending all UART1.TX data to text.io simulation output instead of real UART1 transmitter. Use this for simulations only!
|
uint32_t sim_mode = 1 << UART_CT_SIM_MODE;
|
uint32_t sim_mode = 1 << UART_CTRL_SIM_MODE;
|
#else
|
#else
|
uint32_t sim_mode = 0;
|
uint32_t sim_mode = 0;
|
#endif
|
#endif
|
|
|
UART1_CT = clk_prsc | baud_prsc | uart_en | parity_config | sim_mode | flow_control;
|
NEORV32_UART1.CTRL = clk_prsc | baud_prsc | uart_en | parity_config | sim_mode | flow_control;
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Disable UART1.
|
* Disable UART1.
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_uart1_disable(void) {
|
void neorv32_uart1_disable(void) {
|
|
|
UART1_CT &= ~((uint32_t)(1 << UART_CT_EN));
|
NEORV32_UART1.CTRL &= ~((uint32_t)(1 << UART_CTRL_EN));
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Enable UART1.
|
* Enable UART1.
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_uart1_enable(void) {
|
void neorv32_uart1_enable(void) {
|
|
|
UART1_CT |= ((uint32_t)(1 << UART_CT_EN));
|
NEORV32_UART1.CTRL |= ((uint32_t)(1 << UART_CTRL_EN));
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Send single char via UART1.
|
* Send single char via UART1.
|
Line 694... |
Line 694... |
* @param[in] c Char to be send.
|
* @param[in] c Char to be send.
|
**************************************************************************/
|
**************************************************************************/
|
void neorv32_uart1_putc(char c) {
|
void neorv32_uart1_putc(char c) {
|
|
|
// wait for previous transfer to finish
|
// wait for previous transfer to finish
|
while ((UART1_CT & (1<<UART_CT_TX_BUSY)) != 0);
|
while ((NEORV32_UART1.CTRL & (1<<UART_CTRL_TX_BUSY)) != 0);
|
UART1_DATA = ((uint32_t)c) << UART_DATA_LSB;
|
NEORV32_UART1.DATA = ((uint32_t)c) << UART_DATA_LSB;
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Check if UART1 TX is busy.
|
* Check if UART1 TX is busy.
|
Line 708... |
Line 708... |
*
|
*
|
* @return 0 if idle, 1 if busy
|
* @return 0 if idle, 1 if busy
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_uart1_tx_busy(void) {
|
int neorv32_uart1_tx_busy(void) {
|
|
|
if ((UART1_CT & (1<<UART_CT_TX_BUSY)) != 0) {
|
if ((NEORV32_UART1.CTRL & (1<<UART_CTRL_TX_BUSY)) != 0) {
|
return 1;
|
return 1;
|
}
|
}
|
return 0;
|
return 0;
|
}
|
}
|
|
|
Line 726... |
Line 726... |
**************************************************************************/
|
**************************************************************************/
|
char neorv32_uart1_getc(void) {
|
char neorv32_uart1_getc(void) {
|
|
|
uint32_t d = 0;
|
uint32_t d = 0;
|
while (1) {
|
while (1) {
|
d = UART1_DATA;
|
d = NEORV32_UART1.DATA;
|
if ((d & (1<<UART_DATA_AVAIL)) != 0) { // char received?
|
if ((d & (1<<UART_DATA_AVAIL)) != 0) { // char received?
|
return (char)d;
|
return (char)d;
|
}
|
}
|
}
|
}
|
}
|
}
|
Line 744... |
Line 744... |
* @param[in,out] data Received char.
|
* @param[in,out] data Received char.
|
* @return Status code (0=nothing received, 1: char received without errors; -1: char received with frame error; -2: char received with parity error; -3 char received with frame & parity error).
|
* @return Status code (0=nothing received, 1: char received without errors; -1: char received with frame error; -2: char received with parity error; -3 char received with frame & parity error).
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_uart1_getc_safe(char *data) {
|
int neorv32_uart1_getc_safe(char *data) {
|
|
|
uint32_t uart_rx = UART1_DATA;
|
uint32_t uart_rx = NEORV32_UART1.DATA;
|
if (uart_rx & (1<<UART_DATA_AVAIL)) { // char available at all?
|
if (uart_rx & (1<<UART_DATA_AVAIL)) { // char available at all?
|
|
|
int status = 0;
|
int status = 0;
|
|
|
// check for frame error
|
// check for frame error
|
Line 784... |
Line 784... |
*
|
*
|
* @return =!0 when a char has been received.
|
* @return =!0 when a char has been received.
|
**************************************************************************/
|
**************************************************************************/
|
int neorv32_uart1_char_received(void) {
|
int neorv32_uart1_char_received(void) {
|
|
|
if ((UART1_DATA & (1<<UART_DATA_AVAIL)) != 0) {
|
if ((NEORV32_UART1.DATA & (1<<UART_DATA_AVAIL)) != 0) {
|
return 1;
|
return 1;
|
}
|
}
|
else {
|
else {
|
return 0;
|
return 0;
|
}
|
}
|
Line 803... |
Line 803... |
*
|
*
|
* @return Received char.
|
* @return Received char.
|
**************************************************************************/
|
**************************************************************************/
|
char neorv32_uart1_char_received_get(void) {
|
char neorv32_uart1_char_received_get(void) {
|
|
|
return (char)UART1_DATA;
|
return (char)NEORV32_UART1.DATA;
|
}
|
}
|
|
|
|
|
/**********************************************************************//**
|
/**********************************************************************//**
|
* Print string (zero-terminated) via UART1. Print full line break "\r\n" for every '\n'.
|
* Print string (zero-terminated) via UART1. Print full line break "\r\n" for every '\n'.
|