| 578 | } |
| 579 | |
| 580 | rt_inline int _serial_dma_tx(struct rt_serial_device *serial, const rt_uint8_t *data, int length) |
| 581 | { |
| 582 | rt_base_t level; |
| 583 | rt_err_t result; |
| 584 | struct rt_serial_tx_dma *tx_dma; |
| 585 | |
| 586 | tx_dma = (struct rt_serial_tx_dma*)(serial->serial_tx); |
| 587 | |
| 588 | result = rt_data_queue_push(&(tx_dma->data_queue), data, length, RT_WAITING_FOREVER); |
| 589 | if (result == RT_EOK) |
| 590 | { |
| 591 | level = rt_spin_lock_irqsave(&(serial->spinlock)); |
| 592 | if (tx_dma->activated != RT_TRUE) |
| 593 | { |
| 594 | tx_dma->activated = RT_TRUE; |
| 595 | rt_spin_unlock_irqrestore(&(serial->spinlock), level); |
| 596 | |
| 597 | /* make a DMA transfer */ |
| 598 | serial->ops->dma_transmit(serial, (rt_uint8_t *)data, length, RT_SERIAL_DMA_TX); |
| 599 | } |
| 600 | else |
| 601 | { |
| 602 | rt_spin_unlock_irqrestore(&(serial->spinlock), level); |
| 603 | } |
| 604 | |
| 605 | return length; |
| 606 | } |
| 607 | else |
| 608 | { |
| 609 | rt_set_errno(result); |
| 610 | return 0; |
| 611 | } |
| 612 | } |
| 613 | #endif /* RT_SERIAL_USING_DMA */ |
| 614 | |
| 615 | /* RT-Thread Device Interface */ |
no test coverage detected