From 1720811c9ab8a5e5dc1067f317910560823cf8cb Mon Sep 17 00:00:00 2001 From: zms123456 <85141075+zmshahaha@users.noreply.github.com> Date: Mon, 1 Apr 2024 21:23:04 +0800 Subject: [PATCH] [components][drivers] fix posix tty, and add more baudrate (#8683) * serial-tty fix * v2 --- components/drivers/include/drivers/serial.h | 6 ++ components/drivers/serial/serial.c | 78 +++++++++++++++++++-- components/drivers/serial/serial_tty.c | 9 +++ libcpu/aarch64/common/SConscript | 2 +- libcpu/aarch64/common/context_gcc.S | 8 +++ libcpu/aarch64/common/interrupt.c | 14 ---- 6 files changed, 97 insertions(+), 20 deletions(-) diff --git a/components/drivers/include/drivers/serial.h b/components/drivers/include/drivers/serial.h index b6c3a74e73..b13c268a00 100644 --- a/components/drivers/include/drivers/serial.h +++ b/components/drivers/include/drivers/serial.h @@ -26,10 +26,16 @@ #define BAUD_RATE_230400 230400 #define BAUD_RATE_460800 460800 #define BAUD_RATE_500000 500000 +#define BAUD_RATE_576000 576000 #define BAUD_RATE_921600 921600 +#define BAUD_RATE_1000000 1000000 +#define BAUD_RATE_1152000 1152000 +#define BAUD_RATE_1500000 1500000 #define BAUD_RATE_2000000 2000000 #define BAUD_RATE_2500000 2500000 #define BAUD_RATE_3000000 3000000 +#define BAUD_RATE_3500000 3500000 +#define BAUD_RATE_4000000 4000000 #define DATA_BITS_5 5 #define DATA_BITS_6 6 diff --git a/components/drivers/serial/serial.c b/components/drivers/serial/serial.c index 8604c78db7..3ded2afad6 100644 --- a/components/drivers/serial/serial.c +++ b/components/drivers/serial/serial.c @@ -640,6 +640,11 @@ static rt_err_t rt_serial_open(struct rt_device *dev, rt_uint16_t oflag) /* get open flags */ dev->open_flag = oflag & 0xff; +#ifdef RT_USING_PINCTRL + /* initialize iomux in DM */ + rt_pin_ctrl_confs_apply_by_name(dev, RT_NULL); +#endif + /* initialize the Rx/Tx structure according to open flag */ if (serial->serial_rx == RT_NULL) { @@ -909,7 +914,7 @@ static rt_ssize_t rt_serial_write(struct rt_device *dev, } } -#if defined(RT_USING_POSIX_TERMIOS) && !defined(RT_USING_SMART) +#if defined(RT_USING_POSIX_TERMIOS) struct speed_baudrate_item { speed_t speed; @@ -928,9 +933,16 @@ static const struct speed_baudrate_item _tbl[] = {B230400, BAUD_RATE_230400}, {B460800, BAUD_RATE_460800}, {B500000, BAUD_RATE_500000}, + {B576000, BAUD_RATE_576000}, {B921600, BAUD_RATE_921600}, + {B1000000, BAUD_RATE_1000000}, + {B1152000, BAUD_RATE_1152000}, + {B1500000, BAUD_RATE_1500000}, {B2000000, BAUD_RATE_2000000}, + {B2500000, BAUD_RATE_2500000}, {B3000000, BAUD_RATE_3000000}, + {B3500000, BAUD_RATE_3500000}, + {B4000000, BAUD_RATE_4000000}, }; static speed_t _get_speed(int baudrate) @@ -1002,6 +1014,32 @@ static void _tc_flush(struct rt_serial_device *serial, int queue) } } + +static inline int _termio_to_termios(const struct termio *termio, + struct termios *termios) +{ + termios->c_iflag = termio->c_iflag; + termios->c_oflag = termio->c_oflag; + termios->c_cflag = termio->c_cflag; + termios->c_lflag = termio->c_lflag; + termios->c_line = termio->c_line; + rt_memcpy(termios->c_cc, termio->c_cc, NCC); + + return 0; +} + +static inline int _termios_to_termio(const struct termios *termios, + struct termio *termio) +{ + termio->c_iflag = (unsigned short)termios->c_iflag; + termio->c_oflag = (unsigned short)termios->c_oflag; + termio->c_cflag = (unsigned short)termios->c_cflag; + termio->c_lflag = (unsigned short)termios->c_lflag; + termio->c_line = termios->c_line; + rt_memcpy(termio->c_cc, termios->c_cc, NCC); + + return 0; +} #endif /* RT_USING_POSIX_TERMIOS */ static rt_err_t rt_serial_control(struct rt_device *dev, @@ -1058,10 +1096,21 @@ static rt_err_t rt_serial_control(struct rt_device *dev, } break; #ifdef RT_USING_POSIX_STDIO -#if defined(RT_USING_POSIX_TERMIOS) && !defined(RT_USING_SMART) +#if defined(RT_USING_POSIX_TERMIOS) case TCGETA: + case TCGETS: { - struct termios *tio = (struct termios*)args; + struct termios *tio, tmp; + + if (cmd == TCGETS) + { + tio = (struct termios*)args; + } + else + { + tio = &tmp; + } + if (tio == RT_NULL) return -RT_EINVAL; tio->c_iflag = 0; @@ -1092,17 +1141,34 @@ static rt_err_t rt_serial_control(struct rt_device *dev, tio->c_cflag |= (PARODD | PARENB); cfsetospeed(tio, _get_speed(serial->config.baud_rate)); + + if (cmd == TCGETA) + { + _termios_to_termio(tio, args); + } } break; - case TCSETAW: case TCSETAF: case TCSETA: + case TCSETSW: + case TCSETSF: + case TCSETS: { int baudrate; struct serial_configure config; + struct termios *tio, tmp; + + if ((cmd >= TCSETA) && (cmd <= TCSETA + 2)) + { + _termio_to_termios(args, &tmp); + tio = &tmp; + } + else + { + tio = (struct termios*)args; + } - struct termios *tio = (struct termios*)args; if (tio == RT_NULL) return -RT_EINVAL; config = serial->config; @@ -1139,6 +1205,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev, serial->ops->configure(serial, &config); } break; +#ifndef RT_USING_TTY case TCFLSH: { int queue = (int)(rt_ubase_t)args; @@ -1149,6 +1216,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev, break; case TCXONC: break; +#endif /*RT_USING_TTY*/ #endif /*RT_USING_POSIX_TERMIOS*/ case TIOCSWINSZ: { diff --git a/components/drivers/serial/serial_tty.c b/components/drivers/serial/serial_tty.c index 311a422dce..f7b0a1f80f 100644 --- a/components/drivers/serial/serial_tty.c +++ b/components/drivers/serial/serial_tty.c @@ -212,6 +212,15 @@ static int serial_tty_ioctl(struct lwp_tty *tp, rt_ubase_t cmd, rt_caddr_t data, int error; switch (cmd) { + case TCSETS: + case TCSETSW: + case TCSETSF: + RT_ASSERT(tp->t_devswsoftc); + struct serial_tty_context *softc = (struct serial_tty_context *)(tp->t_devswsoftc); + struct rt_serial_device *serial = softc->parent; + struct termios *termios = (struct termios *)data; + rt_device_control(&(serial->parent), cmd, termios); + error = -ENOIOCTL; default: /** * Note: for the most case, we don't let serial layer handle ioctl, diff --git a/libcpu/aarch64/common/SConscript b/libcpu/aarch64/common/SConscript index 92740f55de..d66dfc6b0c 100644 --- a/libcpu/aarch64/common/SConscript +++ b/libcpu/aarch64/common/SConscript @@ -12,7 +12,7 @@ if GetDepend('RT_USING_OFW') == False: SrcRemove(src, ['setup.c', 'cpu_psci.c', 'psci.c']) if GetDepend('RT_USING_PIC') == True: - SrcRemove(src, ['gicv3.c', 'gic.c', 'gtimer.c']) + SrcRemove(src, ['gicv3.c', 'gic.c', 'gtimer.c', 'interrupt.c']) group = DefineGroup('libcpu', src, depend = [''], CPPPATH = CPPPATH) diff --git a/libcpu/aarch64/common/context_gcc.S b/libcpu/aarch64/common/context_gcc.S index 39a516dc59..9dd3c5e4b0 100644 --- a/libcpu/aarch64/common/context_gcc.S +++ b/libcpu/aarch64/common/context_gcc.S @@ -19,6 +19,14 @@ #include "asm-fpu.h" #include "armv8.h" +#ifndef RT_USING_SMP +.bss + .align 3 +rt_interrupt_from_thread: .comm 8, 8 +rt_interrupt_to_thread: .comm 8, 8 +rt_thread_switch_interrupt_flag: .comm 8, 8 +#endif + .text .weak rt_hw_cpu_id_set .type rt_hw_cpu_id_set, @function diff --git a/libcpu/aarch64/common/interrupt.c b/libcpu/aarch64/common/interrupt.c index 55f6a82f31..08ab57b515 100644 --- a/libcpu/aarch64/common/interrupt.c +++ b/libcpu/aarch64/common/interrupt.c @@ -16,15 +16,6 @@ #include "gicv3.h" #include "ioremap.h" -#ifndef RT_USING_SMP -/* Those variables will be accessed in ISR, so we need to share them. */ -rt_ubase_t rt_interrupt_from_thread = 0; -rt_ubase_t rt_interrupt_to_thread = 0; -rt_ubase_t rt_thread_switch_interrupt_flag = 0; -#endif - -#ifndef RT_USING_PIC - /* exception and interrupt handler table */ struct rt_irq_desc isr_table[MAX_HANDLERS]; @@ -87,9 +78,6 @@ void rt_hw_interrupt_init(void) /* init interrupt nest, and context in thread sp */ rt_atomic_store(&rt_interrupt_nest, 0); - rt_interrupt_from_thread = 0; - rt_interrupt_to_thread = 0; - rt_thread_switch_interrupt_flag = 0; #else rt_uint64_t gic_cpu_base; rt_uint64_t gic_dist_base; @@ -417,8 +405,6 @@ void rt_hw_ipi_handler_install(int ipi_vector, rt_isr_handler_t ipi_isr_handler) } #endif -#endif /* RT_USING_PIC */ - #if defined(FINSH_USING_MSH) && defined(RT_USING_INTERRUPT_INFO) int list_isr() {