mirror of
https://github.com/apache/nuttx.git
synced 2026-06-05 15:58:59 +08:00
arch/arms/src/imrxt: Correct a few logic mistakes in the i.MX RT serial driver.
This commit is contained in:
@@ -69,8 +69,9 @@
|
|||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* Which UART with be tty0/console and which tty1-4? The console will always
|
/* Which UART with be tty0/console and which tty1-4? The console will
|
||||||
* be ttyS0. If there is no console then will use the lowest numbered UART.
|
* always be ttyS0. If there is no console then will use the lowest
|
||||||
|
* numbered UART.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* First pick the console and ttys0. This could be any of UART1-5 */
|
/* First pick the console and ttys0. This could be any of UART1-5 */
|
||||||
@@ -617,8 +618,8 @@ static int imx_attach(struct uart_dev_s *dev)
|
|||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Detach UART interrupts. This method is called when the serial port is
|
* Detach UART interrupts. This method is called when the serial port is
|
||||||
* closed normally just before the shutdown method is called. The exception is
|
* closed normally just before the shutdown method is called. The
|
||||||
* the serial console which is never shutdown.
|
* exception is the serial console which is never shutdown.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@@ -668,7 +669,7 @@ static int imx_interrupt(int irq, void *context, FAR void *arg)
|
|||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handline incoming, receive bytes */
|
/* Handle incoming, receive bytes */
|
||||||
|
|
||||||
if (usr1 & UART_USR1_RRDY)
|
if (usr1 & UART_USR1_RRDY)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -71,8 +71,9 @@
|
|||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* Which LPUART with be tty0/console and which tty1-7? The console will always
|
/* Which LPUART with be tty0/console and which tty1-7? The console will
|
||||||
* be ttyS0. If there is no console then will use the lowest numbered UART.
|
* always be ttyS0. If there is no console then will use the lowest
|
||||||
|
* numbered UART.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* First pick the console and ttys0. This could be any of LPUART1-8 */
|
/* First pick the console and ttys0. This could be any of LPUART1-8 */
|
||||||
@@ -785,14 +786,15 @@ static void imxrt_shutdown(struct uart_dev_s *dev)
|
|||||||
* Name: imxrt_attach
|
* Name: imxrt_attach
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Configure the UART to operation in interrupt driven mode. This method is
|
* Configure the UART to operation in interrupt driven mode. This method
|
||||||
* called when the serial port is opened. Normally, this is just after the
|
* is called when the serial port is opened. Normally, this is just after
|
||||||
* the setup() method is called, however, the serial console may operate in
|
* the setup() method is called, however, the serial console may operate
|
||||||
* a non-interrupt driven mode during the boot phase.
|
* in a non-interrupt driven mode during the boot phase.
|
||||||
*
|
*
|
||||||
* RX and TX interrupts are not enabled when by the attach method (unless the
|
* RX and TX interrupts are not enabled when by the attach method (unless
|
||||||
* hardware supports multiple levels of interrupt enabling). The RX and TX
|
* the hardware supports multiple levels of interrupt enabling). The RX
|
||||||
* interrupts are not enabled until the txint() and rxint() methods are called.
|
* and TX interrupts are not enabled until the txint() and rxint() methods
|
||||||
|
* are called.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@@ -821,8 +823,8 @@ static int imxrt_attach(struct uart_dev_s *dev)
|
|||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Detach UART interrupts. This method is called when the serial port is
|
* Detach UART interrupts. This method is called when the serial port is
|
||||||
* closed normally just before the shutdown method is called. The exception is
|
* closed normally just before the shutdown method is called. The
|
||||||
* the serial console which is never shutdown.
|
* exception is the serial console which is never shutdown.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@@ -850,6 +852,7 @@ static int imxrt_interrupt(int irq, void *context, FAR void *arg)
|
|||||||
struct imxrt_uart_s *priv;
|
struct imxrt_uart_s *priv;
|
||||||
uint32_t usr;
|
uint32_t usr;
|
||||||
int passes = 0;
|
int passes = 0;
|
||||||
|
bool handled;
|
||||||
|
|
||||||
DEBUGASSERT(dev != NULL && dev->priv != NULL);
|
DEBUGASSERT(dev != NULL && dev->priv != NULL);
|
||||||
priv = (struct imxrt_uart_s *)dev->priv;
|
priv = (struct imxrt_uart_s *)dev->priv;
|
||||||
@@ -864,40 +867,51 @@ static int imxrt_interrupt(int irq, void *context, FAR void *arg)
|
|||||||
* until we have been looping for a long time.
|
* until we have been looping for a long time.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (; ; )
|
handled = true;
|
||||||
|
for (passes = 0; passes < 256 && handled; passes++)
|
||||||
{
|
{
|
||||||
|
handled = false;
|
||||||
|
|
||||||
/* Get the current UART status and check for loop
|
/* Get the current UART status and check for loop
|
||||||
* termination conditions
|
* termination conditions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
usr = imxrt_serialin(priv, IMXRT_LPUART_STAT_OFFSET);
|
usr = imxrt_serialin(priv, IMXRT_LPUART_STAT_OFFSET);
|
||||||
usr &= (LPUART_STAT_RDRF | LPUART_STAT_TC);
|
usr &= (LPUART_STAT_RDRF | LPUART_STAT_TC | LPUART_STAT_OR |
|
||||||
|
LPUART_STAT_FE);
|
||||||
|
|
||||||
if (usr == 0 || passes > 256)
|
/* Clear serial overrun and framing errors */
|
||||||
|
|
||||||
|
if ((usr & LPUART_STAT_OR) != 0)
|
||||||
{
|
{
|
||||||
return OK;
|
imxrt_serialout(priv, IMXRT_LPUART_STAT_OFFSET, LPUART_STAT_OR);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((usr & LPUART_STAT_FE) != 0)
|
||||||
|
{
|
||||||
|
imxrt_serialout(priv, IMXRT_LPUART_STAT_OFFSET, LPUART_STAT_FE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle incoming, receive bytes */
|
/* Handle incoming, receive bytes */
|
||||||
|
|
||||||
if (usr & LPUART_STAT_RDRF)
|
if ((usr & LPUART_STAT_RDRF) != 0 &&
|
||||||
|
(priv->ie & LPUART_CTRL_RIE) != 0)
|
||||||
{
|
{
|
||||||
uart_recvchars(dev);
|
uart_recvchars(dev);
|
||||||
|
handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle outgoing, transmit bytes */
|
/* Handle outgoing, transmit bytes */
|
||||||
|
|
||||||
if (usr & LPUART_STAT_TC)
|
if ((usr & LPUART_STAT_TC) != 0 &&
|
||||||
|
(priv->ie & LPUART_CTRL_TCIE) != 0)
|
||||||
{
|
{
|
||||||
uart_xmitchars(dev);
|
uart_xmitchars(dev);
|
||||||
|
handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Keep track of how many times we do this in case there
|
|
||||||
* is some hardware failure condition.
|
|
||||||
*/
|
|
||||||
|
|
||||||
passes++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -959,7 +973,7 @@ static int imxrt_receive(struct uart_dev_s *dev, uint32_t *status)
|
|||||||
struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv;
|
struct imxrt_uart_s *priv = (struct imxrt_uart_s *)dev->priv;
|
||||||
uint32_t rxd;
|
uint32_t rxd;
|
||||||
|
|
||||||
rxd = imxrt_serialin(priv, IMXRT_LPUART_DATA_OFFSET);
|
rxd = imxrt_serialin(priv, IMXRT_LPUART_DATA_OFFSET);
|
||||||
*status = rxd >> LPUART_DATA_STATUS_SHIFT;
|
*status = rxd >> LPUART_DATA_STATUS_SHIFT;
|
||||||
return (rxd & LPUART_DATA_MASK) >> LPUART_DATA_SHIFT;
|
return (rxd & LPUART_DATA_MASK) >> LPUART_DATA_SHIFT;
|
||||||
}
|
}
|
||||||
@@ -982,12 +996,12 @@ static void imxrt_rxint(struct uart_dev_s *dev, bool enable)
|
|||||||
if (enable)
|
if (enable)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_SUPPRESS_SERIAL_INTS
|
#ifndef CONFIG_SUPPRESS_SERIAL_INTS
|
||||||
priv->ie |= LPUART_CTRL_RIE;
|
priv->ie |= LPUART_CTRL_RIE | LPUART_CTRL_FEIE | LPUART_CTRL_ORIE;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
priv->ie &= ~LPUART_CTRL_RIE;
|
priv->ie &= ~ (LPUART_CTRL_RIE | LPUART_CTRL_FEIE | LPUART_CTRL_ORIE);
|
||||||
}
|
}
|
||||||
|
|
||||||
regval = (imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET) & ~LPUART_ALL_INTS) | priv->ie;
|
regval = (imxrt_serialin(priv, IMXRT_LPUART_CTRL_OFFSET) & ~LPUART_ALL_INTS) | priv->ie;
|
||||||
@@ -1104,7 +1118,6 @@ static bool imxrt_txempty(struct uart_dev_s *dev)
|
|||||||
* None - The driver already agreed to transition to the low power
|
* None - The driver already agreed to transition to the low power
|
||||||
* consumption state when when it returned OK to the prepare() call.
|
* consumption state when when it returned OK to the prepare() call.
|
||||||
*
|
*
|
||||||
*
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
|
|||||||
Reference in New Issue
Block a user