/*#*
*#* $Log$
+ *#* Revision 1.19 2004/10/19 08:14:13 bernie
+ *#* Fix a few longstanding bugs wrt status handling (made by rasky on scfirm).
+ *#*
+ *#* Revision 1.18 2004/09/20 03:31:15 bernie
+ *#* Sanitize for C++.
+ *#*
+ *#* Revision 1.17 2004/09/14 21:06:07 bernie
+ *#* Use debug.h instead of kdebug.h; Spelling fixes.
+ *#*
+ *#* Revision 1.16 2004/09/06 21:40:50 bernie
+ *#* Move buffer handling in chip-specific driver.
+ *#*
*#* Revision 1.15 2004/08/25 14:12:08 rasky
*#* Aggiornato il comment block dei log RCS
*#*
*#*/
#include <mware/formatwr.h>
-#include <drv/kdebug.h>
+#include <debug.h>
#include "ser.h"
#include "ser_p.h"
#include "hw.h"
*/
int ser_putchar(int c, struct Serial *port)
{
+ //ASSERT_VALID_FIFO(&port->txfifo);
if (fifo_isfull_locked(&port->txfifo))
{
#if CONFIG_SER_TXTIMEOUT != -1
/* (re)trigger tx interrupt */
port->hw->table->enabletxirq(port->hw);
- /* Avoid returning signed estended char */
+ /* Avoid returning signed extended char */
return (int)((unsigned char)c);
}
}
#endif /* CONFIG_SER_RXTIMEOUT */
}
- while (fifo_isempty_locked(&port->rxfifo));
+ while (fifo_isempty_locked(&port->rxfifo) && (port->status & SERRF_RX) == 0);
}
/*
* Get a byte from the FIFO (avoiding sign-extension),
* re-enable RTS, then return result.
*/
- result = (int)(unsigned char)fifo_pop(&port->rxfifo);
- return port->status ? EOF : result;
+ if (port->status & SERRF_RX)
+ return EOF;
+ return (int)(unsigned char)fifo_pop_locked(&port->rxfifo);
}
return EOF;
/* NOTE: the double cast prevents unwanted sign extension */
- return (int)(unsigned char)fifo_pop(&port->rxfifo);
+ return (int)(unsigned char)fifo_pop_locked(&port->rxfifo);
}
*/
int ser_write(struct Serial *port, const void *_buf, size_t len)
{
- const char *buf = _buf;
+ const char *buf = (const char *)_buf;
while (len--)
{
va_list ap;
int len;
- ser_setstatus(port, 0);
va_start(ap, format);
len = _formatted_write(format, (void (*)(char, void *))ser_putchar, port, ap);
va_end(ap);
#if CONFIG_SER_RXTIMEOUT != -1
/*!
- * Discard input to resynchronize with remote end
+ * Discard input to resynchronize with remote end.
*
* Discard incoming data until the port stops receiving
* characters for at least \a delay milliseconds.
port->unit = unit;
- /* Initialize circular buffer */
- fifo_init(&port->rxfifo, port->rxbuffer, sizeof(port->rxbuffer));
- fifo_init(&port->txfifo, port->txbuffer, sizeof(port->txbuffer));
-
port->hw = ser_hw_getdesc(unit);
+
+ /* Initialize circular buffers */
+ ASSERT(port->hw->txbuffer);
+ ASSERT(port->hw->rxbuffer);
+ fifo_init(&port->txfifo, port->hw->txbuffer, port->hw->txbuffer_size);
+ fifo_init(&port->rxfifo, port->hw->rxbuffer, port->hw->rxbuffer_size);
+
port->hw->table->init(port->hw, port);
/* Set default values */