From b586889216a4cbe7995498b40ae3a69110b3a2d4 Mon Sep 17 00:00:00 2001 From: xiao-mang <53597406+xiao-mang@users.noreply.github.com> Date: Mon, 29 Apr 2024 18:00:34 +0800 Subject: [PATCH] fix baudrate error (#8873) * fix baudrate error * fix baudrate error * fix baudrate error * fix baudrate error * fix baudrate error * fix baudrate error * fix baudrate error * fix baudrate error * fix baudrate error --- components/drivers/serial/serial.c | 2 +- components/drivers/serial/serial_tty.c | 14 ++++++++++++++ components/lwp/terminal/freebsd/tty_compat.c | 2 ++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/components/drivers/serial/serial.c b/components/drivers/serial/serial.c index fef049ae03..761cf4973d 100644 --- a/components/drivers/serial/serial.c +++ b/components/drivers/serial/serial.c @@ -1175,7 +1175,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev, config = serial->config; - baudrate = _get_baudrate(cfgetospeed(tio)); + baudrate = _get_baudrate(tio->__c_ispeed); config.baud_rate = baudrate; switch (tio->c_cflag & CSIZE) diff --git a/components/drivers/serial/serial_tty.c b/components/drivers/serial/serial_tty.c index e3d81b77eb..d8479aad22 100644 --- a/components/drivers/serial/serial_tty.c +++ b/components/drivers/serial/serial_tty.c @@ -175,6 +175,19 @@ rt_inline void _restore_serial(struct rt_serial_device *serial, lwp_tty_t tp, rt_device_control(&serial->parent, RT_DEVICE_CTRL_NOTIFY_SET, &softc->backup_notify); } +static void _serial_tty_set_speed(struct lwp_tty *tp) +{ + struct serial_tty_context *softc = (struct serial_tty_context *)(tp->t_devswsoftc); + struct rt_serial_device *serial; + + RT_ASSERT(softc); + serial = softc->parent; + + rt_device_control(&(serial->parent), TCGETS, &tp->t_termios_init_in); + + tp->t_termios_init_in.__c_ispeed = tp->t_termios_init_in.__c_ospeed = cfgetospeed(&tp->t_termios_init_in); +} + static int _serial_isbusy(struct rt_serial_device *serial) { rt_thread_t user_thread = rt_console_current_user(); @@ -317,6 +330,7 @@ rt_err_t rt_hw_serial_register_tty(struct rt_serial_device *serial) tty = lwp_tty_create(&serial_ttydevsw, softc); if (tty) { + _serial_tty_set_speed(tty); rc = lwp_tty_register(tty, dev_name); rt_work_init(&softc->work, _tty_rx_worker, tty); diff --git a/components/lwp/terminal/freebsd/tty_compat.c b/components/lwp/terminal/freebsd/tty_compat.c index 0f2c70a5c5..cbb9069c07 100644 --- a/components/lwp/terminal/freebsd/tty_compat.c +++ b/components/lwp/terminal/freebsd/tty_compat.c @@ -349,6 +349,7 @@ int lwp_tty_ioctl_adapter(lwp_tty_t tp, int cmd, int oflags, void *args, rt_thre error = IOCTL(TIOCGETA, (rt_caddr_t)&tios, fflags, td); if (error) break; + cfsetospeed(&tios, tios.__c_ispeed); error = _copy_to_user(args, &tios, sizeof(tios)); break; @@ -356,6 +357,7 @@ int lwp_tty_ioctl_adapter(lwp_tty_t tp, int cmd, int oflags, void *args, rt_thre error = _copy_from_user(&tios, args, sizeof(tios)); if (error) break; + tios.__c_ispeed = tios.__c_ospeed = cfgetospeed(&tios); error = (IOCTL(TIOCSETA, (rt_caddr_t)&tios, fflags, td)); break;