summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorxiao-mang <[email protected]>2024-04-29 18:00:34 +0800
committerGitHub <[email protected]>2024-04-29 18:00:34 +0800
commitb586889216a4cbe7995498b40ae3a69110b3a2d4 (patch)
tree25600eead32fe8bf716e9d39eac9e08c06a39bef /components
parente548a99da4741f07de7dfda456ce4132bd9ea025 (diff)
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
Diffstat (limited to 'components')
-rw-r--r--components/drivers/serial/serial.c2
-rw-r--r--components/drivers/serial/serial_tty.c14
-rw-r--r--components/lwp/terminal/freebsd/tty_compat.c2
3 files changed, 17 insertions, 1 deletions
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;