static _INLINE_ void transmit_chars(struct bf535_serial *info) { int idx = info->hub2; if (info->x_char) { /* Send next char */ local_put_char(idx, info->x_char); info->x_char = 0; goto clear_and_return; } if((info->xmit_cnt <= 0) || info->tty->stopped) { /* TX ints off */ ACCESS_PORT_IER(idx) /* Change access to IER & data port */ UART_IER(idx) &= ~UART_IER_ETBEI; goto clear_and_return; } /* Send char */ local_put_char(idx,info->xmit_buf[info->xmit_tail++]); info->xmit_tail = info->xmit_tail & (SERIAL_XMIT_SIZE-1); info->xmit_cnt--; if (info->xmit_cnt < WAKEUP_CHARS) rs_sched_event(info, RS_EVENT_WRITE_WAKEUP); if(info->xmit_cnt <= 0) { /* All done for now... TX ints off */ ACCESS_PORT_IER(idx) /* Change access to IER & data port */ UART_IER(idx) &= ~UART_IER_ETBEI; goto clear_and_return; } clear_and_return: /* Clear interrupt (should be auto)*/ return; }
void serial_putc(const char c) { if ((*pUART_LSR) & UART_LSR_TEMT) { if (c == '\n') serial_putc('\r'); local_put_char(c); } while (!((*pUART_LSR) & UART_LSR_TEMT)) SYNC_ALL; return; }