xtensa/esp32: Reorganize the pins initialization and adds showprogress in __start

This commit is contained in:
Sara Souza 2021-04-20 10:28:41 -03:00 committed by Xiang Xiao
parent afd6b26232
commit cce42d5f74
2 changed files with 80 additions and 53 deletions

View File

@ -362,12 +362,12 @@ static uart_dev_t g_uart2port =
/****************************************************************************
* Private Functions
****************************************************************************/
#ifndef CONFIG_SUPPRESS_UART_CONFIG
/****************************************************************************
* Name: esp32_reset_rx_fifo
*
* Description:
* Resets the RX FIFO.
* Resets the RX FIFO.
* NOTE: We can not use rxfifo_rst to reset the hardware RX FIFO.
*
* Parameters:
@ -388,7 +388,7 @@ static void esp32_reset_rx_fifo(struct esp32_dev_s *priv)
{
getreg32(DR_UART_FIFO_REG(priv->config->id));
rx_status_reg = getreg32(UART_STATUS_REG(priv->config->id));
rx_status_reg = getreg32(UART_STATUS_REG(priv->config->id));
fifo_cnt = REG_MASK(rx_status_reg, UART_RXFIFO_CNT);
mem_rx_status_reg = getreg32(UART_MEM_RX_STATUS_REG(priv->config->id));
rd_address = REG_MASK(mem_rx_status_reg, UART_RD_ADDRESS);
@ -400,7 +400,7 @@ static void esp32_reset_rx_fifo(struct esp32_dev_s *priv)
* Name: esp32_reset_tx_fifo
*
* Description:
* Resets the TX FIFO.
* Resets the TX FIFO.
*
* Parameters:
* priv - Pointer to the serial driver struct.
@ -412,6 +412,7 @@ static void esp32_reset_tx_fifo(struct esp32_dev_s *priv)
modifyreg32(UART_CONF0_REG(priv->config->id), 0, UART_TXFIFO_RST_M);
modifyreg32(UART_CONF0_REG(priv->config->id), UART_TXFIFO_RST_M, 0);
}
#endif
/****************************************************************************
* Name: esp32_get_rx_fifo_len
@ -442,11 +443,11 @@ static uint32_t esp32_get_rx_fifo_len(struct esp32_dev_s *priv)
uint32_t len;
mem_rx_status_reg = getreg32(UART_MEM_RX_STATUS_REG(priv->config->id));
rd_address = ((mem_rx_status_reg & UART_RD_ADDRESS_M)
rd_address = ((mem_rx_status_reg & UART_RD_ADDRESS_M)
>> UART_RD_ADDRESS_S);
wr_address = ((mem_rx_status_reg & UART_WR_ADDRESS_M)
wr_address = ((mem_rx_status_reg & UART_WR_ADDRESS_M)
>> UART_WR_ADDRESS_S);
rx_status_reg = getreg32(UART_STATUS_REG(priv->config->id));
rx_status_reg = getreg32(UART_STATUS_REG(priv->config->id));
fifo_cnt = ((rx_status_reg & UART_RXFIFO_CNT_M)
>> UART_RXFIFO_CNT_S);
@ -458,7 +459,7 @@ static uint32_t esp32_get_rx_fifo_len(struct esp32_dev_s *priv)
{
len = (wr_address + 128) - rd_address;
}
else
else
{
len = fifo_cnt > 0 ? 128 : 0;
}
@ -594,26 +595,6 @@ static int esp32_setup(struct uart_dev_s *dev)
regval |= (clkdiv & 15) << UART_CLKDIV_FRAG_S;
putreg32(regval, UART_CLKDIV_REG(priv->config->id));
/* Configure UART pins
*
* Internal signals can be output to multiple GPIO pads.
* But only one GPIO pad can connect with input signal
*/
esp32_configgpio(priv->config->txpin, OUTPUT_FUNCTION_3);
esp32_gpio_matrix_out(priv->config->txpin, priv->config->txsig, 0, 0);
esp32_configgpio(priv->config->rxpin, INPUT_FUNCTION_3);
esp32_gpio_matrix_in(priv->config->rxpin, priv->config->rxsig, 0);
#if defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL)
esp32_configgpio(priv->config->rtspin, OUTPUT_FUNCTION_3);
esp32_gpio_matrix_out(priv->config->rtspin, priv->config->rtssig, 0, 0);
esp32_configgpio(priv->config->ctspin, INPUT_FUNCTION_3);
esp32_gpio_matrix_in(priv->config->ctspin, priv->config->ctssig, 0);
#endif
/* Enable RX and error interrupts. Clear and pending interrtupt */
regval = UART_RXFIFO_FULL_INT_ENA | UART_FRM_ERR_INT_ENA |
@ -670,25 +651,6 @@ static void esp32_shutdown(struct uart_dev_s *dev)
esp32_disableallints(priv, NULL);
/* Revert pins to inputs and detach UART signals */
esp32_configgpio(priv->config->txpin, INPUT);
esp32_gpio_matrix_out(priv->config->txsig,
MATRIX_DETACH_OUT_SIG, true, false);
esp32_configgpio(priv->config->rxpin, INPUT);
esp32_gpio_matrix_in(priv->config->rxsig, MATRIX_DETACH_IN_LOW_PIN, false);
#if defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL)
esp32_configgpio(priv->config->rtspin, INPUT);
esp32_gpio_matrix_out(priv->config->rtssig,
MATRIX_DETACH_OUT_SIG, true, false);
esp32_configgpio(priv->config->ctspin, INPUT);
esp32_gpio_matrix_in(priv->config->ctssig,
MATRIX_DETACH_IN_LOW_PIN, false);
#endif
/* Unconfigure and disable the UART */
putreg32(0, UART_CONF0_REG(priv->config->id));
@ -1232,8 +1194,8 @@ static bool esp32_txready(struct uart_dev_s *dev)
uint32_t txcnt;
struct esp32_dev_s *priv = (struct esp32_dev_s *)dev->priv;
txcnt = (getreg32(UART_STATUS_REG(priv->config->id)) >> UART_TXFIFO_CNT_S) &
UART_TXFIFO_CNT_V;
txcnt = (getreg32(UART_STATUS_REG(priv->config->id)) >> UART_TXFIFO_CNT_S)
& UART_TXFIFO_CNT_V;
if (txcnt < (UART_TX_FIFO_SIZE -1))
{
@ -1261,6 +1223,41 @@ static bool esp32_txempty(struct uart_dev_s *dev)
& UART_TXFIFO_CNT_M) == 0);
}
#ifndef CONFIG_SUPPRESS_UART_CONFIG
/****************************************************************************
* Name: esp32_config_pins
*
* Description:
* Performs the pin configuration.
*
* Parameters:
* priv - Pointer to the serial driver struct.
*
****************************************************************************/
static void esp32_config_pins(struct esp32_dev_s *priv)
{
/* Configure UART pins
*
* Internal signals can be output to multiple GPIO pads.
* But only one GPIO pad can connect with input signal
*/
esp32_configgpio(priv->config->txpin, OUTPUT_FUNCTION_3);
esp32_gpio_matrix_out(priv->config->txpin, priv->config->txsig, 0, 0);
esp32_configgpio(priv->config->rxpin, INPUT_FUNCTION_3);
esp32_gpio_matrix_in(priv->config->rxpin, priv->config->rxsig, 0);
#if defined(CONFIG_SERIAL_IFLOWCONTROL) || defined(CONFIG_SERIAL_OFLOWCONTROL)
esp32_configgpio(priv->config->rtspin, OUTPUT_FUNCTION_3);
esp32_gpio_matrix_out(priv->config->rtspin, priv->config->rtssig, 0, 0);
esp32_configgpio(priv->config->ctspin, INPUT_FUNCTION_3);
esp32_gpio_matrix_in(priv->config->ctspin, priv->config->ctssig, 0);
#endif
}
/****************************************************************************
* Public Functions
****************************************************************************/
@ -1269,17 +1266,23 @@ static bool esp32_txempty(struct uart_dev_s *dev)
* Name: esp32_lowsetup
*
* Description:
* Performs the low level UART initialization early in debug so that the
* serial console will be available during bootup. This must be called
* before up_serialinit.
* Performs the pin configuration for all UARTs.
* This functions is intended to be called in the __start function.
*
****************************************************************************/
void esp32_lowsetup(void)
{
esp32_config_pins(TTYS0_DEV.priv);
#ifdef TTYS1_DEV
esp32_config_pins(TTYS1_DEV.priv);
#endif
#ifdef TTYS2_DEV
esp32_config_pins(TTYS2_DEV.priv);
#endif
}
#endif /* CONFIG_SUPPRESS_UART_CONFIG */
/****************************************************************************
* Name: xtensa_early_serial_initialize
*

View File

@ -40,6 +40,16 @@
#include "esp32_start.h"
#include "esp32_spiram.h"
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#ifdef CONFIG_DEBUG_FEATURES
# define showprogress(c) up_puts(c)
#else
# define showprogress(c)
#endif
/****************************************************************************
* Public Data
****************************************************************************/
@ -53,6 +63,10 @@ uint32_t g_idlestack[IDLETHREAD_STACKWORDS]
* Public Functions
****************************************************************************/
#ifndef CONFIG_SUPPRESS_UART_CONFIG
extern void esp32_lowsetup(void);
#endif
/****************************************************************************
* Name: __start
*
@ -136,12 +150,20 @@ void IRAM_ATTR __start(void)
esp32_clockconfig();
#ifndef CONFIG_SUPPRESS_UART_CONFIG
/* Configure the UART so we can get debug output */
esp32_lowsetup();
#endif
#ifdef USE_EARLYSERIALINIT
/* Perform early serial initialization */
xtensa_early_serial_initialize();
#endif
showprogress("A");
#if defined(CONFIG_ESP32_SPIRAM_BOOT_INIT)
esp_spiram_init_cache();
if (esp_spiram_init() != OK)
@ -166,6 +188,8 @@ void IRAM_ATTR __start(void)
esp32_board_initialize();
showprogress("B");
/* Bring up NuttX */
nx_start();