FAST static void rx_isr(void *param) { /* TODO(alashkin): add errors checking */ unsigned int peri_reg = READ_PERI_REG(UART_INTR_STATUS(UART_MAIN)); static volatile int tail = 0; if ((peri_reg & UART_RXBUF_FULL) != 0 || (peri_reg & UART_RX_NEW) != 0) { int char_count, i; CLEAR_PERI_REG_MASK(UART_CTRL_INTR(UART_MAIN), UART_RXBUF_FULL | UART_RX_NEW); WRITE_PERI_REG(UART_CLEAR_INTR(UART_MAIN), UART_RXBUF_FULL | UART_RX_NEW); char_count = READ_PERI_REG(UART_DATA_STATUS(UART_MAIN)) & 0x000000FF; /* TODO(mkm): handle overrun */ for (i = 0; i < char_count; i++, tail = (tail + 1) % RX_BUFFER_SIZE) { rx_buf[tail] = READ_PERI_REG(UART_BUF(UART_MAIN)) & 0xFF; if (rx_buf[tail] == UART_SIGINT_CHAR && uart_interrupt_cb) { /* swallow the intr byte */ tail = (tail - 1) % RX_BUFFER_SIZE; uart_interrupt_cb(UART_SIGINT_CHAR); } } WRITE_PERI_REG(UART_CLEAR_INTR(UART_MAIN), UART_RXBUF_FULL | UART_RX_NEW); SET_PERI_REG_MASK(UART_CTRL_INTR(UART_MAIN), UART_RXBUF_FULL | UART_RX_NEW); #ifndef RTOS_SDK system_os_post(TASK_PRIORITY, 0, tail); #else rtos_dispatch_char_handler(tail); #endif } }
static void uart_tx_char(unsigned uartno, char ch) { while (1) { uint32 fifo_cnt = (READ_PERI_REG(UART_DATA_STATUS(uartno)) & 0x00FF0000) >> 16; if (fifo_cnt < 126) { break; } } WRITE_PERI_REG(UART_BUF(uartno), ch); }
int gdb_read_uart_buf(char *buf) { unsigned int peri_reg = READ_PERI_REG(UART_INTR_STATUS(UART_MAIN)); if ((peri_reg & UART_RXBUF_FULL) != 0 || (peri_reg & UART_RX_NEW) != 0) { int char_count, i; CLEAR_PERI_REG_MASK(UART_CTRL_INTR(UART_MAIN), UART_RXBUF_FULL | UART_RX_NEW); WRITE_PERI_REG(UART_CLEAR_INTR(UART_MAIN), UART_RXBUF_FULL | UART_RX_NEW); char_count = READ_PERI_REG(UART_DATA_STATUS(UART_MAIN)) & 0x000000FF; for (i = 0; i < char_count; i++) { buf[i] = READ_PERI_REG(UART_BUF(UART_MAIN)) & 0xFF; } WRITE_PERI_REG(UART_CLEAR_INTR(UART_MAIN), UART_RXBUF_FULL | UART_RX_NEW); SET_PERI_REG_MASK(UART_CTRL_INTR(UART_MAIN), UART_RXBUF_FULL | UART_RX_NEW); return char_count; } return 0; }
void uart_tx_char(unsigned uartno, char ch) { while (tx_fifo_len(uartno) > 126) { } WRITE_PERI_REG(UART_BUF(uartno), ch); }