* 38400bps on a 16MHz 80196.
*
* MODULE CONFIGURATION
- * \li \c CONFIG_SER_HWHANDSHAKE define this preprocessor symbol to enable
- * support for RTS/CTS handshake. Support is incomplete/untested
- * for 80196.
+ *
+ * \li \c CONFIG_SER_HWHANDSHAKE - set to 1 to enable RTS/CTS handshake.
+ * Support is incomplete/untested.
* \li \c CONFIG_SER_TXTIMEOUT - Enable software serial transmission timeouts
*
*
/*
* $Log$
+ * 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().
+ *
+ * Revision 1.9 2004/08/08 06:06:20 bernie
+ * Use new-style CONFIG_ idiom; Fix module-wide documentation.
+ *
* Revision 1.8 2004/07/29 22:57:09 bernie
* ser_drain(): New function; Make Serial::is_open a debug-only feature; Switch to new-style CONFIG_* macros.
*
if (fifo_isfull_locked(&port->txfifo))
{
#if CONFIG_SER_TXTIMEOUT != -1
- time_t start_time = timer_gettick();
+ time_t start_time = timer_ticks();
#endif
/* Attende finche' il buffer e' pieno... */
do
{
-#ifdef CONFIG_KERN_SCHED
+#if defined(CONFIG_KERN_SCHED) && CONFIG_KERN_SCHED
/* Give up timeslice to other processes. */
proc_switch();
#endif
#if CONFIG_SER_TXTIMEOUT != -1
- if (timer_gettick() - start_time >= port->txtimeout)
+ if (timer_ticks() - start_time >= port->txtimeout)
{
port->status |= SERRF_TXTIMEOUT;
return EOF;
if (fifo_isempty_locked(&port->rxfifo))
{
#if CONFIG_SER_RXTIMEOUT != -1
- time_t start_time = timer_gettick();
+ time_t start_time = timer_ticks();
#endif
/* Wait while buffer is empty */
do
proc_switch();
#endif
#if CONFIG_SER_RXTIMEOUT != -1
- if (timer_gettick() - start_time >= port->rxtimeout)
+ if (timer_ticks() - start_time >= port->rxtimeout)
{
port->status |= SERRF_RXTIMEOUT;
return EOF;
}
#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(delay, ser->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(old_rxtimeout, ser->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. */