/*
* $Log$
+ * Revision 1.3 2004/06/02 21:35:24 aleph
+ * Serial enhancements: interruptible receive handler and 8 bit serial status for AVR; remove volatile attribute to FIFOBuffer, useless for new fifobuf routens
+ *
* Revision 1.2 2004/05/23 18:21:53 bernie
* Trim CVS logs and cleanup header info.
*
port->is_open = false;
port->hw->table->cleanup(port->hw);
- port->hw = NULL;
+ port->hw = NULL;
}
/*
* $Log$
+ * Revision 1.3 2004/06/02 21:35:24 aleph
+ * Serial enhancements: interruptible receive handler and 8 bit serial status for AVR; remove volatile attribute to FIFOBuffer, useless for new fifobuf routens
+ *
* Revision 1.2 2004/05/23 18:21:53 bernie
* Trim CVS logs and cleanup header info.
*
*/
/*\{*/
#if defined(__AVR__)
+ typedef uint8_t serstatus_t;
+
/* Software errors */
#define SERRF_RXFIFOOVERRUN BV(0) /*!< Rx FIFO buffer overrun */
#define SERRF_RXTIMEOUT BV(5) /*!< Receive timeout */
#define SERRF_FRAMEERROR BV(4) /*!< Stop bit missing */
#define SERRF_PARITYERROR BV(7) /*!< Parity error */
#elif defined(__m56800__)
+ typedef uint16_t serstatus_t;
+
/* Software errors */
#define SERRF_RXFIFOOVERRUN BV(0) /*!< Rx FIFO buffer overrun */
#define SERRF_RXTIMEOUT BV(1) /*!< Receive timeout */
*
* \{
*/
- volatile FIFOBuffer txfifo;
- volatile FIFOBuffer rxfifo;
+ FIFOBuffer txfifo;
+ FIFOBuffer rxfifo;
unsigned char txbuffer[CONFIG_SER_TXBUFSIZE];
unsigned char rxbuffer[CONFIG_SER_RXBUFSIZE];
/* \} */
#endif
/*! Holds the flags defined above. Will be 0 when no errors have occurred. */
- REGISTER uint16_t status;
-
+ serstatus_t status;
+
/*! Low-level interface to hardware. */
struct SerialHardware* hw;
};
/*
* $Log$
+ * Revision 1.3 2004/06/02 21:35:24 aleph
+ * Serial enhancements: interruptible receive handler and 8 bit serial status for AVR; remove volatile attribute to FIFOBuffer, useless for new fifobuf routens
+ *
* Revision 1.2 2004/05/23 18:21:53 bernie
* Trim CVS logs and cleanup header info.
*
/*!
- * Serial 0 RX complete interrupt handler
+ * Serial 0 RX complete interrupt handler.
+ *
+ * This handler is interruptible.
+ * Interrupt are reenabled as soon as recv complete interrupt is
+ * disabled. Using INTERRUPT() is troublesome when the serial
+ * is heavily loaded, because and interrupt could be retriggered
+ * when executing the handler prologue before RXCIE is disabled.
*/
#ifdef __AVR_ATmega103__
SIGNAL(SIG_UART_RECV)
SIGNAL(SIG_UART0_RECV)
#endif
{
+ /* Disable Recv complete IRQ */
+ UCR &= ~BV(RXCIE);
+ ENABLE_INTS;
+
/* Should be read before UDR */
ser_handles[SER_UART0].status |= USR & (SERRF_RXSROVERRUN | SERRF_FRAMEERROR);
RTS_OFF;
#endif
}
+ /* Reenable receive complete int */
+ UCR |= BV(RXCIE);
}
/*!
- * Serial 1 RX complete interrupt handler
+ * Serial 1 RX complete interrupt handler.
+ *
+ * This handler is interruptible.
+ * Interrupt are reenabled as soon as recv complete interrupt is
+ * disabled. Using INTERRUPT() is troublesome when the serial
+ * is heavily loaded, because and interrupt could be retriggered
+ * when executing the handler prologue before RXCIE is disabled.
*/
#ifndef __AVR_ATmega103__
SIGNAL(SIG_UART1_RECV)
{
+ /* Disable Recv complete IRQ */
+ UCSR0B &= ~BV(RXCIE);
+ ENABLE_INTS;
+
/* Should be read before UDR */
ser_handles[SER_UART1].status |= UCSR1A & (SERRF_RXSROVERRUN | SERRF_FRAMEERROR);
RTS_OFF;
#endif
}
+ /* Reenable receive complete int */
+ UCSR0B |= BV(RXCIE);
}
#endif /* !__AVR_ATmega103__ */