queue_t xmt;\r
queue_t rcv;\r
int irq;\r
+ int buffered;\r
};\r
\r
/* Port data */\r
sirq_t *port = (sirq_t *)_port;\r
\r
// Handle transmit\r
- if (event == TxIrq && port->xmt.rix != port->xmt.wix) {\r
- int byte = port->xmt.buf[port->xmt.rix];\r
- serial_putc(&port->uart, byte);\r
- port->xmt.rix = (port->xmt.rix+1) % SIRQ_LEN;\r
- } else {\r
- serial_irq_set(&port->uart, TxIrq, 0);\r
- port->irq = 0;\r
+ // note: mbed seems to call TxIrq even it is not enabled,\r
+ // so we need to manually prevent transmitting when the\r
+ // port is set to buffered mode.\r
+ if (event == TxIrq && (port->irq || !port->buffered)) {\r
+ if (port->xmt.rix != port->xmt.wix) {\r
+ int byte = port->xmt.buf[port->xmt.rix];\r
+ serial_putc(&port->uart, byte);\r
+ port->xmt.rix = (port->xmt.rix+1) % SIRQ_LEN;\r
+ } else {\r
+ serial_irq_set(&port->uart, TxIrq, 0);\r
+ port->irq = 0;\r
+ }\r
}\r
\r
// Handle receive\r
}\r
\r
/* Open port */\r
-sirq_t *sirq_open(sirq_uart_t uart, PinName tx, PinName rx, int baud)\r
+sirq_t *sirq_open(sirq_uart_t uart, PinName tx, PinName rx, int baud, int buffered)\r
{\r
// Allocate port\r
sirq_t *port = &sirq_ports[uart];\r
\r
+ // Buffered ports only transmit on demand\r
+ port->buffered = buffered;\r
+\r
// Configure port\r
serial_init(&port->uart, tx, rx);\r
serial_baud(&port->uart, baud);\r
{\r
port->xmt.buf[port->xmt.wix] = byte;\r
port->xmt.wix = (port->xmt.wix+1) % SIRQ_LEN;\r
- if (!port->irq) {\r
- port->irq = 1;\r
- serial_irq_set(&port->uart, TxIrq, 1);\r
- }\r
+ if (!port->buffered)\r
+ sirq_transmit(port);\r
}\r
\r
/* Read byte from the port */\r
return byte;\r
}\r
\r
+/* Enable transmitter */\r
+void sirq_transmit(sirq_t *port)\r
+{\r
+ if (port->xmt.rix != port->xmt.wix && !port->irq) {\r
+ port->irq = 1;\r
+ serial_irq_set(&port->uart, TxIrq, 1);\r
+ }\r
+}\r
+\r
/* Buffered write */\r
void sirq_write(sirq_t *port, void *data, int len)\r
{\r