MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / _serial_dma_rx

Function _serial_dma_rx

components/drivers/serial/dev_serial.c:523–578  ·  view source on GitHub ↗

* Serial DMA routines */

Source from the content-addressed store, hash-verified

521 * Serial DMA routines
522 */
523rt_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
580rt_inline int _serial_dma_tx(struct rt_serial_device *serial, const rt_uint8_t *data, int length)

Callers 1

ifFunction · 0.85

Calls 6

rt_set_errnoFunction · 0.85
rt_dma_calc_recved_lenFunction · 0.85
rt_memcpyFunction · 0.85
rt_spin_lock_irqsaveFunction · 0.50

Tested by

no test coverage detected