arch/arm/src/nrf52: Better uart handling and some cleanup.

This commit is contained in:
Janne Rosberg 2018-03-26 12:50:06 -06:00 committed by Gregory Nutt
parent d608f6943b
commit e4d43e8b87
4 changed files with 36 additions and 12 deletions

View File

@ -33,8 +33,8 @@
*
************************************************************************************/
#ifndef __ARCH_ARM_SRC_NRF53_CHIP_H
#define __ARCH_ARM_SRC_NRF53_CHIP_H
#ifndef __ARCH_ARM_SRC_NRF52_CHIP_H
#define __ARCH_ARM_SRC_NRF52_CHIP_H
/************************************************************************************
* Included Files
@ -74,4 +74,4 @@
* Public Functions
************************************************************************************/
#endif /* __ARCH_ARM_SRC_NRF53_CHIP_H */
#endif /* __ARCH_ARM_SRC_NRF52_CHIP_H */

View File

@ -194,4 +194,5 @@ void nrf52_gpio_write(nrf52_pinset_t pinset, bool value)
bool nrf52_gpio_read(nrf52_pinset_t pinset)
{
#warning Missing implementation!
}

View File

@ -176,8 +176,6 @@ void nrf52_usart_configure(uintptr_t base, const struct uart_config_s *config)
/* Enable */
putreg32(NRF52_UART_ENABLE_ENABLE, base + NRF52_UART_ENABLE_OFFSET);
putreg32(1, base + NRF52_UART_TASKS_STARTTX_OFFSET);
putreg32(1, base + NRF52_UART_TASKS_STARTRX_OFFSET);
}
#endif
@ -216,10 +214,13 @@ void nrf52_usart_disable(uintptr_t base)
void up_lowputc(char ch)
{
#ifdef HAVE_UART_CONSOLE
putreg32(1, CONSOLE_BASE + NRF52_UART_TASKS_STARTTX_OFFSET);
putreg32(0, CONSOLE_BASE + NRF52_UART_EVENTS_TXDRDY_OFFSET);
putreg32(ch, CONSOLE_BASE + NRF52_UART_TXD_OFFSET);
while (getreg32(CONSOLE_BASE + NRF52_UART_EVENTS_TXDRDY_OFFSET) == 0 )
{
}
putreg32(1, CONSOLE_BASE + NRF52_UART_TASKS_STOPTX_OFFSET);
#endif
}

View File

@ -212,11 +212,17 @@ static uart_dev_t g_uart0port =
static int nrf52_setup(struct uart_dev_s *dev)
{
#ifndef CONFIG_SUPPRESS_UART_CONFIG
struct nrf52_dev_s *priv = (struct nrf52_dev_s *)dev->priv;
/* struct nrf52_dev_s *priv = (struct nrf52_dev_s *)dev->priv; */
/* Configure the UART as an RS-232 UART */
nrf52_usart_configure(priv->uartbase, &priv->config);
/* REVISIT: If nrf52_usart_configure() called 2nd time uart stops working.
* Rx interrupt keeps firing.
* configuring is done on __start
*/
/* nrf52_usart_configure(priv->uartbase, &priv->config); */
#endif
return OK;
@ -290,6 +296,7 @@ static void nrf52_detach(struct uart_dev_s *dev)
/* Disable interrupts */
putreg32(NRF52_UART_INTENSET_RXDRDY, priv->uartbase + NRF52_UART_INTENCLR_OFFSET);
up_disable_irq(priv->irq);
/* Detach from the interrupt(s) */
@ -313,17 +320,25 @@ static int nrf52_interrupt(int irq, void *context, FAR void *arg)
{
struct uart_dev_s *dev = (struct uart_dev_s *)arg;
struct nrf52_dev_s *priv;
uint32_t regval;
DEBUGASSERT(dev != NULL && dev->priv != NULL);
priv = (struct nrf52_dev_s *)dev->priv;
/* Clear RX event */
putreg32(0 , priv->uartbase + NRF52_UART_EVENTS_RXDRDY_OFFSET);
priv->rx_available = true;
/* Check RX event */
uart_recvchars(dev);
regval = getreg32(priv->uartbase + NRF52_UART_EVENTS_RXDRDY_OFFSET);
//uart_xmitchars(dev);
if (regval != 0)
{
putreg32(0, priv->uartbase + NRF52_UART_EVENTS_RXDRDY_OFFSET);
priv->rx_available = true;
uart_recvchars(dev);
}
/* Clear errors */
putreg32(0, priv->uartbase + NRF52_UART_ERRORSRC_OFFSET);
return OK;
}
@ -394,6 +409,7 @@ static void nrf52_rxint(struct uart_dev_s *dev, bool enable)
putreg32(NRF52_UART_INTENSET_RXDRDY,
priv->uartbase + NRF52_UART_INTENSET_OFFSET);
putreg32(1, priv->uartbase + NRF52_UART_TASKS_STARTRX_OFFSET);
#endif
}
@ -401,6 +417,7 @@ static void nrf52_rxint(struct uart_dev_s *dev, bool enable)
{
putreg32(NRF52_UART_INTENSET_RXDRDY,
priv->uartbase + NRF52_UART_INTENCLR_OFFSET);
putreg32(1, priv->uartbase + NRF52_UART_TASKS_STOPRX_OFFSET);
}
}
@ -434,10 +451,15 @@ static void nrf52_send(struct uart_dev_s *dev, int ch)
struct nrf52_dev_s *priv = (struct nrf52_dev_s *)dev->priv;
putreg32(0, priv->uartbase + NRF52_UART_EVENTS_TXDRDY_OFFSET);
putreg32(1, priv->uartbase + NRF52_UART_TASKS_STARTTX_OFFSET);
putreg32(ch, priv->uartbase + NRF52_UART_TXD_OFFSET);
while (getreg32(priv->uartbase + NRF52_UART_EVENTS_TXDRDY_OFFSET) == 0 )
{
}
putreg32(1, priv->uartbase + NRF52_UART_TASKS_STOPTX_OFFSET);
}
/****************************************************************************