Fix some Z16F serial bugs
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@582 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
46f139066c
commit
8aa92af787
11
TODO
11
TODO
@ -21,7 +21,7 @@ NuttX TODO List (Last updated January 6, 2008)
|
|||||||
(2) ARM/LPC214x (arch/arm/src/lpc214x/)
|
(2) ARM/LPC214x (arch/arm/src/lpc214x/)
|
||||||
(4) pjrc-8052 / MCS51 (arch/pjrc-8051/)
|
(4) pjrc-8052 / MCS51 (arch/pjrc-8051/)
|
||||||
(2) z80 (arch/z80/)
|
(2) z80 (arch/z80/)
|
||||||
(1) z16 (arch/z16/)
|
(2) z16 (arch/z16/)
|
||||||
|
|
||||||
o Task/Scheduler (sched/)
|
o Task/Scheduler (sched/)
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
@ -373,3 +373,12 @@ o z16 (arch/z16)
|
|||||||
Status: Open
|
Status: Open
|
||||||
Priority: Low, thought to be cosmetic. I think this is a consequence of
|
Priority: Low, thought to be cosmetic. I think this is a consequence of
|
||||||
replacing vs. inserting the library.
|
replacing vs. inserting the library.
|
||||||
|
|
||||||
|
Description: When the interrupt-driven serial driver is used, the system
|
||||||
|
hangs. This is because of TX ready (TRDE) interrupts that
|
||||||
|
get lost while interrupts are disabled. The existing
|
||||||
|
serial driver appears to be limited to hardware with a
|
||||||
|
latching, level-sensitive TX ready interrupt.
|
||||||
|
Status: Open
|
||||||
|
Priority: Medium. A polled, write-only serial driver is used in the
|
||||||
|
interim for system testing.
|
||||||
|
@ -68,6 +68,10 @@
|
|||||||
extern _Erom unsigned long SYS_CLK_FREQ;
|
extern _Erom unsigned long SYS_CLK_FREQ;
|
||||||
#define _DEFCLK ((unsigned long)&SYS_CLK_FREQ)
|
#define _DEFCLK ((unsigned long)&SYS_CLK_FREQ)
|
||||||
|
|
||||||
|
#define STATE_DISABLED 0
|
||||||
|
#define STATE_RXENABLED 1
|
||||||
|
#define STATE_TXENABLED 2
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Types
|
* Private Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -246,7 +250,8 @@ static ubyte z16f_disableuartirq(struct uart_dev_s *dev)
|
|||||||
{
|
{
|
||||||
struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv;
|
struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv;
|
||||||
irqstate_t flags = irqsave();
|
irqstate_t flags = irqsave();
|
||||||
ubyte state = priv->rxenabled ? 1 : 0 | priv->txenabled ? 2 : 0;
|
ubyte state = priv->rxenabled ? STATE_RXENABLED : STATE_DISABLED | \
|
||||||
|
priv->txenabled ? STATE_TXENABLED : STATE_DISABLED;
|
||||||
|
|
||||||
z16f_txint(dev, FALSE);
|
z16f_txint(dev, FALSE);
|
||||||
z16f_rxint(dev, FALSE);
|
z16f_rxint(dev, FALSE);
|
||||||
@ -264,27 +269,29 @@ static void z16f_restoreuartirq(struct uart_dev_s *dev, ubyte state)
|
|||||||
struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv;
|
struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv;
|
||||||
irqstate_t flags = irqsave();
|
irqstate_t flags = irqsave();
|
||||||
|
|
||||||
z16f_txint(dev, (state & 2) ? TRUE : FALSE);
|
z16f_txint(dev, (state & STATE_TXENABLED) ? TRUE : FALSE);
|
||||||
z16f_rxint(dev, (state & 1) ? TRUE : FALSE);
|
z16f_rxint(dev, (state & STATE_RXENABLED) ? TRUE : FALSE);
|
||||||
|
|
||||||
irqrestore(flags);
|
irqrestore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: z16f_waittx
|
* Name: z16f_consoleput
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void z16f_waittx(struct uart_dev_s *dev, boolean (*status)(struct uart_dev_s *))
|
static void z16f_consoleput(ubyte ch)
|
||||||
{
|
{
|
||||||
|
struct z16f_uart_s *priv = (struct z16f_uart_s*)CONSOLE_DEV.priv;
|
||||||
int tmp;
|
int tmp;
|
||||||
|
|
||||||
for (tmp = 1000 ; tmp > 0 ; tmp--)
|
for (tmp = 1000 ; tmp > 0 ; tmp--)
|
||||||
{
|
{
|
||||||
if (status(dev))
|
if (z16f_txready(&CONSOLE_DEV))
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
putreg8(ch, priv->uartbase + Z16F_UART_TXD);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -379,23 +386,16 @@ static int z16f_attach(struct uart_dev_s *dev)
|
|||||||
/* Attach the RX IRQ */
|
/* Attach the RX IRQ */
|
||||||
|
|
||||||
ret = irq_attach(priv->rxirq, z16f_rxinterrupt);
|
ret = irq_attach(priv->rxirq, z16f_rxinterrupt);
|
||||||
if (ret != OK)
|
if (ret == OK)
|
||||||
{
|
{
|
||||||
goto errout;
|
/* Attach the TX IRQ */
|
||||||
|
|
||||||
|
ret = irq_attach(priv->txirq, z16f_txinterrupt);
|
||||||
|
if (ret != OK)
|
||||||
|
{
|
||||||
|
irq_detach(priv->rxirq);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Attach the TX IRQ */
|
|
||||||
|
|
||||||
ret = irq_attach(priv->txirq, z16f_txinterrupt);
|
|
||||||
if (ret != OK)
|
|
||||||
{
|
|
||||||
goto errout_with_rxirq;
|
|
||||||
}
|
|
||||||
return OK;
|
|
||||||
|
|
||||||
errout_with_rxirq:
|
|
||||||
irq_detach(priv->rxirq);
|
|
||||||
errout:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,7 +598,7 @@ static boolean z16f_rxavailable(struct uart_dev_s *dev)
|
|||||||
static void z16f_send(struct uart_dev_s *dev, int ch)
|
static void z16f_send(struct uart_dev_s *dev, int ch)
|
||||||
{
|
{
|
||||||
struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv;
|
struct z16f_uart_s *priv = (struct z16f_uart_s*)dev->priv;
|
||||||
putreg8(ch, priv->uartbase + Z16F_UART1_TXD);
|
putreg8(ch, priv->uartbase + Z16F_UART_TXD);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -707,7 +707,6 @@ void up_serialinit(void)
|
|||||||
|
|
||||||
int up_putc(int ch)
|
int up_putc(int ch)
|
||||||
{
|
{
|
||||||
struct z16f_uart_s *priv = (struct z16f_uart_s*)CONSOLE_DEV.priv;
|
|
||||||
ubyte state;
|
ubyte state;
|
||||||
|
|
||||||
/* Keep interrupts disabled so that we do not interfere with normal
|
/* Keep interrupts disabled so that we do not interfere with normal
|
||||||
@ -722,20 +721,18 @@ int up_putc(int ch)
|
|||||||
{
|
{
|
||||||
/* Add CR before LF */
|
/* Add CR before LF */
|
||||||
|
|
||||||
z16f_waittx(&CONSOLE_DEV, z16f_txready);
|
z16f_consoleput('\r');
|
||||||
putreg8('\r', priv->uartbase + Z16F_UART_TXD);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Output the character */
|
/* Output the character */
|
||||||
|
|
||||||
z16f_waittx(&CONSOLE_DEV, z16f_txready);
|
z16f_consoleput((ubyte)ch);
|
||||||
putreg8((ubyte)ch, priv->uartbase + Z16F_UART_TXD);
|
|
||||||
|
|
||||||
/* Now wait for all queue TX data to drain before restoring interrupts. The
|
/* It is important to restore the TX interrupt while the send is pending.
|
||||||
* driver should receive one txdone interrupt which it may or may not ignore.
|
* otherwise, TRDE interrupts can be lost since they do not pend after the
|
||||||
|
* TRDE false->true transition.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
z16f_waittx(&CONSOLE_DEV, z16f_txempty);
|
|
||||||
z16f_restoreuartirq(&CONSOLE_DEV, state);
|
z16f_restoreuartirq(&CONSOLE_DEV, state);
|
||||||
return ch;
|
return ch;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch.h
|
* arch.h
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -14,7 +14,7 @@
|
|||||||
* notice, this list of conditions and the following disclaimer in
|
* notice, this list of conditions and the following disclaimer in
|
||||||
* the documentation and/or other materials provided with the
|
* the documentation and/or other materials provided with the
|
||||||
* distribution.
|
* distribution.
|
||||||
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
|
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||||
* used to endorse or promote products derived from this software
|
* used to endorse or promote products derived from this software
|
||||||
* without specific prior written permission.
|
* without specific prior written permission.
|
||||||
*
|
*
|
||||||
@ -460,9 +460,7 @@ EXTERN void up_udelay(unsigned int microseconds);
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
# ifdef CONFIG_ARCH_LOWPUTC
|
|
||||||
EXTERN int up_putc(int ch);
|
EXTERN int up_putc(int ch);
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef EXTERN
|
#undef EXTERN
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/************************************************************
|
/****************************************************************************
|
||||||
* lib_fflush.c
|
* lib_fflush.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007, 2008 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -14,7 +14,7 @@
|
|||||||
* notice, this list of conditions and the following disclaimer in
|
* notice, this list of conditions and the following disclaimer in
|
||||||
* the documentation and/or other materials provided with the
|
* the documentation and/or other materials provided with the
|
||||||
* distribution.
|
* distribution.
|
||||||
* 3. Neither the name Gregory Nutt nor the names of its contributors may be
|
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||||
* used to endorse or promote products derived from this software
|
* used to endorse or promote products derived from this software
|
||||||
* without specific prior written permission.
|
* without specific prior written permission.
|
||||||
*
|
*
|
||||||
@ -31,15 +31,15 @@
|
|||||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Compilation Switches
|
* Compilation Switches
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Included Files
|
* Included Files
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <nuttx/config.h> /* for CONFIG_STDIO_BUFFER_SIZE */
|
#include <nuttx/config.h> /* for CONFIG_STDIO_BUFFER_SIZE */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@ -49,44 +49,44 @@
|
|||||||
#include <nuttx/fs.h>
|
#include <nuttx/fs.h>
|
||||||
#include "lib_internal.h"
|
#include "lib_internal.h"
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Definitions
|
* Definitions
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Private Type Declarations
|
* Private Type Declarations
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Private Function Prototypes
|
* Private Function Prototypes
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Global Constant Data
|
* Global Constant Data
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Global Variables
|
* Global Variables
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Private Constant Data
|
* Private Constant Data
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Private Variables
|
* Private Variables
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Global Functions
|
* Global Functions
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Name: lib_fflushall
|
* Name: lib_fflushall
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Called by the OS when a task exits
|
* Called by the OS when a task exits
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void lib_flushall(FAR struct streamlist *list)
|
void lib_flushall(FAR struct streamlist *list)
|
||||||
{
|
{
|
||||||
@ -115,9 +115,9 @@ void lib_flushall(FAR struct streamlist *list)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************************************************
|
/****************************************************************************
|
||||||
* Name: fflush
|
* Name: fflush
|
||||||
************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
int fflush(FILE *stream)
|
int fflush(FILE *stream)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user