Lines Matching refs:serial
199 struct rt_serial_device *serial; in serial_fops_poll() local
204 serial = (struct rt_serial_device *)device; in serial_fops_poll()
215 rx_fifo = (struct rt_serial_rx_fifo*) serial->serial_rx; in serial_fops_poll()
217 level = rt_spin_lock_irqsave(&(serial->spinlock)); in serial_fops_poll()
220 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in serial_fops_poll()
240 rt_inline int _serial_poll_rx(struct rt_serial_device *serial, rt_uint8_t *data, int length) in _serial_poll_rx() argument
245 RT_ASSERT(serial != RT_NULL); in _serial_poll_rx()
250 ch = serial->ops->getc(serial); in _serial_poll_rx()
256 if(serial->parent.open_flag & RT_DEVICE_FLAG_STREAM) in _serial_poll_rx()
265 rt_inline int _serial_poll_tx(struct rt_serial_device *serial, const rt_uint8_t *data, int length) in _serial_poll_tx() argument
268 RT_ASSERT(serial != RT_NULL); in _serial_poll_tx()
277 if (*data == '\n' && (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)) in _serial_poll_tx()
279 serial->ops->putc(serial, '\r'); in _serial_poll_tx()
282 if(serial->ops->putc(serial, *data) < 0) { in _serial_poll_tx()
296 rt_inline int _serial_int_rx(struct rt_serial_device *serial, rt_uint8_t *data, int length) in _serial_int_rx() argument
301 RT_ASSERT(serial != RT_NULL); in _serial_int_rx()
304 rx_fifo = (struct rt_serial_rx_fifo*) serial->serial_rx; in _serial_int_rx()
308 if (serial->bypass) in _serial_int_rx()
310 rt_bypass_work_straight(serial); in _serial_int_rx()
314 if (!rt_bypass_getchar(serial, &ch)) in _serial_int_rx()
331 level = rt_spin_lock_irqsave(&(serial->spinlock)); in _serial_int_rx()
337 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _serial_int_rx()
344 if (rx_fifo->get_index >= serial->config.bufsz) rx_fifo->get_index = 0; in _serial_int_rx()
352 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _serial_int_rx()
361 rt_inline int _serial_int_tx(struct rt_serial_device *serial, const rt_uint8_t *data, int length) in _serial_int_tx() argument
366 RT_ASSERT(serial != RT_NULL); in _serial_int_tx()
369 tx = (struct rt_serial_tx_fifo*) serial->serial_tx; in _serial_int_tx()
378 if (*data == '\n' && (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)) in _serial_int_tx()
380 if (serial->ops->putc(serial, '\r') == -1) in _serial_int_tx()
387 while (serial->ops->putc(serial, *(char*)data) == -1) in _serial_int_tx()
413 static rt_ssize_t _serial_fifo_calc_recved_len(struct rt_serial_device *serial) in _serial_fifo_calc_recved_len() argument
415 struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; in _serial_fifo_calc_recved_len()
421 return (rx_fifo->is_full == RT_FALSE ? 0 : serial->config.bufsz); in _serial_fifo_calc_recved_len()
431 return serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index); in _serial_fifo_calc_recved_len()
445 static rt_ssize_t rt_dma_calc_recved_len(struct rt_serial_device *serial) in rt_dma_calc_recved_len() argument
447 return _serial_fifo_calc_recved_len(serial); in rt_dma_calc_recved_len()
456 static void rt_dma_recv_update_get_index(struct rt_serial_device *serial, rt_size_t len) in rt_dma_recv_update_get_index() argument
458 struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; in rt_dma_recv_update_get_index()
461 RT_ASSERT(len <= rt_dma_calc_recved_len(serial)); in rt_dma_recv_update_get_index()
466 if (rx_fifo->get_index >= serial->config.bufsz) in rt_dma_recv_update_get_index()
468 rx_fifo->get_index %= serial->config.bufsz; in rt_dma_recv_update_get_index()
478 static void rt_dma_recv_update_put_index(struct rt_serial_device *serial, rt_size_t len) in rt_dma_recv_update_put_index() argument
480 struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; in rt_dma_recv_update_put_index()
488 if (rx_fifo->put_index >= serial->config.bufsz) in rt_dma_recv_update_put_index()
490 rx_fifo->put_index %= serial->config.bufsz; in rt_dma_recv_update_put_index()
504 if (rx_fifo->put_index >= serial->config.bufsz) in rt_dma_recv_update_put_index()
506 rx_fifo->put_index %= serial->config.bufsz; in rt_dma_recv_update_put_index()
523 rt_inline int _serial_dma_rx(struct rt_serial_device *serial, rt_uint8_t *data, int length) in _serial_dma_rx() argument
527 RT_ASSERT((serial != RT_NULL) && (data != RT_NULL)); in _serial_dma_rx()
529 level = rt_spin_lock_irqsave(&(serial->spinlock)); in _serial_dma_rx()
531 if (serial->config.bufsz == 0) in _serial_dma_rx()
536 rx_dma = (struct rt_serial_rx_dma*)serial->serial_rx; in _serial_dma_rx()
542 RT_ASSERT(serial->ops->dma_transmit != RT_NULL); in _serial_dma_rx()
543 serial->ops->dma_transmit(serial, data, length, RT_SERIAL_DMA_RX); in _serial_dma_rx()
546 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _serial_dma_rx()
555 struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; in _serial_dma_rx()
556 rt_size_t recv_len = 0, fifo_recved_len = rt_dma_calc_recved_len(serial); in _serial_dma_rx()
565 if (rx_fifo->get_index + recv_len < serial->config.bufsz) in _serial_dma_rx()
570 serial->config.bufsz - rx_fifo->get_index); in _serial_dma_rx()
571 rt_memcpy(data + serial->config.bufsz - rx_fifo->get_index, rx_fifo->buffer, in _serial_dma_rx()
572 recv_len + rx_fifo->get_index - serial->config.bufsz); in _serial_dma_rx()
574 rt_dma_recv_update_get_index(serial, recv_len); in _serial_dma_rx()
575 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _serial_dma_rx()
580 rt_inline int _serial_dma_tx(struct rt_serial_device *serial, const rt_uint8_t *data, int length) in _serial_dma_tx() argument
586 tx_dma = (struct rt_serial_tx_dma*)(serial->serial_tx); in _serial_dma_tx()
591 level = rt_spin_lock_irqsave(&(serial->spinlock)); in _serial_dma_tx()
595 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _serial_dma_tx()
598 serial->ops->dma_transmit(serial, (rt_uint8_t *)data, length, RT_SERIAL_DMA_TX); in _serial_dma_tx()
602 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _serial_dma_tx()
622 struct rt_serial_device *serial; in rt_serial_init() local
625 serial = (struct rt_serial_device *)dev; in rt_serial_init()
628 serial->serial_rx = RT_NULL; in rt_serial_init()
629 serial->serial_tx = RT_NULL; in rt_serial_init()
631 rt_memset(&serial->rx_notify, 0, sizeof(struct rt_device_notify)); in rt_serial_init()
634 if (serial->ops->configure) in rt_serial_init()
635 result = serial->ops->configure(serial, &serial->config); in rt_serial_init()
643 struct rt_serial_device *serial; in rt_serial_open() local
646 serial = (struct rt_serial_device *)dev; in rt_serial_open()
673 if (serial->serial_rx == RT_NULL) in rt_serial_open()
680 serial->config.bufsz); in rt_serial_open()
683 rt_memset(rx_fifo->buffer, 0, serial->config.bufsz); in rt_serial_open()
688 serial->serial_rx = rx_fifo; in rt_serial_open()
691 serial->ops->control(serial, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_RX); in rt_serial_open()
696 if (serial->config.bufsz == 0) { in rt_serial_open()
703 serial->serial_rx = rx_dma; in rt_serial_open()
708 serial->config.bufsz); in rt_serial_open()
711 rt_memset(rx_fifo->buffer, 0, serial->config.bufsz); in rt_serial_open()
715 serial->serial_rx = rx_fifo; in rt_serial_open()
717 serial->ops->control(serial, RT_DEVICE_CTRL_CONFIG, (void *) RT_DEVICE_FLAG_DMA_RX); in rt_serial_open()
724 serial->serial_rx = RT_NULL; in rt_serial_open()
737 if (serial->serial_tx == RT_NULL) in rt_serial_open()
747 serial->serial_tx = tx_fifo; in rt_serial_open()
751 serial->ops->control(serial, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_TX); in rt_serial_open()
763 serial->serial_tx = tx_dma; in rt_serial_open()
767 serial->ops->control(serial, RT_DEVICE_CTRL_CONFIG, (void *)RT_DEVICE_FLAG_DMA_TX); in rt_serial_open()
772 serial->serial_tx = RT_NULL; in rt_serial_open()
793 struct rt_serial_device *serial; in rt_serial_close() local
796 serial = (struct rt_serial_device *)dev; in rt_serial_close()
806 serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_RX); in rt_serial_close()
809 rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; in rt_serial_close()
813 serial->serial_rx = RT_NULL; in rt_serial_close()
820 serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_RX); in rt_serial_close()
823 if (serial->config.bufsz == 0) in rt_serial_close()
827 rx_dma = (struct rt_serial_rx_dma*)serial->serial_rx; in rt_serial_close()
836 rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; in rt_serial_close()
841 serial->serial_rx = RT_NULL; in rt_serial_close()
850 serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void*)RT_DEVICE_FLAG_INT_TX); in rt_serial_close()
853 tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx; in rt_serial_close()
857 serial->serial_tx = RT_NULL; in rt_serial_close()
867 serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *) RT_DEVICE_FLAG_DMA_TX); in rt_serial_close()
870 tx_dma = (struct rt_serial_tx_dma*)serial->serial_tx; in rt_serial_close()
876 serial->serial_tx = RT_NULL; in rt_serial_close()
881 serial->ops->control(serial, RT_DEVICE_CTRL_CLOSE, RT_NULL); in rt_serial_close()
892 struct rt_serial_device *serial; in rt_serial_read() local
897 serial = (struct rt_serial_device *)dev; in rt_serial_read()
901 return _serial_int_rx(serial, (rt_uint8_t *)buffer, size); in rt_serial_read()
906 return _serial_dma_rx(serial, (rt_uint8_t *)buffer, size); in rt_serial_read()
910 return _serial_poll_rx(serial, (rt_uint8_t *)buffer, size); in rt_serial_read()
918 struct rt_serial_device *serial; in rt_serial_write() local
923 serial = (struct rt_serial_device *)dev; in rt_serial_write()
927 return _serial_int_tx(serial, (const rt_uint8_t *)buffer, size); in rt_serial_write()
932 return _serial_dma_tx(serial, (const rt_uint8_t *)buffer, size); in rt_serial_write()
937 return _serial_poll_tx(serial, (const rt_uint8_t *)buffer, size); in rt_serial_write()
998 static void _tc_flush(struct rt_serial_device *serial, int queue) in _tc_flush() argument
1005 RT_ASSERT(serial != RT_NULL); in _tc_flush()
1007 device = &(serial->parent); in _tc_flush()
1008 rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; in _tc_flush()
1020 level = rt_spin_lock_irqsave(&(serial->spinlock)); in _tc_flush()
1023 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in _tc_flush()
1029 ch = serial->ops->getc(serial); in _tc_flush()
1072 struct rt_serial_device *serial; in rt_serial_control() local
1075 serial = (struct rt_serial_device *)dev; in rt_serial_control()
1093 if (pconfig->bufsz != serial->config.bufsz && serial->parent.ref_count) in rt_serial_control()
1099 serial->config = *pconfig; in rt_serial_control()
1100 if (serial->parent.ref_count) in rt_serial_control()
1103 serial->ops->configure(serial, (struct serial_configure *) args); in rt_serial_control()
1110 rt_memcpy(&serial->rx_notify, args, sizeof(struct rt_device_notify)); in rt_serial_control()
1148 if (serial->config.data_bits == DATA_BITS_5) in rt_serial_control()
1150 else if (serial->config.data_bits == DATA_BITS_6) in rt_serial_control()
1152 else if (serial->config.data_bits == DATA_BITS_7) in rt_serial_control()
1154 else if (serial->config.data_bits == DATA_BITS_8) in rt_serial_control()
1157 if (serial->config.stop_bits == STOP_BITS_2) in rt_serial_control()
1160 if (serial->config.parity == PARITY_EVEN) in rt_serial_control()
1162 else if (serial->config.parity == PARITY_ODD) in rt_serial_control()
1165 cfsetospeed(tio, _get_speed(serial->config.baud_rate)); in rt_serial_control()
1196 config = serial->config; in rt_serial_control()
1226 serial->ops->configure(serial, &config); in rt_serial_control()
1234 _tc_flush(serial, queue); in rt_serial_control()
1338 level = rt_spin_lock_irqsave(&(serial->spinlock)); in rt_serial_control()
1339 recved = _serial_fifo_calc_recved_len(serial); in rt_serial_control()
1340 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in rt_serial_control()
1348 ret = serial->ops->control(serial, cmd, args); in rt_serial_control()
1370 rt_err_t rt_hw_serial_register(struct rt_serial_device *serial, in rt_hw_serial_register() argument
1377 RT_ASSERT(serial != RT_NULL); in rt_hw_serial_register()
1379 rt_spin_lock_init(&(serial->spinlock)); in rt_hw_serial_register()
1381 device = &(serial->parent); in rt_hw_serial_register()
1408 rt_hw_serial_register_tty(serial); in rt_hw_serial_register()
1415 void rt_hw_serial_isr(struct rt_serial_device *serial, int event) in rt_hw_serial_isr() argument
1426 rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; in rt_hw_serial_isr()
1431 ch = serial->ops->getc(serial); in rt_hw_serial_isr()
1436 …if (serial->bypass && serial->bypass->upper_h && (serial->bypass->upper_h->head.next != &serial->b… in rt_hw_serial_isr()
1441 rt_list_t* node = serial->bypass->upper_h->head.next; in rt_hw_serial_isr()
1444 ret = bypass_run->bypass(serial, buf, bypass_run->data); in rt_hw_serial_isr()
1451 } while (node != &serial->bypass->upper_h->head); in rt_hw_serial_isr()
1458 level = rt_spin_lock_irqsave(&(serial->spinlock)); in rt_hw_serial_isr()
1461 if (rx_fifo->put_index >= serial->config.bufsz) rx_fifo->put_index = 0; in rt_hw_serial_isr()
1473 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in rt_hw_serial_isr()
1477 if (serial->bypass && serial->bypass->lower_h) in rt_hw_serial_isr()
1478 rt_workqueue_dowork(serial->bypass->lower_workq, &serial->bypass->work); in rt_hw_serial_isr()
1481 if (serial->parent.rx_indicate != RT_NULL) in rt_hw_serial_isr()
1486 level = rt_spin_lock_irqsave(&(serial->spinlock)); in rt_hw_serial_isr()
1488 (serial->config.bufsz - (rx_fifo->get_index - rx_fifo->put_index)); in rt_hw_serial_isr()
1489 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in rt_hw_serial_isr()
1493 serial->parent.rx_indicate(&serial->parent, rx_length); in rt_hw_serial_isr()
1502 tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx; in rt_hw_serial_isr()
1514 tx_dma = (struct rt_serial_tx_dma*) serial->serial_tx; in rt_hw_serial_isr()
1521 … serial->ops->dma_transmit(serial, (rt_uint8_t *)data_ptr, data_size, RT_SERIAL_DMA_TX); in rt_hw_serial_isr()
1529 if (serial->parent.tx_complete != RT_NULL) in rt_hw_serial_isr()
1531 serial->parent.tx_complete(&serial->parent, (void*)last_data_ptr); in rt_hw_serial_isr()
1543 if (serial->config.bufsz == 0) in rt_hw_serial_isr()
1547 rx_dma = (struct rt_serial_rx_dma*) serial->serial_rx; in rt_hw_serial_isr()
1550 RT_ASSERT(serial->parent.rx_indicate != RT_NULL); in rt_hw_serial_isr()
1551 serial->parent.rx_indicate(&(serial->parent), length); in rt_hw_serial_isr()
1557 level = rt_spin_lock_irqsave(&(serial->spinlock)); in rt_hw_serial_isr()
1559 rt_dma_recv_update_put_index(serial, length); in rt_hw_serial_isr()
1561 length = rt_dma_calc_recved_len(serial); in rt_hw_serial_isr()
1563 rt_spin_unlock_irqrestore(&(serial->spinlock), level); in rt_hw_serial_isr()
1565 if (serial->parent.rx_indicate != RT_NULL) in rt_hw_serial_isr()
1567 serial->parent.rx_indicate(&(serial->parent), length); in rt_hw_serial_isr()