|
|
@@ -893,100 +893,6 @@ static rt_size_t rt_serial_write(struct rt_device *dev,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-struct speed_baudrate_item
|
|
|
-{
|
|
|
- speed_t speed;
|
|
|
- int baudrate;
|
|
|
-};
|
|
|
-
|
|
|
-const static struct speed_baudrate_item _tbl[] =
|
|
|
-{
|
|
|
- {B2400, BAUD_RATE_2400},
|
|
|
- {B4800, BAUD_RATE_4800},
|
|
|
- {B9600, BAUD_RATE_9600},
|
|
|
- {B19200, BAUD_RATE_19200},
|
|
|
- {B38400, BAUD_RATE_38400},
|
|
|
- {B57600, BAUD_RATE_57600},
|
|
|
- {B115200, BAUD_RATE_115200},
|
|
|
- {B230400, BAUD_RATE_230400},
|
|
|
- {B460800, BAUD_RATE_460800},
|
|
|
- {B921600, BAUD_RATE_921600},
|
|
|
- {B2000000, BAUD_RATE_2000000},
|
|
|
- {B3000000, BAUD_RATE_3000000},
|
|
|
-};
|
|
|
-
|
|
|
-static speed_t _get_speed(int baudrate)
|
|
|
-{
|
|
|
- int index;
|
|
|
-
|
|
|
- for (index = 0; index < sizeof(_tbl)/sizeof(_tbl[0]); index ++)
|
|
|
- {
|
|
|
- if (_tbl[index].baudrate == baudrate)
|
|
|
- return _tbl[index].speed;
|
|
|
- }
|
|
|
-
|
|
|
- return B0;
|
|
|
-}
|
|
|
-
|
|
|
-static int _get_baudrate(speed_t speed)
|
|
|
-{
|
|
|
- int index;
|
|
|
-
|
|
|
- for (index = 0; index < sizeof(_tbl)/sizeof(_tbl[0]); index ++)
|
|
|
- {
|
|
|
- if (_tbl[index].speed == speed)
|
|
|
- return _tbl[index].baudrate;
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static void _tc_flush(struct rt_serial_device *serial, int queue)
|
|
|
-{
|
|
|
- rt_base_t level;
|
|
|
- int ch = -1;
|
|
|
- struct rt_serial_rx_fifo *rx_fifo = RT_NULL;
|
|
|
- struct rt_device *device = RT_NULL;
|
|
|
-
|
|
|
- RT_ASSERT(serial != RT_NULL);
|
|
|
-
|
|
|
- device = &(serial->parent);
|
|
|
- rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx;
|
|
|
-
|
|
|
- switch(queue)
|
|
|
- {
|
|
|
- case TCIFLUSH:
|
|
|
- case TCIOFLUSH:
|
|
|
-
|
|
|
- RT_ASSERT(rx_fifo != RT_NULL);
|
|
|
-
|
|
|
- if((device->open_flag & RT_DEVICE_FLAG_INT_RX) || (device->open_flag & RT_DEVICE_FLAG_DMA_RX))
|
|
|
- {
|
|
|
- RT_ASSERT(RT_NULL != rx_fifo);
|
|
|
- level = rt_hw_interrupt_disable();
|
|
|
- rt_memset(rx_fifo->buffer, 0, serial->config.bufsz);
|
|
|
- rx_fifo->put_index = 0;
|
|
|
- rx_fifo->get_index = 0;
|
|
|
- rx_fifo->is_full = RT_FALSE;
|
|
|
- rt_hw_interrupt_enable(level);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while (1)
|
|
|
- {
|
|
|
- ch = serial->ops->getc(serial);
|
|
|
- if (ch == -1) break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
-
|
|
|
- case TCOFLUSH:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
static rt_err_t rt_serial_control(struct rt_device *dev,
|
|
|
int cmd,
|
|
|
void *args)
|
|
|
@@ -1042,101 +948,6 @@ static rt_err_t rt_serial_control(struct rt_device *dev,
|
|
|
*(rt_uint16_t*)args = RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM;
|
|
|
}
|
|
|
break;
|
|
|
-
|
|
|
-#ifdef RT_USING_POSIX_TERMIOS
|
|
|
- case TCGETA:
|
|
|
- {
|
|
|
- struct termios *tio = (struct termios*)args;
|
|
|
- if (tio == RT_NULL) return -RT_EINVAL;
|
|
|
-
|
|
|
- tio->c_iflag = 0;
|
|
|
- tio->c_oflag = 0;
|
|
|
- tio->c_lflag = 0;
|
|
|
-
|
|
|
- /* update oflag for console device */
|
|
|
- if (rt_console_get_device() == dev)
|
|
|
- tio->c_oflag = OPOST | ONLCR;
|
|
|
-
|
|
|
- /* set cflag */
|
|
|
- tio->c_cflag = 0;
|
|
|
- if (serial->config.data_bits == DATA_BITS_5)
|
|
|
- tio->c_cflag = CS5;
|
|
|
- else if (serial->config.data_bits == DATA_BITS_6)
|
|
|
- tio->c_cflag = CS6;
|
|
|
- else if (serial->config.data_bits == DATA_BITS_7)
|
|
|
- tio->c_cflag = CS7;
|
|
|
- else if (serial->config.data_bits == DATA_BITS_8)
|
|
|
- tio->c_cflag = CS8;
|
|
|
-
|
|
|
- if (serial->config.stop_bits == STOP_BITS_2)
|
|
|
- tio->c_cflag |= CSTOPB;
|
|
|
-
|
|
|
- if (serial->config.parity == PARITY_EVEN)
|
|
|
- tio->c_cflag |= PARENB;
|
|
|
- else if (serial->config.parity == PARITY_ODD)
|
|
|
- tio->c_cflag |= (PARODD | PARENB);
|
|
|
-
|
|
|
- cfsetospeed(tio, _get_speed(serial->config.baud_rate));
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
- case TCSETAW:
|
|
|
- case TCSETAF:
|
|
|
- case TCSETA:
|
|
|
- {
|
|
|
- int baudrate;
|
|
|
- struct serial_configure config;
|
|
|
-
|
|
|
- struct termios *tio = (struct termios*)args;
|
|
|
- if (tio == RT_NULL) return -RT_EINVAL;
|
|
|
-
|
|
|
- config = serial->config;
|
|
|
-
|
|
|
- baudrate = _get_baudrate(cfgetospeed(tio));
|
|
|
- config.baud_rate = baudrate;
|
|
|
-
|
|
|
- switch (tio->c_cflag & CSIZE)
|
|
|
- {
|
|
|
- case CS5:
|
|
|
- config.data_bits = DATA_BITS_5;
|
|
|
- break;
|
|
|
- case CS6:
|
|
|
- config.data_bits = DATA_BITS_6;
|
|
|
- break;
|
|
|
- case CS7:
|
|
|
- config.data_bits = DATA_BITS_7;
|
|
|
- break;
|
|
|
- default:
|
|
|
- config.data_bits = DATA_BITS_8;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- if (tio->c_cflag & CSTOPB) config.stop_bits = STOP_BITS_2;
|
|
|
- else config.stop_bits = STOP_BITS_1;
|
|
|
-
|
|
|
- if (tio->c_cflag & PARENB)
|
|
|
- {
|
|
|
- if (tio->c_cflag & PARODD) config.parity = PARITY_ODD;
|
|
|
- else config.parity = PARITY_EVEN;
|
|
|
- }
|
|
|
- else config.parity = PARITY_NONE;
|
|
|
-
|
|
|
- serial->ops->configure(serial, &config);
|
|
|
- }
|
|
|
- break;
|
|
|
- case TCFLSH:
|
|
|
- {
|
|
|
- int queue = (int)(size_t)args;
|
|
|
-
|
|
|
- _tc_flush(serial, queue);
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- case TCXONC:
|
|
|
- break;
|
|
|
- case TIOCGWINSZ:
|
|
|
- break;
|
|
|
-#endif
|
|
|
#ifdef RT_USING_POSIX
|
|
|
case FIONREAD:
|
|
|
{
|