5 #include "serial_api.h"
\r
6 #include "serial_irq.h"
\r
7 #include "timer_dma.h"
\r
10 #define SIRQ_LEN 1024
\r
12 /* Port structure */
\r
16 uint8_t buf[SIRQ_LEN];
\r
26 extern uint32_t test_xmt_enab;
\r
27 extern uint64_t test_xmt_time0;
\r
28 extern uint64_t test_xmt_time1;
\r
30 extern uint32_t test_rcv_enab;
\r
31 extern uint64_t test_rcv_time;
\r
34 static sirq_t sirq_ports[SIRQ_NUM_UART];
\r
36 /* Receive handler */
\r
37 void sirq_handler(uint32_t _port, SerialIrq event)
\r
39 sirq_t *port = (sirq_t *)_port;
\r
42 if (event == TxIrq && port->xmt.rix != port->xmt.wix) {
\r
43 int byte = port->xmt.buf[port->xmt.rix];
\r
45 uint64_t time0 = tdma_time();
\r
46 serial_putc(&port->uart, byte);
\r
47 uint64_t time1 = tdma_time();
\r
49 if (test_xmt_enab) {
\r
50 test_xmt_time0 = time0;
\r
51 test_xmt_time1 = time1;
\r
55 port->xmt.rix = (port->xmt.rix+1) % SIRQ_LEN;
\r
57 serial_irq_set(&port->uart, TxIrq, 0);
\r
61 if (event == RxIrq) {
\r
62 int byte = serial_getc(&port->uart);
\r
63 port->rcv.buf[port->rcv.wix] = byte;
\r
64 port->rcv.wix = (port->rcv.wix+1) % SIRQ_LEN;
\r
69 sirq_t *sirq_open(sirq_uart_t uart, PinName tx, PinName rx, int baud)
\r
72 sirq_t *port = &sirq_ports[uart];
\r
75 serial_init(&port->uart, tx, rx);
\r
76 serial_baud(&port->uart, baud);
\r
79 serial_irq_handler(&port->uart, sirq_handler, (uint32_t)port);
\r
80 serial_irq_set(&port->uart, RxIrq, 1);
\r
85 /* Write byte to the port */
\r
86 void sirq_putc(sirq_t *port, int byte)
\r
88 port->xmt.buf[port->xmt.wix] = byte;
\r
89 port->xmt.wix = (port->xmt.wix+1) % SIRQ_LEN;
\r
90 serial_irq_set(&port->uart, TxIrq, 1);
\r
93 /* Read byte from the port */
\r
94 int sirq_getc(sirq_t *port)
\r
97 if (port->rcv.rix != port->rcv.wix) {
\r
98 byte = port->rcv.buf[port->rcv.rix];
\r
99 port->rcv.rix = (port->rcv.rix+1) % SIRQ_LEN;
\r
104 /* Buffered write */
\r
105 void sirq_write(sirq_t *port, void *data, int len)
\r
107 uint8_t *bytes = (uint8_t*)data;
\r
108 for (int i = 0; i < len; i++)
\r
109 sirq_putc(port, bytes[i]);
\r
112 /* Check if port is writable */
\r
113 int sirq_ready(sirq_t *port)
\r
115 return port->rcv.rix != port->rcv.wix;
\r
119 void sirq_debug(sirq_t *port)
\r
121 sirq_printf("xmt - wix:%03x rix:%03x\r\n", port->xmt.wix, port->xmt.rix);
\r
122 sirq_printf("rcv - wix:%03x rix:%03x\r\n", port->rcv.wix, port->rcv.rix);
\r
123 sirq_printf("irq - ??\r\n");
\r
124 sirq_printf("uart - ??\r\n");
\r
126 // __IO uint8_t BDH;
\r
127 // __IO uint8_t BDL;
\r
128 // __IO uint8_t C1;
\r
129 // __IO uint8_t C2;
\r
130 // __IO uint8_t S1;
\r
131 // __IO uint8_t S2;
\r
132 // __IO uint8_t C3;
\r
133 // __IO uint8_t D;
\r
134 // __IO uint8_t MA1;
\r
135 // __IO uint8_t MA2;
\r
136 // __IO uint8_t C4;
\r
137 // __IO uint8_t C5;
\r
140 /* Write ASCII data to the output queue */
\r
141 void sirq_vprintf(const char *fmt, va_list ap)
\r
143 static char buf[512];
\r
144 int len = vsnprintf(buf, sizeof(buf), fmt, ap);
\r
145 for (int i = 0; i < len; i++)
\r
146 sirq_putc(&sirq_ports[0], buf[i]);
\r
149 void sirq_printf(const char *fmt, ...)
\r
153 sirq_vprintf(fmt, ap);
\r