/*
* $Log$
+ * Revision 1.14 2004/08/24 16:22:57 bernie
+ * Thinkos; Doxygen fixes
+ *
+ * Revision 1.13 2004/08/24 16:20:48 bernie
+ * ser_read(): Make buffer argument void * for consistency with ANSI C and ser_write()
+ *
+ * Revision 1.12 2004/08/24 13:49:39 bernie
+ * Fix thinko.
+ *
+ * Revision 1.11 2004/08/15 05:32:22 bernie
+ * ser_resync(): New function.
+ *
* Revision 1.10 2004/08/10 06:29:50 bernie
* Rename timer_gettick() to timer_ticks().
*
/*!
- * Read at most size bytes and puts them
- * in buf.
- * \return number of bytes read or EOF in case
- * of error.
+ * Read at most \a size bytes from \a port and put them in \a buf
+ *
+ * \return number of bytes actually read, or EOF in
+ * case of error.
*/
-int ser_read(struct Serial *port, char *buf, size_t size)
+int ser_read(struct Serial *port, void *buf, size_t size)
{
size_t i = 0;
+ char *_buf = (char *)buf;
int c;
while (i < size)
{
if ((c = ser_getchar(port)) == EOF)
return EOF;
- buf[i++] = c;
+ _buf[i++] = c;
}
return i;
}
#endif /* CONFIG_SER_RXTIMEOUT || CONFIG_SER_TXTIMEOUT */
+#if CONFIG_SER_RXTIMEOUT != -1
+/*!
+ * Discard input to resynchronize with remote end
+ *
+ * Discard incoming data until the port stops receiving
+ * characters for at least \a delay milliseconds.
+ *
+ * \note Serial errors are reset before and after executing the purge.
+ */
+void ser_resync(struct Serial *port, time_t delay)
+{
+ time_t old_rxtimeout = port->rxtimeout;
+
+ ser_settimeouts(port, delay, port->txtimeout);
+ do
+ {
+ ser_setstatus(port, 0);
+ ser_getchar(port);
+ }
+ while (!(ser_getstatus(port) & SERRF_RXTIMEOUT));
+
+ /* Restore port to an usable status */
+ ser_setstatus(port, 0);
+ ser_settimeouts(port, old_rxtimeout, port->txtimeout);
+}
+#endif /* CONFIG_SER_RXTIMEOUT */
+
void ser_setbaudrate(struct Serial *port, unsigned long rate)
{
/*!
* Flush both the RX and TX buffers.
*/
-void ser_purge(struct Serial *ser)
+void ser_purge(struct Serial *port)
{
- fifo_flush_locked(&ser->rxfifo);
- fifo_flush_locked(&ser->txfifo);
+ fifo_flush_locked(&port->rxfifo);
+ fifo_flush_locked(&port->txfifo);
}
+
/*!
* Wait until all pending output is completely
* transmitted to the other end.
*/
void ser_drain(struct Serial *ser)
{
- while(!fifo_isempty(&ser->txfifo))
+ while (!fifo_isempty(&ser->txfifo))
{
#if defined(CONFIG_KERN_SCHED) && CONFIG_KERN_SCHED
/* Give up timeslice to other processes. */