* Serial DMA routines */
| 521 | * Serial DMA routines |
| 522 | */ |
| 523 | rt_inline int _serial_dma_rx(struct rt_serial_device *serial, rt_uint8_t *data, int length) |
| 524 | { |
| 525 | rt_base_t level; |
| 526 | |
| 527 | RT_ASSERT((serial != RT_NULL) && (data != RT_NULL)); |
| 528 | |
| 529 | level = rt_spin_lock_irqsave(&(serial->spinlock)); |
| 530 | |
| 531 | if (serial->config.bufsz == 0) |
| 532 | { |
| 533 | int result = RT_EOK; |
| 534 | struct rt_serial_rx_dma *rx_dma; |
| 535 | |
| 536 | rx_dma = (struct rt_serial_rx_dma*)serial->serial_rx; |
| 537 | RT_ASSERT(rx_dma != RT_NULL); |
| 538 | |
| 539 | if (rx_dma->activated != RT_TRUE) |
| 540 | { |
| 541 | rx_dma->activated = RT_TRUE; |
| 542 | RT_ASSERT(serial->ops->dma_transmit != RT_NULL); |
| 543 | serial->ops->dma_transmit(serial, data, length, RT_SERIAL_DMA_RX); |
| 544 | } |
| 545 | else result = -RT_EBUSY; |
| 546 | rt_spin_unlock_irqrestore(&(serial->spinlock), level); |
| 547 | |
| 548 | if (result == RT_EOK) return length; |
| 549 | |
| 550 | rt_set_errno(result); |
| 551 | return 0; |
| 552 | } |
| 553 | else |
| 554 | { |
| 555 | struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; |
| 556 | rt_size_t recv_len = 0, fifo_recved_len = rt_dma_calc_recved_len(serial); |
| 557 | |
| 558 | RT_ASSERT(rx_fifo != RT_NULL); |
| 559 | |
| 560 | if (length < (int)fifo_recved_len) |
| 561 | recv_len = length; |
| 562 | else |
| 563 | recv_len = fifo_recved_len; |
| 564 | |
| 565 | if (rx_fifo->get_index + recv_len < serial->config.bufsz) |
| 566 | rt_memcpy(data, rx_fifo->buffer + rx_fifo->get_index, recv_len); |
| 567 | else |
| 568 | { |
| 569 | rt_memcpy(data, rx_fifo->buffer + rx_fifo->get_index, |
| 570 | serial->config.bufsz - rx_fifo->get_index); |
| 571 | rt_memcpy(data + serial->config.bufsz - rx_fifo->get_index, rx_fifo->buffer, |
| 572 | recv_len + rx_fifo->get_index - serial->config.bufsz); |
| 573 | } |
| 574 | rt_dma_recv_update_get_index(serial, recv_len); |
| 575 | rt_spin_unlock_irqrestore(&(serial->spinlock), level); |
| 576 | return recv_len; |
| 577 | } |
| 578 | } |
| 579 | |
| 580 | rt_inline int _serial_dma_tx(struct rt_serial_device *serial, const rt_uint8_t *data, int length) |
no test coverage detected