#include <stdio.h>\r
#include "serial_api.h"\r
#include "serial_irq.h"\r
+#include "timer_dma.h"\r
\r
/* Defines */\r
#define SIRQ_LEN 1024\r
serial_t uart;\r
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
+ // 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
- serial_irq_set(&port->uart, TxIrq, 1);\r
+ if (!port->buffered)\r
+ sirq_transmit(port);\r
}\r
\r
/* Read byte from the port */\r
int sirq_getc(sirq_t *port)\r
{\r
int byte = 0;\r
- if (port->rcv.rix < port->rcv.wix) {\r
+ if (port->rcv.rix != port->rcv.wix) {\r
byte = port->rcv.buf[port->rcv.rix];\r
port->rcv.rix = (port->rcv.rix+1) % SIRQ_LEN;\r
}\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
/* Check if port is writable */\r
int sirq_ready(sirq_t *port)\r
{\r
- return port->rcv.rix < port->rcv.wix;\r
+ return port->rcv.rix != port->rcv.wix;\r
+}\r
+\r
+/* Debug print */\r
+void sirq_debug(sirq_t *port)\r
+{\r
+ sirq_printf("xmt - wix:%03x rix:%03x\r\n", port->xmt.wix, port->xmt.rix);\r
+ sirq_printf("rcv - wix:%03x rix:%03x\r\n", port->rcv.wix, port->rcv.rix);\r
+ sirq_printf("irq - ??\r\n");\r
+ sirq_printf("uart - ??\r\n");\r
+\r
+ // __IO uint8_t BDH; \r
+ // __IO uint8_t BDL; \r
+ // __IO uint8_t C1; \r
+ // __IO uint8_t C2; \r
+ // __IO uint8_t S1; \r
+ // __IO uint8_t S2; \r
+ // __IO uint8_t C3; \r
+ // __IO uint8_t D; \r
+ // __IO uint8_t MA1; \r
+ // __IO uint8_t MA2; \r
+ // __IO uint8_t C4; \r
+ // __IO uint8_t C5; \r
}\r
\r
/* Write ASCII data to the output queue */\r