projects
/
bertos.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Doxygen fixes.
[bertos.git]
/
drv
/
ser.c
diff --git
a/drv/ser.c
b/drv/ser.c
index 4da6c5bc7da2139237a0480d60e60cd767028ddb..dbde1aa0f63eafbe7d48d0a8329ef5d73734845d 100755
(executable)
--- a/
drv/ser.c
+++ b/
drv/ser.c
@@
-28,6
+28,12
@@
/*#*
*#* $Log$
/*#*
*#* $Log$
+ *#* Revision 1.24 2005/01/21 20:13:15 aleph
+ *#* Fix drain at ser_close()
+ *#*
+ *#* Revision 1.23 2005/01/14 00:47:07 aleph
+ *#* ser_drain(): Wait for hw transmission complete.
+ *#*
*#* Revision 1.22 2004/12/08 08:56:14 bernie
*#* Rename time_t to mtime_t.
*#*
*#* Revision 1.22 2004/12/08 08:56:14 bernie
*#* Rename time_t to mtime_t.
*#*
@@
-178,7
+184,7
@@
int ser_putchar(int c, struct Serial *port)
fifo_push_locked(&port->txfifo, (unsigned char)c);
/* (re)trigger tx interrupt */
fifo_push_locked(&port->txfifo, (unsigned char)c);
/* (re)trigger tx interrupt */
- port->hw->table->
enabletxirq
(port->hw);
+ port->hw->table->
txStart
(port->hw);
/* Avoid returning signed extended char */
return (int)((unsigned char)c);
/* Avoid returning signed extended char */
return (int)((unsigned char)c);
@@
-409,13
+415,13
@@
void ser_resync(struct Serial *port, mtime_t delay)
void ser_setbaudrate(struct Serial *port, unsigned long rate)
{
void ser_setbaudrate(struct Serial *port, unsigned long rate)
{
- port->hw->table->set
b
audrate(port->hw, rate);
+ port->hw->table->set
B
audrate(port->hw, rate);
}
void ser_setparity(struct Serial *port, int parity)
{
}
void ser_setparity(struct Serial *port, int parity)
{
- port->hw->table->set
p
arity(port->hw, parity);
+ port->hw->table->set
P
arity(port->hw, parity);
}
}
@@
-439,7
+445,12
@@
void ser_purge(struct Serial *port)
*/
void ser_drain(struct Serial *ser)
{
*/
void ser_drain(struct Serial *ser)
{
- while (!fifo_isempty(&ser->txfifo))
+ /*
+ * Wait until the FIFO is empty, and then until the byte currently in
+ * the hardware register gets shifted out.
+ */
+ while (!fifo_isempty(&ser->txfifo)
+ || ser->hw->table->txSending(ser->hw))
{
#if CONFIG_KERNEL && CONFIG_KERN_SCHED
/* Give up timeslice to other processes. */
{
#if CONFIG_KERNEL && CONFIG_KERN_SCHED
/* Give up timeslice to other processes. */
@@
-497,6
+508,15
@@
void ser_close(struct Serial *port)
ASSERT(port->is_open);
DB(port->is_open = false;)
ASSERT(port->is_open);
DB(port->is_open = false;)
+ // Wait until we finish sending everything
+ ser_drain(port);
+
port->hw->table->cleanup(port->hw);
port->hw->table->cleanup(port->hw);
- port->hw = NULL;
+ DB(port->hw = NULL;)
+
+ /*
+ * We purge the FIFO buffer only after the low-level cleanup, so that
+ * we are sure that there are no more interrupts.
+ */
+ ser_purge(port);
}
}