static void imapx200_serial_stop_tx(struct uart_port *port) { struct imapx200_uart_port *ourport = to_ourport(port); if (tx_enabled(port)) { uart_disable_irq(port, UART_THRE_INT); uart_disable_irq(port, UART_TX_INT); tx_enabled(port) = 0; if (port->flags & UPF_CONS_FLOW) imapx200_serial_rx_enable(port); } }
static void imapx200_serial_stop_rx(struct uart_port *port) { struct imapx200_uart_port *ourport = to_ourport(port); if (rx_enabled(port)) { dbg("imapx200_serial_stop_rx: port=%p\n", port); disable_irq_nosync(ourport->rx_irq); #if 1 uart_disable_irq(port, UART_RX_INT); uart_disable_irq(port, UART_ERR_INT); #endif rx_enabled(port) = 0; } }
void rt_fh_uart_handler(int vector, void *param) { int status; unsigned int ret; struct fh_uart *uart; unsigned int reg_status; rt_device_t dev = (rt_device_t)param; uart = (struct fh_uart *)dev->user_data; status = uart_get_iir_status(uart->uart_port); if (status & UART_IIR_NOINT) { return; } if(status & UART_IIR_THREMPTY) { //first close tx isr uart_disable_irq(uart->uart_port,UART_IER_ETBEI); rt_hw_serial_isr((struct rt_serial_device *)dev, RT_SERIAL_EVENT_TX_DONE); } else if((status & UART_IIR_CHRTOUT)==UART_IIR_CHRTOUT) { //bug.... //if no data in rx fifo reg_status = uart_get_status(uart->uart_port); if((reg_status & 1<<3) == 0) ret = uart_getc(uart->uart_port); } else { rt_interrupt_enter(); rt_hw_serial_isr((struct rt_serial_device *)dev, RT_SERIAL_EVENT_RX_IND); rt_interrupt_leave(); } }
static void s3c_serial_stop_rx(struct uart_port *port) { if (rx_enabled(port)) { #ifdef UART_HAS_INTMSK uart_disable_irq(port, UART_RX_INT); #else disable_irq(RX_IRQ(port)); #endif rx_enabled(port) = 0; } }
static void s3c_serial_stop_tx(struct uart_port *port) { if (tx_enabled(port)) { #ifdef UART_HAS_INTMSK uart_disable_irq(port, UART_TX_INT); #else disable_irq(TX_IRQ(port)); #endif tx_enabled(port) = 0; if (port->flags & UPF_CONS_FLOW) s3c_serial_rx_enable(port); } }
static rt_err_t fh_uart_control(struct rt_serial_device *serial, int cmd, void *arg) { struct fh_uart* uart; RT_ASSERT(serial != RT_NULL); uart = (struct fh_uart *)serial->parent.user_data; switch (cmd) { case RT_DEVICE_CTRL_CLR_INT: /* disable rx irq */ rt_hw_interrupt_mask(uart->irq); uart_disable_irq(uart->uart_port,UART_IER_ERBFI); break; case RT_DEVICE_CTRL_SET_INT: /* enable rx irq */ rt_hw_interrupt_umask(uart->irq); uart_enable_irq(uart->uart_port,UART_IER_ERBFI); break; } return RT_EOK; }
/** * UART device in RT-Thread */ static rt_err_t fh_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) { int div; enum data_bits data_mode; enum stop_bits stop_mode; enum parity parity_mode; struct fh_uart *uart; RT_ASSERT(serial != RT_NULL); RT_ASSERT(cfg != RT_NULL); uart = (struct fh_uart *)serial->parent.user_data; switch (cfg->data_bits) { case DATA_BITS_8: data_mode = UART_DATA_BIT8; break; case DATA_BITS_7: data_mode = UART_DATA_BIT7; break; case DATA_BITS_6: data_mode = UART_DATA_BIT6; break; case DATA_BITS_5: data_mode = UART_DATA_BIT5; break; default: data_mode = UART_DATA_BIT8; break; } switch (cfg->stop_bits) { case STOP_BITS_2: stop_mode = UART_STOP_BIT2; break; case STOP_BITS_1: default: stop_mode = UART_STOP_BIT1; break; } switch (cfg->parity) { case PARITY_ODD: parity_mode = UART_PARITY_ODD; break; case PARITY_EVEN: parity_mode = UART_PARITY_EVEN; break; case PARITY_NONE: default: parity_mode = UART_PARITY_NONE; break; } uart_disable_irq(uart->uart_port, UART_IER_ERBFI); uart_configure(uart->uart_port, data_mode, stop_mode, parity_mode, cfg->baud_rate, UART_CLOCK_FREQ); uart_enable_irq(uart->uart_port, UART_IER_ERBFI); return RT_EOK; }