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

Function rt_serial_open

components/drivers/serial/dev_serial.c:640–789  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

638}
639
640static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag)
641{
642 rt_uint16_t stream_flag = 0;
643 struct rt_serial_device *serial;
644
645 RT_ASSERT(dev != RT_NULL);
646 serial = (struct rt_serial_device *)dev;
647
648 LOG_D("open serial device: 0x%08x with open flag: 0x%04x",
649 dev, oflag);
650 /* check device flag with the open flag */
651 if ((oflag & RT_DEVICE_FLAG_DMA_RX) && !(dev->flag & RT_DEVICE_FLAG_DMA_RX))
652 return -RT_EIO;
653 if ((oflag & RT_DEVICE_FLAG_DMA_TX) && !(dev->flag & RT_DEVICE_FLAG_DMA_TX))
654 return -RT_EIO;
655 if ((oflag & RT_DEVICE_FLAG_INT_RX) && !(dev->flag & RT_DEVICE_FLAG_INT_RX))
656 return -RT_EIO;
657 if ((oflag & RT_DEVICE_FLAG_INT_TX) && !(dev->flag & RT_DEVICE_FLAG_INT_TX))
658 return -RT_EIO;
659
660 /* keep steam flag */
661 if ((oflag & RT_DEVICE_FLAG_STREAM) || (dev->open_flag & RT_DEVICE_FLAG_STREAM))
662 stream_flag = RT_DEVICE_FLAG_STREAM;
663
664 /* get open flags */
665 dev->open_flag = oflag & 0xff;
666
667#ifdef RT_USING_PINCTRL
668 /* initialize iomux in DM */
669 rt_pin_ctrl_confs_apply_by_name(dev, RT_NULL);
670#endif
671
672 /* initialize the Rx/Tx structure according to open flag */
673 if (serial->serial_rx == RT_NULL)
674 {
675 if (oflag & RT_DEVICE_FLAG_INT_RX)
676 {
677 struct rt_serial_rx_fifo* rx_fifo;
678
679 rx_fifo = (struct rt_serial_rx_fifo*) rt_malloc (sizeof(struct rt_serial_rx_fifo) +
680 serial->config.bufsz);
681 RT_ASSERT(rx_fifo != RT_NULL);
682 rx_fifo->buffer = (rt_uint8_t*) (rx_fifo + 1);
683 rt_memset(rx_fifo->buffer, 0, serial->config.bufsz);
684 rx_fifo->put_index = 0;
685 rx_fifo->get_index = 0;
686 rx_fifo->is_full = RT_FALSE;
687
688 serial->serial_rx = rx_fifo;
689 dev->open_flag |= RT_DEVICE_FLAG_INT_RX;
690 /* configure low level device */
691 serial->ops->control(serial, RT_DEVICE_CTRL_SET_INT, (void *)RT_DEVICE_FLAG_INT_RX);
692 }
693#ifdef RT_SERIAL_USING_DMA
694 else if (oflag & RT_DEVICE_FLAG_DMA_RX)
695 {
696 if (serial->config.bufsz == 0) {
697 struct rt_serial_rx_dma* rx_dma;

Callers

nothing calls this directly

Calls 4

rt_mallocFunction · 0.85
rt_memsetFunction · 0.85
rt_completion_initFunction · 0.50

Tested by

no test coverage detected