From 70a136114c03d4cbca1aa555654adeef4d8f317d Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 4 Sep 2024 10:39:10 +0800 Subject: [PATCH 01/17] =?UTF-8?q?[drivers][serial=5Fv2]=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E9=98=BB=E5=A1=9E=E6=8E=A5=E6=94=B6=E8=B6=85=E8=BF=87rx?= =?UTF-8?q?=E7=BC=93=E5=86=B2=E5=8C=BA=E5=A4=A7=E5=B0=8F=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E3=80=81=E5=A2=9E=E5=8A=A0=E8=B6=85=E6=97=B6=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E3=80=81flush=E3=80=81=E8=8E=B7=E5=8F=96=E7=BC=93?= =?UTF-8?q?=E5=86=B2=E5=8C=BA=E6=95=B0=E6=8D=AE=E9=95=BF=E5=BA=A6=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E3=80=81=E6=95=B0=E6=8D=AE=E6=BA=A2=E5=87=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BF=AE=E5=A4=8D=E3=80=81=E7=A8=B3=E5=AE=9A=E6=80=A7?= =?UTF-8?q?=E7=BB=86=E8=8A=82=E4=BC=98=E5=8C=96=E3=80=81=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=9B=B4=E5=A4=9Aserial=5Fv2=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/at32/libraries/rt_drivers/drv_usart_v2.c | 2 +- .../arm/libraries/gd32_drivers/drv_usart_v2.c | 2 +- .../libraries/hc32_drivers/drv_usart_v2.c | 2 +- bsp/hpmicro/libraries/drivers/drv_uart_v2.c | 4 +- bsp/microchip/common/board/serial.c | 2 +- .../libraries/HAL_Drivers/drv_usart_v2.c | 20 +- .../HAL_Drivers/drivers/drv_usart_v2.c | 4 +- .../drivers/include/drivers/serial_v2.h | 13 +- components/drivers/serial/serial_v2.c | 509 ++++++++++++------ .../testcases/drivers/serial_v2/README.md | 39 +- .../testcases/drivers/serial_v2/SConscript | 12 +- .../drivers/serial_v2/uart_blocking_rx.c | 40 +- .../drivers/serial_v2/uart_blocking_tx.c | 14 +- .../drivers/serial_v2/uart_flush_rx.c | 142 +++++ .../drivers/serial_v2/uart_flush_txb.c | 117 ++++ .../drivers/serial_v2/uart_flush_txnb.c | 116 ++++ .../drivers/serial_v2/uart_get_rx_data_len.c | 170 ++++++ .../drivers/serial_v2/uart_nonblocking_rx.c | 28 +- .../drivers/serial_v2/uart_nonblocking_tx.c | 87 ++- .../drivers/serial_v2/uart_overflow_rxb_txb.c | 236 ++++++++ .../drivers/serial_v2/uart_rxb_txb.c | 78 ++- .../drivers/serial_v2/uart_rxb_txnb.c | 85 ++- .../drivers/serial_v2/uart_rxnb_txb.c | 75 ++- .../drivers/serial_v2/uart_rxnb_txnb.c | 48 +- .../drivers/serial_v2/uart_timeout_rxb_txb.c | 208 +++++++ 25 files changed, 1662 insertions(+), 391 deletions(-) create mode 100644 examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c create mode 100644 examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c create mode 100644 examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c create mode 100644 examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c create mode 100644 examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c create mode 100644 examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c diff --git a/bsp/at32/libraries/rt_drivers/drv_usart_v2.c b/bsp/at32/libraries/rt_drivers/drv_usart_v2.c index 02f6e7277d0..c1bdab9c452 100644 --- a/bsp/at32/libraries/rt_drivers/drv_usart_v2.c +++ b/bsp/at32/libraries/rt_drivers/drv_usart_v2.c @@ -493,7 +493,7 @@ static void usart_isr(struct rt_serial_device *serial) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), usart_data_receive(instance->uart_x)); + rt_ringbuffer_putchar_force(&rx_fifo->rb, usart_data_receive(instance->uart_x)); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c index f1edc7c462e..7108b5a3a77 100644 --- a/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c +++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_usart_v2.c @@ -272,7 +272,7 @@ static void usart_isr (struct rt_serial_device *serial) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), usart_data_receive(uart->periph)); + rt_ringbuffer_putchar_force(&rx_fifo->rb, usart_data_receive(uart->periph)); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); diff --git a/bsp/hc32/libraries/hc32_drivers/drv_usart_v2.c b/bsp/hc32/libraries/hc32_drivers/drv_usart_v2.c index 82e47796a73..0a109f1c0d1 100644 --- a/bsp/hc32/libraries/hc32_drivers/drv_usart_v2.c +++ b/bsp/hc32/libraries/hc32_drivers/drv_usart_v2.c @@ -492,7 +492,7 @@ static void hc32_uart_rx_irq_handler(struct hc32_uart *uart) struct rt_serial_rx_fifo *rx_fifo; rx_fifo = (struct rt_serial_rx_fifo *)uart->serial.serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)USART_ReadData(uart->config->Instance)); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)USART_ReadData(uart->config->Instance)); rt_hw_serial_isr(&uart->serial, RT_SERIAL_EVENT_RX_IND); } diff --git a/bsp/hpmicro/libraries/drivers/drv_uart_v2.c b/bsp/hpmicro/libraries/drivers/drv_uart_v2.c index 09db6189b9b..0857614d484 100644 --- a/bsp/hpmicro/libraries/drivers/drv_uart_v2.c +++ b/bsp/hpmicro/libraries/drivers/drv_uart_v2.c @@ -645,7 +645,7 @@ static void hpm_uart_isr(struct rt_serial_device *serial) while (uart_check_status(uart->uart_base, uart_stat_data_ready)) { count++; put_char = uart_read_byte(uart->uart_base); - rt_ringbuffer_putchar(&(rx_fifo->rb), put_char); + rt_ringbuffer_putchar_force(&rx_fifo->rb, put_char); /*in order to ensure rx fifo there are remaining bytes*/ if (count > 12) { break; @@ -656,7 +656,7 @@ static void hpm_uart_isr(struct rt_serial_device *serial) if (irq_id == uart_intr_id_rx_timeout) { while ((uart_check_status(uart->uart_base, uart_stat_data_ready)) || (uart_check_status(uart->uart_base, uart_stat_overrun_error))) { put_char= uart_read_byte(uart->uart_base); - rt_ringbuffer_putchar(&(rx_fifo->rb), put_char); + rt_ringbuffer_putchar_force(&rx_fifo->rb, put_char); } rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } diff --git a/bsp/microchip/common/board/serial.c b/bsp/microchip/common/board/serial.c index 793d1198644..adc6c69ed1b 100644 --- a/bsp/microchip/common/board/serial.c +++ b/bsp/microchip/common/board/serial.c @@ -34,7 +34,7 @@ static void serial_rxcallback(const struct usart_async_descriptor *const io_desc do { ringbuffer_get((struct ringbuffer *const)&io_descr->rx, &data); - rt_ringbuffer_putchar(&(rx_fifo->rb), data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, data); } while (0); // maybe not only one byte #endif diff --git a/bsp/renesas/libraries/HAL_Drivers/drv_usart_v2.c b/bsp/renesas/libraries/HAL_Drivers/drv_usart_v2.c index 26c305007a8..cceaf60329b 100644 --- a/bsp/renesas/libraries/HAL_Drivers/drv_usart_v2.c +++ b/bsp/renesas/libraries/HAL_Drivers/drv_usart_v2.c @@ -290,7 +290,7 @@ void user_uart0_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -313,7 +313,7 @@ void user_uart1_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -336,7 +336,7 @@ void user_uart2_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -359,7 +359,7 @@ void user_uart3_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -382,7 +382,7 @@ void user_uart4_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -405,7 +405,7 @@ void user_uart5_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -428,7 +428,7 @@ void user_uart6_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -451,7 +451,7 @@ void user_uart7_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -474,7 +474,7 @@ void user_uart8_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -497,7 +497,7 @@ void user_uart9_callback(uart_callback_args_t *p_args) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), (rt_uint8_t)p_args->data); + rt_ringbuffer_putchar_force(&rx_fifo->rb, (rt_uint8_t)p_args->data); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } diff --git a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c index 225180d229d..26a365978b7 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c +++ b/bsp/stm32/libraries/HAL_Drivers/drivers/drv_usart_v2.c @@ -446,7 +446,7 @@ static void uart_isr(struct rt_serial_device *serial) rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_putchar(&(rx_fifo->rb), UART_GET_RDR(&uart->handle, stm32_uart_get_mask(uart->handle.Init.WordLength, uart->handle.Init.Parity))); + rt_ringbuffer_putchar_force(&rx_fifo->rb, UART_GET_RDR(&uart->handle, stm32_uart_get_mask(uart->handle.Init.WordLength, uart->handle.Init.Parity))); rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND); } @@ -459,7 +459,7 @@ static void uart_isr(struct rt_serial_device *serial) RT_ASSERT(tx_fifo != RT_NULL); rt_uint8_t put_char = 0; - if (rt_ringbuffer_getchar(&(tx_fifo->rb), &put_char)) + if (rt_ringbuffer_getchar(&tx_fifo->rb, &put_char)) { UART_SET_TDR(&uart->handle, put_char); } diff --git a/components/drivers/include/drivers/serial_v2.h b/components/drivers/include/drivers/serial_v2.h index d0dcf378139..1d00d08c914 100644 --- a/components/drivers/include/drivers/serial_v2.h +++ b/components/drivers/include/drivers/serial_v2.h @@ -70,7 +70,12 @@ #define RT_SERIAL_EVENT_TX_DONE 0x02 /* Tx complete */ #define RT_SERIAL_EVENT_RX_DMADONE 0x03 /* Rx DMA transfer done */ #define RT_SERIAL_EVENT_TX_DMADONE 0x04 /* Tx DMA transfer done */ -#define RT_SERIAL_EVENT_RX_TIMEOUT 0x05 /* Rx timeout */ + +#define RT_SERIAL_CTRL_RX_TIMEOUT (RT_DEVICE_CTRL_MASK + 0x01) /* Rx timeout. Call before rt_device_read */ +#define RT_SERIAL_CTRL_TX_TIMEOUT (RT_DEVICE_CTRL_MASK + 0x02) /* Tx timeout. Call before rt_device_write */ +#define RT_SERIAL_CTRL_RX_FLUSH (RT_DEVICE_CTRL_MASK + 0x03) /* Clear rx buffer. Discard all data */ +#define RT_SERIAL_CTRL_TX_FLUSH (RT_DEVICE_CTRL_MASK + 0x04) /* Clear tx buffer. Blocking and wait for the send buffer data to be sent. */ +#define RT_SERIAL_CTRL_GET_RX_DATA_LEN (RT_DEVICE_CTRL_MASK + 0x05) /* Get buf data length. */ #define RT_SERIAL_ERR_OVERRUN 0x01 #define RT_SERIAL_ERR_FRAMING 0x02 @@ -130,13 +135,15 @@ struct serial_configure * Serial Receive FIFO mode */ struct rt_serial_rx_fifo -{ +{ struct rt_ringbuffer rb; struct rt_completion rx_cpt; rt_uint16_t rx_cpt_index; + rt_int32_t rx_timeout; + /* software fifo */ rt_uint8_t buffer[]; }; @@ -150,6 +157,8 @@ struct rt_serial_tx_fifo rt_size_t put_size; + rt_int32_t tx_timeout; + rt_bool_t activated; struct rt_completion tx_cpt; diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c index 111bfbca01f..19aca9636eb 100644 --- a/components/drivers/serial/serial_v2.c +++ b/components/drivers/serial/serial_v2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2023, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -39,7 +39,7 @@ RT_OBJECT_HOOKLIST_DEFINE(rt_hw_serial_rxind); static rt_err_t serial_fops_rx_ind(rt_device_t dev, rt_size_t size) { - rt_wqueue_wakeup(&(dev->wait_queue), (void*)POLLIN); + rt_wqueue_wakeup(&dev->wait_queue, (void*)POLLIN); RT_OBJECT_HOOKLIST_CALL(rt_hw_serial_rxind, (dev, size)); @@ -140,7 +140,7 @@ static ssize_t serial_fops_read(struct dfs_file *fd, void *buf, size_t count) break; } - rt_wqueue_wait(&(device->wait_queue), 0, RT_WAITING_FOREVER); + rt_wqueue_wait(&device->wait_queue, 0, RT_WAITING_FOREVER); } }while (size <= 0); @@ -178,7 +178,7 @@ static int serial_fops_poll(struct dfs_file *fd, struct rt_pollreq *req) rt_base_t level; struct rt_serial_rx_fifo* rx_fifo; - rt_poll_add(&(device->wait_queue), req); + rt_poll_add(&device->wait_queue, req); rx_fifo = (struct rt_serial_rx_fifo*) serial->serial_rx; @@ -257,7 +257,7 @@ static rt_ssize_t rt_serial_update_read_index(struct rt_ringbuffer *rb, /* we are going into the other side of the mirror */ rb->read_mirror = ~rb->read_mirror; - rb->read_index = 0; + rb->read_index = read_index - (rb->buffer_size - rb->read_index); return read_index; } @@ -271,10 +271,9 @@ static rt_ssize_t rt_serial_update_write_index(struct rt_ringbuffer *rb, /* whether has enough space */ size = rt_ringbuffer_space_len(rb); - /* no space, drop some data */ - if (size < write_size) + if(write_size > rb->buffer_size) { - write_size = size; + write_size = rb->buffer_size; #if !defined(RT_USING_ULOG) || defined(ULOG_USING_ISR_LOG) LOG_W("The serial buffer (len %d) is overflow.", rb->buffer_size); #endif @@ -285,6 +284,10 @@ static rt_ssize_t rt_serial_update_write_index(struct rt_ringbuffer *rb, /* this should not cause overflow because there is enough space for * length of data in current mirror */ rb->write_index += write_size; + + if (write_size > size) + rb->read_index = rb->write_index; + return write_size; } @@ -292,6 +295,13 @@ static rt_ssize_t rt_serial_update_write_index(struct rt_ringbuffer *rb, rb->write_mirror = ~rb->write_mirror; rb->write_index = write_size - (rb->buffer_size - rb->write_index); + if (write_size > size) + { + if (rb->write_index <= rb->read_index) + rb->read_mirror = ~rb->read_mirror; + rb->read_index = rb->write_index; + } + return write_size; } @@ -315,10 +325,10 @@ rt_ssize_t _serial_poll_rx(struct rt_device *dev, int getc_element; /* Gets one byte of data received */ rt_uint8_t *getc_buffer; /* Pointer to the receive data buffer */ - RT_ASSERT(dev != RT_NULL); + if (size == 0) return 0; + RT_ASSERT(dev != RT_NULL && buffer != RT_NULL); serial = (struct rt_serial_device *)dev; - RT_ASSERT(serial != RT_NULL); getc_buffer = (rt_uint8_t *)buffer; getc_size = size; @@ -350,7 +360,7 @@ rt_ssize_t _serial_poll_rx(struct rt_device *dev, * @param pos Empty parameter. * @param buffer Transmit data buffer. * @param size Transmit data buffer length. - * @return Return the final length of data received. + * @return Return the final length of data transmit. */ rt_ssize_t _serial_poll_tx(struct rt_device *dev, rt_off_t pos, @@ -360,11 +370,11 @@ rt_ssize_t _serial_poll_tx(struct rt_device *dev, struct rt_serial_device *serial; rt_size_t putc_size; rt_uint8_t *putc_buffer; /* Pointer to the transmit data buffer */ - RT_ASSERT(dev != RT_NULL); - serial = (struct rt_serial_device *)dev; - RT_ASSERT(serial != RT_NULL); + if (size == 0) return 0; + RT_ASSERT(dev != RT_NULL && buffer != RT_NULL); + serial = (struct rt_serial_device *)dev; putc_buffer = (rt_uint8_t *)buffer; putc_size = size; @@ -389,11 +399,15 @@ rt_ssize_t _serial_poll_tx(struct rt_device *dev, /** * @brief Serial receive data routines, This function will receive * data by using fifo + * + * @note In blocking mode, the function will wait until the specified amount of data is received or until a timeout occurs. + * In non-blocking mode, the function will immediately attempt to retrieve as much data as possible from the ring buffer and return. + * * @param dev The pointer of device driver structure * @param pos Empty parameter. * @param buffer Receive data buffer. * @param size Receive data buffer length. - * @return Return the final length of data received. + * @return Returns the actual length of data received. If a timeout occurs in blocking mode, it returns -RT_ETIMEOUT. */ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev, rt_off_t pos, @@ -403,49 +417,71 @@ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev, struct rt_serial_device *serial; struct rt_serial_rx_fifo *rx_fifo; rt_base_t level; - rt_size_t recv_len; /* The length of data from the ringbuffer */ + rt_size_t recv_size = 0; - RT_ASSERT(dev != RT_NULL); if (size == 0) return 0; + RT_ASSERT(dev != RT_NULL && buffer != RT_NULL); serial = (struct rt_serial_device *)dev; - - RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL)); - - rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; + rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; if (dev->open_flag & RT_SERIAL_RX_BLOCKING) { - if (size > serial->config.rx_bufsz) + rt_size_t data_len = 0; + rt_size_t rx_bufsz_third = serial->config.rx_bufsz / 2; + rt_int32_t rx_timeout = rx_fifo->rx_timeout; + rt_tick_t now_tick = 0; + rt_tick_t begin_tick = rt_tick_get(); + + while (1) { - LOG_W("(%s) serial device received data:[%d] larger than " - "rx_bufsz:[%d], please increase the BSP_UARTx_RX_BUFSIZE option", - dev->parent.name, size, serial->config.rx_bufsz); + /* Get the length of the data from the ringbuffer */ + level = rt_hw_interrupt_disable(); + data_len = rt_ringbuffer_data_len(&rx_fifo->rb); + if(recv_size + data_len > size) + data_len = size - recv_size; - return 0; - } - /* Get the length of the data from the ringbuffer */ - recv_len = rt_ringbuffer_data_len(&(rx_fifo->rb)); + recv_size += rt_ringbuffer_get(&rx_fifo->rb, (rt_uint8_t *)buffer + recv_size, data_len); + if (recv_size == size) + { + rt_hw_interrupt_enable(level); + break; + } - if (recv_len < size) - { - /* When recv_len is less than size, rx_cpt_index is updated to the size + /* When recv_size is less than size, rx_cpt_index is updated to the size * and rt_current_thread is suspend until rx_cpt_index is equal to 0 */ - rx_fifo->rx_cpt_index = size; - rt_completion_wait(&(rx_fifo->rx_cpt), RT_WAITING_FOREVER); + rx_fifo->rx_cpt_index = size - recv_size >= rx_bufsz_third ? rx_bufsz_third : size - recv_size; + rt_completion_wait(&rx_fifo->rx_cpt, 0); + rt_hw_interrupt_enable(level); + + rt_completion_wait(&rx_fifo->rx_cpt, rx_timeout); + if(rx_timeout != RT_WAITING_FOREVER) + { + now_tick = rt_tick_get(); + if(now_tick - begin_tick >= rx_fifo->rx_timeout) + { + return -RT_ETIMEOUT; + } + else + { + if(now_tick > begin_tick) + rx_timeout = rx_fifo->rx_timeout - (now_tick - begin_tick); + else + rx_timeout = begin_tick + rx_fifo->rx_timeout - now_tick + 1; + } + } } } + else if(dev->open_flag & RT_SERIAL_RX_NON_BLOCKING) + { + /* When open_flag is RT_SERIAL_RX_NON_BLOCKING, + * the data is retrieved directly from the ringbuffer and returned */ + level = rt_hw_interrupt_disable(); + recv_size = rt_ringbuffer_get(&rx_fifo->rb, buffer, size); + rt_hw_interrupt_enable(level); + } - /* This part of the code is open_flag as RT_SERIAL_RX_NON_BLOCKING */ - - level = rt_hw_interrupt_disable(); - /* When open_flag is RT_SERIAL_RX_NON_BLOCKING, - * the data is retrieved directly from the ringbuffer and returned */ - recv_len = rt_ringbuffer_get(&(rx_fifo->rb), buffer, size); - - rt_hw_interrupt_enable(level); - - return recv_len; + return recv_size; } /** @@ -455,7 +491,7 @@ static rt_ssize_t _serial_fifo_rx(struct rt_device *dev, * @param pos Empty parameter. * @param buffer Transmit data buffer. * @param size Transmit data buffer length. - * @return Return the final length of data transmit. + * @return Returns the actual length of data transmitted. If a timeout occurs, it returns -RT_ETIMEOUT. */ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev, rt_off_t pos, @@ -463,14 +499,14 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev, rt_size_t size) { struct rt_serial_device *serial; - struct rt_serial_tx_fifo *tx_fifo = RT_NULL; - rt_ssize_t rst; + struct rt_serial_tx_fifo *tx_fifo; + rt_ssize_t send_size; + rt_err_t ret; - RT_ASSERT(dev != RT_NULL); if (size == 0) return 0; + RT_ASSERT(dev != RT_NULL && buffer != RT_NULL); serial = (struct rt_serial_device *)dev; - RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL)); tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx; RT_ASSERT(tx_fifo != RT_NULL); @@ -482,19 +518,32 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev, /* When serial transmit in tx_blocking mode, * if the activated mode is RT_TRUE, it will return directly */ - if (tx_fifo->activated == RT_TRUE) return 0; + if (tx_fifo->activated == RT_TRUE) + { + return 0; + } tx_fifo->activated = RT_TRUE; + + /* clear tx_cpt flag */ + rt_completion_wait(&tx_fifo->tx_cpt, 0); + /* Call the transmit interface for transmission */ - rst = serial->ops->transmit(serial, + send_size = serial->ops->transmit(serial, (rt_uint8_t *)buffer, size, RT_SERIAL_TX_BLOCKING); + /* Waiting for the transmission to complete */ - rt_completion_wait(&(tx_fifo->tx_cpt), RT_WAITING_FOREVER); + ret = rt_completion_wait(&tx_fifo->tx_cpt, tx_fifo->tx_timeout); + if(RT_EOK != ret) + { + return -RT_ETIMEOUT == ret ? -RT_ETIMEOUT : 0; + } + /* Inactive tx mode flag */ tx_fifo->activated = RT_FALSE; - return rst; + return send_size; } /** @@ -504,7 +553,7 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev, * @param pos Empty parameter. * @param buffer Transmit data buffer. * @param size Transmit data buffer length. - * @return Return the final length of data transmit. + * @return Returns the final length of data transmitted. If not all data can be sent within the timeout period, returns -RT_ETIMEOUT. */ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev, rt_off_t pos, @@ -512,16 +561,14 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev, rt_size_t size) { struct rt_serial_device *serial; - struct rt_serial_tx_fifo *tx_fifo = RT_NULL; - rt_size_t length = size; - rt_size_t offset = 0; + struct rt_serial_tx_fifo *tx_fifo; + rt_base_t level; + rt_size_t send_size = 0; if (size == 0) return 0; + RT_ASSERT(dev != RT_NULL && buffer != RT_NULL); - RT_ASSERT(dev != RT_NULL); serial = (struct rt_serial_device *)dev; - RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL)); - tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx; RT_ASSERT(tx_fifo != RT_NULL); @@ -535,29 +582,53 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev, if (tx_fifo->activated == RT_TRUE) return 0; tx_fifo->activated = RT_TRUE; - while (size) + rt_int32_t tx_timeout = tx_fifo->tx_timeout; + rt_tick_t now_tick = 0; + rt_tick_t begin_tick = rt_tick_get(); + + while (send_size != size) { /* Copy one piece of data into the ringbuffer at a time * until the length of the data is equal to size */ - tx_fifo->put_size = rt_ringbuffer_put(&(tx_fifo->rb), - (rt_uint8_t *)buffer + offset, - size); + level = rt_hw_interrupt_disable(); + tx_fifo->put_size = rt_ringbuffer_put(&tx_fifo->rb, + (rt_uint8_t *)buffer + send_size, + size - send_size); + rt_hw_interrupt_enable(level); + + /* clear tx_cpt flag */ + rt_completion_wait(&tx_fifo->tx_cpt, 0); /* Call the transmit interface for transmission */ serial->ops->transmit(serial, - (rt_uint8_t *)buffer + offset, + (rt_uint8_t *)buffer + send_size, tx_fifo->put_size, RT_SERIAL_TX_BLOCKING); - offset += tx_fifo->put_size; - size -= tx_fifo->put_size; + send_size += tx_fifo->put_size; + /* Waiting for the transmission to complete */ - rt_completion_wait(&(tx_fifo->tx_cpt), RT_WAITING_FOREVER); + rt_completion_wait(&tx_fifo->tx_cpt, tx_timeout); + if(tx_timeout != RT_WAITING_FOREVER) + { + now_tick = rt_tick_get(); + if(now_tick - begin_tick >= tx_fifo->tx_timeout) + { + return -RT_ETIMEOUT; + } + else + { + if(now_tick > begin_tick) + tx_timeout = tx_fifo->tx_timeout - (now_tick - begin_tick); + else + tx_timeout = begin_tick + tx_fifo->tx_timeout - now_tick + 1; + } + } } /* Finally Inactivate the tx->fifo */ tx_fifo->activated = RT_FALSE; - return length; + return send_size; } /** @@ -576,15 +647,16 @@ static rt_ssize_t _serial_fifo_tx_nonblocking(struct rt_device *dev, { struct rt_serial_device *serial; struct rt_serial_tx_fifo *tx_fifo; + rt_uint8_t *put_ptr; rt_base_t level; - rt_size_t length; + rt_size_t send_size = 0; - RT_ASSERT(dev != RT_NULL); if (size == 0) return 0; + RT_ASSERT(dev != RT_NULL && buffer != RT_NULL); serial = (struct rt_serial_device *)dev; - RT_ASSERT((serial != RT_NULL) && (buffer != RT_NULL)); tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx; + RT_ASSERT(tx_fifo != RT_NULL); level = rt_hw_interrupt_disable(); @@ -594,13 +666,13 @@ static rt_ssize_t _serial_fifo_tx_nonblocking(struct rt_device *dev, * start copying data into the ringbuffer */ tx_fifo->activated = RT_TRUE; /* Copying data into the ringbuffer */ - length = rt_ringbuffer_put(&(tx_fifo->rb), buffer, size); + send_size = rt_ringbuffer_put(&tx_fifo->rb, buffer, size); + + /* Get the linear length buffer from rinbuffer */ + tx_fifo->put_size = rt_serial_get_linear_buffer(&tx_fifo->rb, &put_ptr); rt_hw_interrupt_enable(level); - rt_uint8_t *put_ptr = RT_NULL; - /* Get the linear length buffer from rinbuffer */ - tx_fifo->put_size = rt_serial_get_linear_buffer(&(tx_fifo->rb), &put_ptr); /* Call the transmit interface for transmission */ serial->ops->transmit(serial, put_ptr, @@ -608,7 +680,7 @@ static rt_ssize_t _serial_fifo_tx_nonblocking(struct rt_device *dev, RT_SERIAL_TX_NON_BLOCKING); /* In tx_nonblocking mode, there is no need to call rt_completion_wait() APIs to wait * for the rt_current_thread to resume */ - return length; + return send_size; } /* If the activated mode is RT_TRUE, it means that serial device is transmitting, @@ -617,11 +689,11 @@ static rt_ssize_t _serial_fifo_tx_nonblocking(struct rt_device *dev, * to prevent multi thread reentrant */ /* Copying data into the ringbuffer */ - length = rt_ringbuffer_put(&(tx_fifo->rb), buffer, size); + send_size = rt_ringbuffer_put(&tx_fifo->rb, buffer, size); rt_hw_interrupt_enable(level); - return length; + return send_size; } @@ -676,8 +748,8 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, tx_fifo = (struct rt_serial_tx_fifo *) rt_malloc (sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz); RT_ASSERT(tx_fifo != RT_NULL); - - rt_ringbuffer_init(&(tx_fifo->rb), + rt_memset(tx_fifo, RT_NULL, sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz); + rt_ringbuffer_init(&tx_fifo->rb, tx_fifo->buffer, serial->config.tx_bufsz); serial->serial_tx = tx_fifo; @@ -693,10 +765,9 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, tx_fifo = (struct rt_serial_tx_fifo*) rt_malloc (sizeof(struct rt_serial_tx_fifo)); RT_ASSERT(tx_fifo != RT_NULL); - + rt_memset(tx_fifo, RT_NULL, sizeof(struct rt_serial_tx_fifo)); /* Init rb.buffer_ptr to RT_NULL, in rt_serial_write() need check it * otherwise buffer_ptr maybe a random value, as rt_malloc not init memory */ - tx_fifo->rb.buffer_ptr = RT_NULL; serial->serial_tx = tx_fifo; #ifndef RT_USING_DEVICE_OPS @@ -707,12 +778,13 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, serial->ops->control(serial, RT_DEVICE_CTRL_CONFIG, (void *)RT_SERIAL_TX_BLOCKING); - rt_memset(&tx_fifo->rb, RT_NULL, sizeof(tx_fifo->rb)); } tx_fifo->activated = RT_FALSE; tx_fifo->put_size = 0; - rt_completion_init(&(tx_fifo->tx_cpt)); + tx_fifo->tx_timeout = RT_WAITING_FOREVER; + + rt_completion_init(&tx_fifo->tx_cpt); dev->open_flag |= RT_SERIAL_TX_BLOCKING; return RT_EOK; @@ -723,19 +795,22 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, tx_fifo = (struct rt_serial_tx_fifo *) rt_malloc (sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz); RT_ASSERT(tx_fifo != RT_NULL); + rt_memset(tx_fifo, RT_NULL, sizeof(struct rt_serial_tx_fifo) + serial->config.tx_bufsz); - tx_fifo->activated = RT_FALSE; - tx_fifo->put_size = 0; - rt_ringbuffer_init(&(tx_fifo->rb), + rt_ringbuffer_init(&tx_fifo->rb, tx_fifo->buffer, serial->config.tx_bufsz); serial->serial_tx = tx_fifo; + tx_fifo->activated = RT_FALSE; + tx_fifo->put_size = 0; + #ifndef RT_USING_DEVICE_OPS dev->write = _serial_fifo_tx_nonblocking; #endif dev->open_flag |= RT_SERIAL_TX_NON_BLOCKING; + /* Call the control() API to configure the serial device by RT_SERIAL_TX_NON_BLOCKING*/ serial->ops->control(serial, RT_DEVICE_CTRL_CONFIG, @@ -783,9 +858,10 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev, rx_fifo = (struct rt_serial_rx_fifo *) rt_malloc (sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz); - RT_ASSERT(rx_fifo != RT_NULL); - rt_ringbuffer_init(&(rx_fifo->rb), rx_fifo->buffer, serial->config.rx_bufsz); + rt_memset(rx_fifo, RT_NULL, sizeof(struct rt_serial_rx_fifo) + serial->config.rx_bufsz); + + rt_ringbuffer_init(&rx_fifo->rb, rx_fifo->buffer, serial->config.rx_bufsz); serial->serial_rx = rx_fifo; @@ -803,9 +879,12 @@ static rt_err_t rt_serial_rx_enable(struct rt_device *dev, return RT_EOK; } + /* When using RT_SERIAL_RX_BLOCKING, rt_completion_init() and rx_cpt_index are initialized */ rx_fifo->rx_cpt_index = 0; - rt_completion_init(&(rx_fifo->rx_cpt)); + rx_fifo->rx_timeout = RT_WAITING_FOREVER; + + rt_completion_init(&rx_fifo->rx_cpt); dev->open_flag |= RT_SERIAL_RX_BLOCKING; /* Call the control() API to configure the serial device by RT_SERIAL_RX_BLOCKING*/ serial->ops->control(serial, @@ -836,22 +915,20 @@ static rt_err_t rt_serial_rx_disable(struct rt_device *dev, if (serial->serial_rx == RT_NULL) return RT_EOK; - do + if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING) + { + dev->open_flag &= ~ RT_SERIAL_RX_NON_BLOCKING; + serial->ops->control(serial, + RT_DEVICE_CTRL_CLR_INT, + (void *)RT_SERIAL_RX_NON_BLOCKING); + } + else { - if (rx_oflag == RT_SERIAL_RX_NON_BLOCKING) - { - dev->open_flag &= ~ RT_SERIAL_RX_NON_BLOCKING; - serial->ops->control(serial, - RT_DEVICE_CTRL_CLR_INT, - (void *)RT_SERIAL_RX_NON_BLOCKING); - break; - } - dev->open_flag &= ~ RT_SERIAL_RX_BLOCKING; serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *)RT_SERIAL_RX_BLOCKING); - } while (0); + } rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); @@ -885,29 +962,29 @@ static rt_err_t rt_serial_tx_disable(struct rt_device *dev, tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx; RT_ASSERT(tx_fifo != RT_NULL); - do + if (tx_oflag == RT_SERIAL_TX_NON_BLOCKING) { - if (tx_oflag == RT_SERIAL_TX_NON_BLOCKING) - { - dev->open_flag &= ~ RT_SERIAL_TX_NON_BLOCKING; - - serial->ops->control(serial, - RT_DEVICE_CTRL_CLR_INT, - (void *)RT_SERIAL_TX_NON_BLOCKING); - break; - } + dev->open_flag &= ~ RT_SERIAL_TX_NON_BLOCKING; - rt_completion_done(&(tx_fifo->tx_cpt)); + serial->ops->control(serial, + RT_DEVICE_CTRL_CLR_INT, + (void *)RT_SERIAL_TX_NON_BLOCKING); + } + else + { + rt_completion_done(&tx_fifo->tx_cpt); dev->open_flag &= ~ RT_SERIAL_TX_BLOCKING; serial->ops->control(serial, RT_DEVICE_CTRL_CLR_INT, (void *)RT_SERIAL_TX_BLOCKING); - } while (0); + } + + rt_free(tx_fifo); serial->serial_tx = RT_NULL; - rt_memset(&serial->rx_notify, 0, sizeof(struct rt_device_notify)); + rt_memset(&serial->rx_notify, RT_NULL, sizeof(struct rt_device_notify)); return RT_EOK; } @@ -1082,7 +1159,7 @@ static void _tc_flush(struct rt_serial_device *serial, int queue) RT_ASSERT(serial != RT_NULL); - device = &(serial->parent); + device = &serial->parent; rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; switch(queue) @@ -1161,18 +1238,112 @@ static rt_err_t rt_serial_control(struct rt_device *dev, } break; case RT_DEVICE_CTRL_NOTIFY_SET: - if (args) + if (args != RT_NULL) { rt_memcpy(&serial->rx_notify, args, sizeof(struct rt_device_notify)); } break; case RT_DEVICE_CTRL_CONSOLE_OFLAG: - if (args) + if (args != RT_NULL) { *(rt_uint16_t*)args = RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM; } break; + + /* Call before rt_device_read */ + case RT_SERIAL_CTRL_RX_TIMEOUT: + if (args != RT_NULL) + { + struct rt_serial_rx_fifo* rx_fifo = RT_NULL; + rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; + rx_fifo->rx_timeout = (rt_int32_t)args; + } + break; + + /* Call before rt_device_write */ + case RT_SERIAL_CTRL_TX_TIMEOUT: + if (args != RT_NULL) + { + struct rt_serial_tx_fifo* tx_fifo = RT_NULL; + tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx; + tx_fifo->tx_timeout = (rt_int32_t)args; + } + break; + + /* Discard all data */ + case RT_SERIAL_CTRL_RX_FLUSH: + if(!(serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)) + { + struct rt_serial_rx_fifo* rx_fifo; + rt_base_t level; + rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; + + while (serial->ops->getc(serial) != -1) + { + } + + level = rt_hw_interrupt_disable(); + rx_fifo->rx_cpt_index = 0; + rt_ringbuffer_reset(&rx_fifo->rb); + rt_hw_interrupt_enable(level); + } + break; + + /* Blocking and wait for the send buffer data to be sent. */ + case RT_SERIAL_CTRL_TX_FLUSH: + if(!(serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)) + { + struct rt_serial_tx_fifo* tx_fifo; + rt_base_t level; + + tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx; + if(serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) + { + level = rt_hw_interrupt_disable(); + if(tx_fifo->activated != RT_FALSE) + { + rt_hw_interrupt_enable(level); + rt_completion_wait(&tx_fifo->tx_cpt, RT_WAITING_FOREVER); + break; + } + rt_hw_interrupt_enable(level); + } + else + { + while(tx_fifo->activated == RT_TRUE) + { + // rt_thread_mdelay(1); + } + } + } + break; + + /* Get buf data length. */ + case RT_SERIAL_CTRL_GET_RX_DATA_LEN: + if(args == RT_NULL) + { + break; + } + + if(serial->parent.open_flag & RT_DEVICE_FLAG_STREAM) + { + LOG_W("RT_SERIAL_CTRL_RX_FLUSH not support stream mode."); + *(rt_ssize_t*)args = -1; + break; + } + else + { + struct rt_serial_rx_fifo* rx_fifo; + rt_base_t level; + rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; + + level = rt_hw_interrupt_disable(); + *(rt_ssize_t*)args = rt_ringbuffer_data_len(&rx_fifo->rb); + rt_hw_interrupt_enable(level); + } + break; + #ifdef RT_USING_POSIX_STDIO #ifdef RT_USING_POSIX_TERMIOS case TCGETA: @@ -1372,7 +1543,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev, struct rt_serial_rx_fifo * rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; level = rt_hw_interrupt_disable(); - recved = rt_ringbuffer_data_len(&(rx_fifo->rb)); + recved = rt_ringbuffer_data_len(&rx_fifo->rb); rt_hw_interrupt_enable(level); *(rt_size_t *)args = recved; @@ -1471,7 +1642,7 @@ rt_err_t rt_hw_serial_register(struct rt_serial_device *serial, struct rt_device *device; RT_ASSERT(serial != RT_NULL); - device = &(serial->parent); + device = &serial->parent; device->type = RT_Device_Class_Char; device->rx_indicate = RT_NULL; @@ -1516,37 +1687,44 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) { struct rt_serial_rx_fifo *rx_fifo; rt_size_t rx_length = 0; - rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; rt_base_t level; + rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; RT_ASSERT(rx_fifo != RT_NULL); /* If the event is RT_SERIAL_EVENT_RX_IND, rx_length is equal to 0 */ rx_length = (event & (~0xff)) >> 8; - if (rx_length) - { /* RT_SERIAL_EVENT_RX_DMADONE MODE */ + /* RT_SERIAL_EVENT_RX_DMADONE MODE */ + if (rx_length != 0) + { + /* UART_IT_IDLE and dma isr */ level = rt_hw_interrupt_disable(); - rt_serial_update_write_index(&(rx_fifo->rb), rx_length); + rt_serial_update_write_index(&rx_fifo->rb, rx_length); rt_hw_interrupt_enable(level); } - /* Get the length of the data from the ringbuffer */ rx_length = rt_ringbuffer_data_len(&rx_fifo->rb); - if (rx_length == 0) break; + if (rx_length == 0) + { + break; + } if (serial->parent.open_flag & RT_SERIAL_RX_BLOCKING) { - if (rx_fifo->rx_cpt_index && rx_length >= rx_fifo->rx_cpt_index ) + if (rx_fifo->rx_cpt_index && rx_length >= rx_fifo->rx_cpt_index) { rx_fifo->rx_cpt_index = 0; - rt_completion_done(&(rx_fifo->rx_cpt)); + rt_completion_done(&rx_fifo->rx_cpt); } } + /* Trigger the receiving completion callback */ if (serial->parent.rx_indicate != RT_NULL) - serial->parent.rx_indicate(&(serial->parent), rx_length); + { + serial->parent.rx_indicate(&serial->parent, rx_length); + } - if (serial->rx_notify.notify) + if (serial->rx_notify.notify != RT_NULL) { serial->rx_notify.notify(serial->rx_notify.dev); } @@ -1563,28 +1741,29 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) /* Get the length of the data from the ringbuffer */ tx_length = rt_ringbuffer_data_len(&tx_fifo->rb); + /* If there is no data in tx_ringbuffer, * then the transmit completion callback is triggered*/ if (tx_length == 0) { - /* Trigger the transmit completion callback */ - if (serial->parent.tx_complete != RT_NULL) - serial->parent.tx_complete(&serial->parent, RT_NULL); - - /* Maybe some datas left in the buffer still need to be sent in block mode, - * so tx_fifo->activated should be RT_TRUE */ + /* Maybe some datas left in the buffer still need to be sent in block mode */ if (serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) { - rt_completion_done(&(tx_fifo->tx_cpt)); + rt_completion_done(&tx_fifo->tx_cpt); } - else + + /* Trigger the transmit completion callback */ + if (serial->parent.tx_complete != RT_NULL) { - tx_fifo->activated = RT_FALSE; + serial->parent.tx_complete(&serial->parent, RT_NULL); } + tx_fifo->activated = RT_FALSE; + break; } + tx_fifo->activated = RT_TRUE; /* Call the transmit interface for transmission again */ /* Note that in interrupt mode, tx_fifo->buffer and tx_length * are inactive parameters */ @@ -1600,38 +1779,46 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) case RT_SERIAL_EVENT_TX_DMADONE: { struct rt_serial_tx_fifo *tx_fifo; + rt_size_t tx_length = 0; tx_fifo = (struct rt_serial_tx_fifo *)serial->serial_tx; RT_ASSERT(tx_fifo != RT_NULL); - tx_fifo->activated = RT_FALSE; + rt_serial_update_read_index(&tx_fifo->rb, tx_fifo->put_size); - /* Trigger the transmit completion callback */ - if (serial->parent.tx_complete != RT_NULL) - serial->parent.tx_complete(&serial->parent, RT_NULL); + /* Get the length of the data from the ringbuffer */ + tx_length = rt_ringbuffer_data_len(&tx_fifo->rb); - if (serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) + if (tx_length == 0) { - rt_completion_done(&(tx_fifo->tx_cpt)); + if (serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) + { + rt_completion_done(&tx_fifo->tx_cpt); + } + + /* Trigger the transmit completion callback */ + if (serial->parent.tx_complete != RT_NULL) + { + serial->parent.tx_complete(&serial->parent, RT_NULL); + } + + tx_fifo->activated = RT_FALSE; + break; } - rt_serial_update_read_index(&tx_fifo->rb, tx_fifo->put_size); - /* Get the length of the data from the ringbuffer. - * If there is some data in tx_ringbuffer, + /* If there is some data in tx_ringbuffer, * then call the transmit interface for transmission again */ - if (rt_ringbuffer_data_len(&tx_fifo->rb)) - { - tx_fifo->activated = RT_TRUE; - - rt_uint8_t *put_ptr = RT_NULL; - /* Get the linear length buffer from rinbuffer */ - tx_fifo->put_size = rt_serial_get_linear_buffer(&(tx_fifo->rb), &put_ptr); - /* Call the transmit interface for transmission again */ - serial->ops->transmit(serial, - put_ptr, - tx_fifo->put_size, - RT_SERIAL_TX_NON_BLOCKING); - } + tx_fifo->activated = RT_TRUE; + + rt_uint8_t *put_ptr = RT_NULL; + /* Get the linear length buffer from rinbuffer */ + tx_fifo->put_size = rt_serial_get_linear_buffer(&tx_fifo->rb, &put_ptr); + + /* Call the transmit interface for transmission again */ + serial->ops->transmit(serial, + put_ptr, + tx_fifo->put_size, + RT_SERIAL_TX_NON_BLOCKING); break; } diff --git a/examples/utest/testcases/drivers/serial_v2/README.md b/examples/utest/testcases/drivers/serial_v2/README.md index 3a6625f4bc0..664cf220343 100644 --- a/examples/utest/testcases/drivers/serial_v2/README.md +++ b/examples/utest/testcases/drivers/serial_v2/README.md @@ -14,6 +14,12 @@ | uart_blocking_rx.c| 串口阻塞接收模式 的测试 | | uart_nonblocking_tx.c| 串口非阻塞发送模式 的测试 | | uart_nonblocking_rx.c | 串口非阻塞接收模式 的测试 | +| uart_flush_rx | 刷新接收缓冲区的测试 | +| uart_flush_txb | 阻塞模式下刷新发送缓冲区的测试 | +| uart_flush_txnb | 非阻塞模式下刷新发送缓冲区的测试 | +| uart_timeout_rxb_txb | 串口 发送 / 接收 超时的测试 | +| uart_overflow_rxb_txb | 串口溢出处理的测试 | +| uart_get_rx_data_len | 获取串口接收缓冲区中的数据长度的测试 | ## 3、软硬件环境 @@ -77,37 +83,22 @@ 需要解释的是,为什么会存在无意义的组合模式,举个例子,非阻塞模式下,肯定是不会出现POLL(轮询)方式的,因为POLL方式已经表明是阻塞方式了。 该测试用例在测试多种组合时,需要通过更改`rtconfig.h`文件对硬件模式进行静态配置。 -### 4.2 测试思路 +### 4.2 测试条件 -前四个测试用例的测试思路: +默认测试串口为`**uart2**`请根据需要修改宏定义 ->硬件上:**短接串口的发送TX引脚和接收RX引脚,完成自发自收的回路**。 -> ->软件上:创建两个线程A和B,A为接收线程,B为发送线程,设置A线程优先级比B线程优先级高。发送线程发送随机长度(长度范围是 0 到 1000)的数据,接收线程接收到数据进行校验,数据正确则测试通过,默认测试100次。 +**短接串口的发送TX引脚和接收RX引脚,完成自发自收的回路**。 -后四个测试用例的测试思路: +大致的测试思路: ->硬件上: **不需要将TX,RX引脚进行短接**,每次只针对发送或接收中的一种进行测试,更为简单与直接 -> ->软件上: 四个样例每次仅测试TX/RX中的一种引脚与一种对应的阻塞/非阻塞模式 ->四种测试模式具体分为: ->>阻塞接收模式----(硬件工作模式可选: 轮询, 中断, DMA) ->>阻塞发送模式----(硬件工作模式可选: 轮询, 中断, DMA) ->>非阻塞接收模式--(硬件工作模式可选: 中断, DMA) ->>非阻塞发送模式--(硬件工作模式可选: 中断, DMA) -> ->其中阻塞或非阻塞背后的具体硬件工作模式选择(如 轮询, 中断, DMA)需要对`rtconfig.h`文件做出配置,具体配置流程可见文章中关于 - [seril_v2硬件工作模式的选择](https://club.rt-thread.org/ask/article/b4c536303c8e2335.html "serial_v2源码分析")一节. -> >发送测试流程 : >>1. 先关闭串口,再以需要测试的模式打开. ->>2. 然后依次发送 UART_SEND_TIMES(默认为400) * 1024, 8, 32, 128, 512, 1024个数据. ->>3. 发送的同时记录每次发送所耗费的时钟周期与成功发送的数据数量. ->>3. 打印记录的数据,通过时钟周期来反应发送效率, 通过成功发送的数据量来反应是否产生丢包问题. +>>2. 然后依次发送 UART_SEND_TIMES(默认为100) * (1000以内的随机数)个数据. +>>3. 打印记录的数据,通过LOG日志的时钟周期来反应发送效率, 通过成功发送的数据量来反应是否产生丢包问题. > >接收测试流程 : >>1. 先关闭串口,再以需要测试的模式打开. ->>2. 然后以此接收 256, 256, 256, 128, 128, 共计1024个数据 +>>2. 然后以此接收 同发送测试流程一致的(1000以内随机数)个数据 >>3. 接收的同时记录成功接收的数据数量 >>4. 打印记录的数据, 通过现实成功接收的数据量与串口发送的数据量做对比,来验证是否出现丢包问题 @@ -140,7 +131,7 @@ RT-Thread Utestcases ---> \- 在 MSH 中输入 `utest_run testcases.drivers.uart_nonblocking_tx` 运行串口非阻塞发送测试 -\- 在 MSH 中输入 `utest_run testcases.drivers.uart_nonblocking_rx` 运行串口非阻塞接收测试 +其余同理,可在函数内部查看命令。 如果仅仅配置了 `Serial testcase` 相关的测试用例,则直接输入 `utest_run` 运行即可将上述测试用例按序测试。 @@ -152,7 +143,5 @@ RT-Thread Utestcases ---> \- 需在 MSH 中输入正确的命令行。 -\- 测试用例默认的测试数据长度范围最大为1000字节,如果接收端的缓冲区大小配置为小于1000字节时,那么在测试接收阻塞模式时,将会由于获取不了1000字节长度导致线程持续阻塞(因为测试用例是按 `recv_len` 长度去接收的,而不是按照单字节去接收的),因此建议接收端的缓冲区大小 (对应宏例如为 `BSP_UART2_RX_BUFSIZE`)设置为1024即可;当然也可按需减小测试的最大数据长度。 - \- 该测试用例需要结合硬件具体的工作模式(POLL 、INT、DMA)进行测试,而硬件工作模式只能选择一种,因此需要在 `rtconfig.h` 中对串口相应的宏进行配置,来选择不同的工作模式去进行测试。 diff --git a/examples/utest/testcases/drivers/serial_v2/SConscript b/examples/utest/testcases/drivers/serial_v2/SConscript index a7438e3a32d..d0dbb5ae777 100644 --- a/examples/utest/testcases/drivers/serial_v2/SConscript +++ b/examples/utest/testcases/drivers/serial_v2/SConscript @@ -2,19 +2,11 @@ Import('rtconfig') from building import * cwd = GetCurrentDir() -src = Split(''' -uart_rxb_txnb.c -uart_rxb_txb.c -uart_rxnb_txb.c -uart_rxnb_txnb.c -uart_blocking_rx.c -uart_blocking_tx.c -uart_nonblocking_rx.c -uart_nonblocking_tx.c -''') +src = Glob('*.c') CPPPATH = [cwd] group = DefineGroup('utestcases', src, depend = ['UTEST_SERIAL_TC'], CPPPATH = CPPPATH) Return('group') + diff --git a/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c index 2beb9e6fd94..c1fdcfb3d24 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c @@ -2,53 +2,53 @@ #include #include "utest.h" -#define SERIAL_UART_NAME "uart2" - +#define TC_UART_DEVICE_NAME "uart2" +#define DBG_LVL DBG_LOG #ifdef UTEST_SERIAL_TC static rt_bool_t block_read(rt_device_t uart_dev) { rt_size_t total_length, recv_length; - rt_uint8_t uart_read_buffer[1024], log_buffer[64]; + char uart_read_buffer[1024], log_buffer[64]; /* make sure device is closed and reopen it */ - while(rt_device_close(uart_dev) != -RT_ERROR); + while (rt_device_close(uart_dev) != -RT_ERROR); rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_RX_BLOCKING); rt_sprintf(log_buffer, "\nBLOCKING READ BEGIN, PLEASE SEND SOME DATAS\n"); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); - total_length = 0; - recv_length = 0; - recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 256); + total_length = 0; + recv_length = 0; + recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, rt_strlen(log_buffer)); total_length += recv_length; rt_sprintf(log_buffer, "\nblock : %d bytes read, total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); - recv_length = 0; - recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 256); + recv_length = 0; + recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, rt_strlen(log_buffer)); total_length += recv_length; rt_sprintf(log_buffer, "\nblock : %d bytes read , total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); - recv_length = 0; - recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 256); + recv_length = 0; + recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, rt_strlen(log_buffer)); total_length += recv_length; rt_sprintf(log_buffer, "\nblock : %d bytes read , total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); - recv_length = 0; - recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 128); + recv_length = 0; + recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, rt_strlen(log_buffer)); total_length += recv_length; rt_sprintf(log_buffer, "\nblock : %d bytes read , total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); - recv_length = 0; - recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 128); + recv_length = 0; + recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, rt_strlen(log_buffer)); total_length += recv_length; rt_sprintf(log_buffer, "\nblock : %d bytes read , total: %d \n", recv_length, total_length); @@ -64,10 +64,10 @@ static rt_bool_t block_read(rt_device_t uart_dev) static void uart_test_blocking_rx(void) { rt_device_t uart_dev; - uart_dev = rt_device_find(SERIAL_UART_NAME); + uart_dev = rt_device_find(TC_UART_DEVICE_NAME); uassert_not_null(uart_dev); - uassert_true (block_read(uart_dev)); + uassert_true(block_read(uart_dev)); } static rt_err_t utest_tc_init(void) @@ -77,10 +77,8 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev; - uart_dev = rt_device_find(SERIAL_UART_NAME); - while(rt_device_close(uart_dev) != -RT_ERROR); - rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c b/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c index a3653079c13..a7c650ebed0 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c @@ -2,17 +2,19 @@ #include #include "utest.h" -#define SERIAL_UART_NAME "uart2" +#define TC_UART_DEVICE_NAME "uart2" #define UART_SEND_TIMES 400 #define UART_TEST_NUMBER 6 +#define DBG_LVL DBG_LOG + #ifdef UTEST_SERIAL_TC static rt_bool_t block_write(rt_device_t uart_dev) { rt_size_t i, wr_sz, index, write_num_array[UART_TEST_NUMBER], total_write_num[UART_TEST_NUMBER]; rt_tick_t tick1, tick2, tick_array[UART_TEST_NUMBER]; - rt_uint8_t uart_write_buffer[1024]; + char uart_write_buffer[1024]; for (i = 0; i < 1024; i++) uart_write_buffer[i] = '0' + (i % 49); @@ -89,7 +91,7 @@ static rt_bool_t block_write(rt_device_t uart_dev) static void uart_test_blocking_tx(void) { rt_device_t uart_dev; - uart_dev = rt_device_find(SERIAL_UART_NAME); + uart_dev = rt_device_find(TC_UART_DEVICE_NAME); uassert_not_null(uart_dev); uassert_true (block_write(uart_dev)); @@ -102,10 +104,8 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev; - uart_dev = rt_device_find(SERIAL_UART_NAME); - while(rt_device_close(uart_dev) != -RT_ERROR); - rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c new file mode 100644 index 00000000000..50e886f5def --- /dev/null +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * + */ + +#include +#include "utest.h" +#include +#include + +#define DBG_LVL DBG_LOG + +#define TC_UART_DEVICE_NAME "uart2" + +#ifdef UTEST_SERIAL_TC + +static struct rt_serial_device *serial; + +static rt_err_t uart_find(void) +{ + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + + if (serial == RT_NULL) + { + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + return -RT_ERROR; + } + + return RT_EOK; +} + + +static rt_bool_t uart_api() +{ + rt_err_t result = RT_EOK; + + result = uart_find(); + if (result != RT_EOK) + { + return RT_FALSE; + } + + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); + + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + if (result != RT_EOK) + { + LOG_E("Open uart device failed."); + return RT_FALSE; + } + + rt_uint8_t *ch; + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_TX_BUFSIZE * 2 + 1)); + + rt_device_write(&serial->parent, 0, ch, BSP_UART2_TX_BUFSIZE / 2); + rt_thread_mdelay(100); + if (1 != rt_device_read(&serial->parent, 0, ch, 1)) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); + if (0 != rt_device_read(&serial->parent, 0, ch, 1)) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_write(&serial->parent, 0, ch, BSP_UART2_TX_BUFSIZE); + rt_thread_mdelay(100); + if (1 != rt_device_read(&serial->parent, 0, ch, 1)) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); + if (0 != rt_device_read(&serial->parent, 0, ch, 1)) + { + result = -RT_ERROR; + goto __exit; + } + + + rt_device_write(&serial->parent, 0, ch, BSP_UART2_TX_BUFSIZE * 2); + rt_thread_mdelay(100); + if (1 != rt_device_read(&serial->parent, 0, ch, 1)) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); + if (0 != rt_device_read(&serial->parent, 0, ch, 1)) + { + result = -RT_ERROR; + goto __exit; + } + +__exit: + rt_free(ch); + rt_device_close(&serial->parent); + return result == RT_EOK ? RT_TRUE : RT_FALSE; +} + +static void tc_uart_api(void) +{ + uassert_true(uart_api() == RT_TRUE); +} + +static rt_err_t utest_tc_init(void) +{ + LOG_I("UART TEST: Please connect Tx and Rx directly for self testing."); + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(tc_uart_api); +} + +UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_flush_rx", utest_tc_init, utest_tc_cleanup, 30); + +#endif /* TC_UART_USING_TC */ diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c new file mode 100644 index 00000000000..325cc0a793d --- /dev/null +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * + */ + +#include +#include "utest.h" +#include +#include + +#define DBG_LVL DBG_LOG + +#define TC_UART_DEVICE_NAME "uart2" + +#ifdef UTEST_SERIAL_TC + +static struct rt_serial_device *serial; + +static rt_err_t uart_find(void) +{ + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + + if (serial == RT_NULL) + { + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + return -RT_ERROR; + } + + return RT_EOK; +} + + +static rt_bool_t uart_api() +{ + rt_err_t result = RT_EOK; + + result = uart_find(); + if (result != RT_EOK) + { + return RT_FALSE; + } + + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = 64; + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); + + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + if (result != RT_EOK) + { + LOG_E("Open uart device failed."); + return RT_FALSE; + } + + rt_uint8_t *ch; + rt_uint32_t old_tick; + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (256 * 5 + 10)); + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_TIMEOUT, (void *)1); + rt_device_write(&serial->parent, 0, ch, 256 * 5); + + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_write(&serial->parent, 0, ch, 256 * 5 + 1); + + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } + +__exit: + rt_free(ch); + rt_device_close(&serial->parent); + return result == RT_EOK ? RT_TRUE : RT_FALSE; +} + +static void tc_uart_api(void) +{ + uassert_true(uart_api() == RT_TRUE); +} + +static rt_err_t utest_tc_init(void) +{ + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(tc_uart_api); +} + +UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_flush_txb", utest_tc_init, utest_tc_cleanup, 30); + +#endif /* TC_UART_USING_TC */ diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c new file mode 100644 index 00000000000..18950a9aad2 --- /dev/null +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * + */ + +#include +#include "utest.h" +#include +#include + +#define DBG_LVL DBG_LOG + +#define TC_UART_DEVICE_NAME "uart2" + +#ifdef UTEST_SERIAL_TC + +static struct rt_serial_device *serial; + +static rt_err_t uart_find(void) +{ + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + + if (serial == RT_NULL) + { + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + return -RT_ERROR; + } + + return RT_EOK; +} + + +static rt_bool_t uart_api() +{ + rt_err_t result = RT_EOK; + + result = uart_find(); + if (result != RT_EOK) + { + return RT_FALSE; + } + + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = 256; + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); + + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING); + if (result != RT_EOK) + { + LOG_E("Open uart device failed."); + return RT_FALSE; + } + + rt_uint8_t *ch; + rt_uint32_t old_tick; + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (256 * 5 + 10)); + + rt_device_write(&serial->parent, 0, ch, 256 * 5); + + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_write(&serial->parent, 0, ch, 256 * 5 + 1); + + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } + +__exit: + rt_free(ch); + rt_device_close(&serial->parent); + return result == RT_EOK ? RT_TRUE : RT_FALSE; +} + +static void tc_uart_api(void) +{ + uassert_true(uart_api() == RT_TRUE); +} + +static rt_err_t utest_tc_init(void) +{ + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(tc_uart_api); +} + +UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_flush_txnb", utest_tc_init, utest_tc_cleanup, 30); + +#endif /* TC_UART_USING_TC */ diff --git a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c new file mode 100644 index 00000000000..534cd589605 --- /dev/null +++ b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * + */ + +#include +#include "utest.h" +#include +#include + +/* #define DBG_LVL DBG_LOG*/ + +#define TC_UART_DEVICE_NAME "uart2" + +#ifdef UTEST_SERIAL_TC + +static struct rt_serial_device *serial; +static rt_uint8_t uart_over_flag = RT_FALSE; + +static rt_err_t uart_find(void) +{ + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + + if (serial == RT_NULL) + { + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + return -RT_ERROR; + } + + return RT_EOK; +} +static rt_bool_t uart_api() +{ + rt_err_t result = RT_EOK; + + result = uart_find(); + if (result != RT_EOK) + { + return RT_FALSE; + } + + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); + + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + if (result != RT_EOK) + { + LOG_E("Open uart device failed."); + return RT_FALSE; + } + + rt_uint8_t *ch; + rt_uint32_t old_tick; + rt_ssize_t send_len; + rt_ssize_t buf_data_len; + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_TX_BUFSIZE * 2 + 1)); + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + if (0 != buf_data_len) + { + result = -RT_ERROR; + goto __exit; + } + + send_len = rt_device_write(&serial->parent, 0, ch, 30); + rt_thread_delay(100); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + if (30 != buf_data_len) + { + result = -RT_ERROR; + goto __exit; + } + + if (30 != rt_device_read(&serial->parent, 0, ch, 30)) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + if (0 != buf_data_len) + { + result = -RT_ERROR; + goto __exit; + } + + send_len = rt_device_write(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE * 2); + rt_thread_delay(100); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + if (BSP_UART2_RX_BUFSIZE != buf_data_len) + { + result = -RT_ERROR; + goto __exit; + } + + if (BSP_UART2_RX_BUFSIZE != rt_device_read(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE)) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + if (0 != buf_data_len) + { + result = -RT_ERROR; + goto __exit; + } + + send_len = rt_device_write(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE + 20); + rt_thread_delay(100); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + if (BSP_UART2_RX_BUFSIZE != buf_data_len) + { + result = -RT_ERROR; + goto __exit; + } + + if (BSP_UART2_RX_BUFSIZE != rt_device_read(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE)) + { + result = -RT_ERROR; + goto __exit; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + if (0 != buf_data_len) + { + result = -RT_ERROR; + goto __exit; + } + +__exit: + rt_free(ch); + rt_device_close(&serial->parent); + return result == RT_EOK ? RT_TRUE : RT_FALSE; +} + +static void tc_uart_api(void) +{ + uassert_true(uart_api() == RT_TRUE); +} + +static rt_err_t utest_tc_init(void) +{ + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(tc_uart_api); +} + +UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_get_rx_data_len", utest_tc_init, utest_tc_cleanup, 30); + +#endif /* TC_UART_USING_TC */ diff --git a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c index 72b5e1e332f..3dbdddb7c99 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c @@ -2,17 +2,17 @@ #include #include "utest.h" -#define SERIAL_UART_NAME "uart2" - +#define TC_UART_DEVICE_NAME "uart2" +#define DBG_LVL DBG_LOG #ifdef UTEST_SERIAL_TC static rt_bool_t nonblock_read(rt_device_t uart_dev) { rt_size_t total_length, recv_length; - rt_uint8_t uart_read_buffer[1024], log_buffer[64]; + char uart_read_buffer[1024], log_buffer[64]; /* make sure device is closed and reopen it */ - while(rt_device_close(uart_dev) != -RT_ERROR); + while (rt_device_close(uart_dev) != -RT_ERROR); rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING); rt_sprintf(log_buffer, "\nNONBLOCKING READ BEGIN, PLEASE SEND SOME DATAS\n"); @@ -22,7 +22,7 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) rt_device_write(uart_dev, 0, "5\n", 2); recv_length = 0; recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 256); - rt_device_write(uart_dev, 0, uart_read_buffer, 256); + rt_device_write(uart_dev, 0, uart_read_buffer, 256); total_length += recv_length; rt_thread_mdelay(1000); @@ -36,8 +36,8 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) total_length += recv_length; rt_thread_mdelay(1000); - rt_sprintf(log_buffer,"\nnonblock : %d bytes read , total: %d \n", recv_length, total_length); - rt_device_write(uart_dev,0,log_buffer, rt_strlen(log_buffer)); + rt_sprintf(log_buffer, "\nnonblock : %d bytes read , total: %d \n", recv_length, total_length); + rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); rt_device_write(uart_dev, 0, "3\n", 2); recv_length = 0; @@ -47,7 +47,7 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) rt_thread_mdelay(1000); rt_sprintf(log_buffer, "\nnonblock : %d bytes read, total: %d \n", recv_length, total_length); - rt_device_write(uart_dev,0,log_buffer, rt_strlen(log_buffer)); + rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); rt_device_write(uart_dev, 0, "2\n", 2); recv_length = 0; @@ -56,7 +56,7 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) total_length += recv_length; rt_thread_mdelay(1000); - rt_sprintf(log_buffer,"\nnonblock : %d bytes read , total: %d \n", recv_length, total_length); + rt_sprintf(log_buffer, "\nnonblock : %d bytes read , total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); rt_device_write(uart_dev, 0, "1\n", 2); @@ -78,10 +78,10 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) static void uart_test_nonblocking_rx(void) { rt_device_t uart_dev; - uart_dev = rt_device_find(SERIAL_UART_NAME); + uart_dev = rt_device_find(TC_UART_DEVICE_NAME); uassert_not_null(uart_dev); - uassert_true (nonblock_read(uart_dev)); + uassert_true(nonblock_read(uart_dev)); } static rt_err_t utest_tc_init(void) @@ -91,10 +91,8 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev; - uart_dev = rt_device_find(SERIAL_UART_NAME); - while(rt_device_close(uart_dev) != -RT_ERROR); - rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c index eb88abceb43..60fa8dda8e2 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c @@ -2,92 +2,93 @@ #include #include "utest.h" -#define SERIAL_UART_NAME "uart2" -#define UART_SEND_TIMES 400 +#define TC_UART_DEVICE_NAME "uart2" +#define UART_SEND_TIMES 400 #define UART_TEST_NUMBER 6 +#define DBG_LVL DBG_LOG #ifdef UTEST_SERIAL_TC static rt_bool_t nonblock_write(rt_device_t uart_dev) { - rt_size_t wr_sz = 0, tmp = 0, i, write_num_array[UART_TEST_NUMBER], total_write_num[UART_TEST_NUMBER], index; - rt_tick_t tick1, tick2, tick_array[UART_TEST_NUMBER]; + rt_size_t wr_sz = 0, tmp = 0, i, write_num_array[UART_TEST_NUMBER], total_write_num[UART_TEST_NUMBER], index; + rt_tick_t tick1, tick2, tick_array[UART_TEST_NUMBER]; rt_uint8_t uart_write_buffer[1024]; for (i = 0; i < 1024; i++) uart_write_buffer[i] = '0' + (i % 50); /* make sure device is closed and reopen it */ - while(rt_device_close(uart_dev) != -RT_ERROR); - uart_dev = rt_device_find(SERIAL_UART_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + uart_dev = rt_device_find(TC_UART_DEVICE_NAME); rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_NON_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING); LOG_D("\nNONBLOCKING WRITE BEGIN\n"); rt_thread_mdelay(2000); index = 0; - tmp = 0; + tmp = 0; tick1 = rt_tick_get(); for (i = 0; i < UART_SEND_TIMES; i++) { wr_sz = 0; - while(wr_sz < 1024) - wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 1024-wr_sz); + while (wr_sz < 1024) + wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 1024 - wr_sz); tmp += wr_sz; } - tick2 = rt_tick_get(); - total_write_num[index] = UART_SEND_TIMES * 1024; - tick_array[index] = tick2 - tick1; + tick2 = rt_tick_get(); + total_write_num[index] = UART_SEND_TIMES * 1024; + tick_array[index] = tick2 - tick1; write_num_array[index++] = tmp; wr_sz = 0; tick1 = rt_tick_get(); - while(wr_sz < 8) - wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 8-wr_sz); - tick2 = rt_tick_get(); - total_write_num[index] = 8; - tick_array[index] = tick2 - tick1; + while (wr_sz < 8) + wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 8 - wr_sz); + tick2 = rt_tick_get(); + total_write_num[index] = 8; + tick_array[index] = tick2 - tick1; write_num_array[index++] = wr_sz; wr_sz = 0; tick1 = rt_tick_get(); - while(wr_sz < 32) - wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 32-wr_sz); - tick2 = rt_tick_get(); - total_write_num[index] = 32; - tick_array[index] = tick2 - tick1; + while (wr_sz < 32) + wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 32 - wr_sz); + tick2 = rt_tick_get(); + total_write_num[index] = 32; + tick_array[index] = tick2 - tick1; write_num_array[index++] = wr_sz; wr_sz = 0; tick1 = rt_tick_get(); - while(wr_sz < 128) - wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 128-wr_sz); - tick2 = rt_tick_get(); - total_write_num[index] = 128; - tick_array[index] = tick2 - tick1; + while (wr_sz < 128) + wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 128 - wr_sz); + tick2 = rt_tick_get(); + total_write_num[index] = 128; + tick_array[index] = tick2 - tick1; write_num_array[index++] = wr_sz; wr_sz = 0; tick1 = rt_tick_get(); - while(wr_sz < 512) - wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 512-wr_sz); - tick2 = rt_tick_get(); - total_write_num[index] = 512; - tick_array[index] = tick2 - tick1; + while (wr_sz < 512) + wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 512 - wr_sz); + tick2 = rt_tick_get(); + total_write_num[index] = 512; + tick_array[index] = tick2 - tick1; write_num_array[index++] = wr_sz; wr_sz = 0; tick1 = rt_tick_get(); - while(wr_sz < 1024) - wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 1024-wr_sz); - tick2 = rt_tick_get(); - total_write_num[index] = 1024; - tick_array[index] = tick2 - tick1; + while (wr_sz < 1024) + wr_sz += rt_device_write(uart_dev, 0, &uart_write_buffer[wr_sz], 1024 - wr_sz); + tick2 = rt_tick_get(); + total_write_num[index] = 1024; + tick_array[index] = tick2 - tick1; write_num_array[index++] = wr_sz; rt_thread_mdelay(1000); LOG_D("\nNONBLOCKING_TX END\n"); - for(i = 0; i < index; i++) + for (i = 0; i < index; i++) { LOG_D("\nNONBLOCKING_MODE : write %d / %d bytes in %d ticks\n", write_num_array[i], total_write_num[i], tick_array[i]); rt_thread_mdelay(1000); @@ -99,10 +100,10 @@ static rt_bool_t nonblock_write(rt_device_t uart_dev) static void uart_test_nonblocking_tx(void) { rt_device_t uart_dev; - uart_dev = rt_device_find(SERIAL_UART_NAME); + uart_dev = rt_device_find(TC_UART_DEVICE_NAME); uassert_not_null(uart_dev); - uassert_true (nonblock_write(uart_dev)); + uassert_true(nonblock_write(uart_dev)); } static rt_err_t utest_tc_init(void) @@ -112,10 +113,8 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev; - uart_dev = rt_device_find(SERIAL_UART_NAME); - while(rt_device_close(uart_dev) != -RT_ERROR); - rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c new file mode 100644 index 00000000000..35d3f3d3c63 --- /dev/null +++ b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * + */ + +#include +#include "utest.h" +#include +#include + +#define DBG_LVL DBG_LOG + +#define TC_UART_DEVICE_NAME "uart2" +#define TC_UART_SEND_TIMES 100 + + +#ifdef UTEST_SERIAL_TC + +static struct rt_serial_device *serial; +static rt_uint8_t uart_over_flag = RT_FALSE; +static rt_bool_t uart_result = RT_TRUE; + +static rt_err_t uart_find(void) +{ + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + + if (serial == RT_NULL) + { + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + return -RT_ERROR; + } + + return RT_EOK; +} + + +static void uart_send_entry(void *parameter) +{ + rt_uint16_t send_len; + rt_uint8_t *uart_write_buffer = RT_NULL; + rt_uint32_t i = 0; + send_len = *(rt_uint16_t *)parameter; + + /* assign send buffer */ + uart_write_buffer = (rt_uint8_t *)rt_malloc(send_len); + if (uart_write_buffer == RT_NULL) + { + LOG_E("Without spare memory for uart dma!"); + uart_result = RT_FALSE; + return; + } + + rt_memset(uart_write_buffer, 0, send_len); + + for (i = 0; i < send_len; i++) + { + uart_write_buffer[i] = (rt_uint8_t)i; + } + /* send buffer */ + if (rt_device_write(&serial->parent, 0, uart_write_buffer, send_len) != send_len) + { + LOG_E("device write failed\r\n"); + } + rt_free(uart_write_buffer); +} + +static void uart_rec_entry(void *parameter) +{ + rt_uint16_t rev_len; + rt_uint8_t *ch; + rt_int32_t cnt, i; + rev_len = *(rt_uint16_t *)parameter; + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (rev_len + 1)); + + while (1) + { + cnt = rt_device_read(&serial->parent, 0, (void *)ch, BSP_UART2_RX_BUFSIZE); + if (cnt != BSP_UART2_RX_BUFSIZE) + { + uart_result = RT_FALSE; + rt_free(ch); + return; + } + + for (i = cnt - 1; i >= 0; i--) + { + if (ch[i] != ((rev_len - (cnt - i)) % 256)) + { + LOG_E("Read Different data2 -> former data: %x, current data: %x.", ch[i], (rev_len - (cnt - i)) % 256); + uart_result = RT_FALSE; + rt_free(ch); + return; + } + } + + break; + } + rt_free(ch); + uart_over_flag = RT_TRUE; +} + +static rt_err_t uart_api(rt_uint16_t length) +{ + rt_thread_t thread_send = RT_NULL; + rt_thread_t thread_recv = RT_NULL; + rt_err_t result = RT_EOK; + uart_over_flag = RT_FALSE; + + result = uart_find(); + if (result != RT_EOK) + { + return -RT_ERROR; + } + + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); + + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + + if (result != RT_EOK) + { + LOG_E("Open uart device failed."); + uart_result = RT_FALSE; + return -RT_ERROR; + } + + thread_send = rt_thread_create("uart_send", uart_send_entry, &length, 2048, RT_THREAD_PRIORITY_MAX - 4, 10); + thread_recv = rt_thread_create("uart_recv", uart_rec_entry, &length, 2048, RT_THREAD_PRIORITY_MAX - 5, 10); + + if ((thread_send != RT_NULL) && (thread_recv != RT_NULL)) + { + rt_thread_startup(thread_send); + rt_thread_mdelay(length / 8 + 10); + rt_thread_startup(thread_recv); + } + else + { + result = -RT_ERROR; + goto __exit; + } + + while (1) + { + if (uart_result != RT_TRUE) + { + LOG_E("The test for uart dma is failure."); + result = -RT_ERROR; + goto __exit; + } + if (uart_over_flag == RT_TRUE) + { + goto __exit; + } + /* waiting for test over */ + rt_thread_mdelay(5); + } +__exit: + rt_device_close(&serial->parent); + return result; +} + +static void tc_uart_api(void) +{ + rt_uint32_t times = 0; + rt_uint16_t num = 0; + rt_uint32_t i = 0; + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + + while (TC_UART_SEND_TIMES - times) + { + num = (rand() % BSP_UART2_RX_BUFSIZE) + 1; + if (uart_api(num + BSP_UART2_RX_BUFSIZE) == RT_EOK) + LOG_I("data_lens [%3d], it is correct to read and write data. [%d] times testing.", num, ++times); + else + { + LOG_E("uart test error"); + break; + } + } + +__exit: + uassert_true(uart_result == RT_TRUE); +} + +static rt_err_t utest_tc_init(void) +{ + LOG_I("UART TEST: Please connect Tx and Rx directly for self testing."); + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + uart_result = RT_TRUE; + uart_over_flag = RT_FALSE; + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(tc_uart_api); +} + +UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_overflow_rxb_txb", utest_tc_init, utest_tc_cleanup, 30); + +#endif /* TC_UART_USING_TC */ diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c index 8b2205ee1a0..615fd760b80 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2019, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -13,25 +13,25 @@ #include #include +#define DBG_LVL DBG_LOG + #define TC_UART_DEVICE_NAME "uart2" -#define TC_UART_SEND_TIMES 100 +#define TC_UART_SEND_TIMES 100 #ifdef UTEST_SERIAL_TC -#define TEST_UART_NAME TC_UART_DEVICE_NAME - static struct rt_serial_device *serial; -static rt_uint8_t uart_over_flag; -static rt_bool_t uart_result = RT_TRUE; +static rt_uint8_t uart_over_flag; +static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TEST_UART_NAME); + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TEST_UART_NAME); + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); return -RT_ERROR; } @@ -44,7 +44,7 @@ static void uart_send_entry(void *parameter) rt_uint16_t send_len; rt_uint32_t i = 0; - send_len = *(rt_uint16_t *)parameter; + send_len = *(rt_uint16_t *)parameter; /* assign send buffer */ uart_write_buffer = (rt_uint8_t *)rt_malloc(send_len); if (uart_write_buffer == RT_NULL) @@ -66,7 +66,6 @@ static void uart_send_entry(void *parameter) LOG_E("device write failed\r\n"); } rt_free(uart_write_buffer); - } static void uart_rec_entry(void *parameter) @@ -76,9 +75,9 @@ static void uart_rec_entry(void *parameter) rev_len = *(rt_uint16_t *)parameter; rt_uint8_t *ch; ch = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1)); - rt_int32_t cnt, i; - rt_uint8_t last_old_data; - rt_bool_t fisrt_flag = RT_TRUE; + rt_int32_t cnt, i; + rt_uint8_t last_old_data; + rt_bool_t fisrt_flag = RT_TRUE; rt_uint32_t all_receive_length = 0; @@ -130,8 +129,8 @@ static rt_err_t uart_api(rt_uint16_t length) { rt_thread_t thread_send = RT_NULL; rt_thread_t thread_recv = RT_NULL; - rt_err_t result = RT_EOK; - uart_over_flag = RT_FALSE; + rt_err_t result = RT_EOK; + uart_over_flag = RT_FALSE; result = uart_find(); if (result != RT_EOK) @@ -141,9 +140,9 @@ static rt_err_t uart_api(rt_uint16_t length) /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; - config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = BSP_UART2_TX_BUFSIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -183,27 +182,55 @@ static rt_err_t uart_api(rt_uint16_t length) /* waiting for test over */ rt_thread_mdelay(5); } + __exit: + rt_thread_mdelay(10); rt_device_close(&serial->parent); + uart_over_flag = RT_FALSE; return result; } static void tc_uart_api(void) { rt_uint32_t times = 0; - rt_uint16_t num = 0; + rt_uint16_t num = 0; + rt_uint32_t i = 0; + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + while (TC_UART_SEND_TIMES - times) { num = (rand() % 1000) + 1; - if(uart_api(num) == RT_EOK) - LOG_I("data_lens [%3d], it is correct to read and write data. [%d] times testing.", num, ++times); + if (uart_api(num) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", num, ++times); else { LOG_E("uart test error"); break; } } - uassert_true(uart_over_flag == RT_TRUE); + +__exit: + uassert_true(uart_result == RT_TRUE); } static rt_err_t utest_tc_init(void) @@ -214,9 +241,10 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - uart_result = RT_TRUE; - uart_over_flag = RT_FALSE; - + uart_result = RT_TRUE; + uart_over_flag = RT_FALSE; + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c index f03a24fe13e..e92103b0300 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2019, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -13,26 +13,26 @@ #include #include +#define DBG_LVL DBG_LOG + #define TC_UART_DEVICE_NAME "uart2" -#define TC_UART_SEND_TIMES 100 +#define TC_UART_SEND_TIMES 100 #ifdef UTEST_SERIAL_TC -#define TEST_UART_NAME TC_UART_DEVICE_NAME - static struct rt_serial_device *serial; -static rt_sem_t tx_sem; -static rt_uint8_t uart_over_flag; -static rt_bool_t uart_result = RT_TRUE; +static rt_sem_t tx_sem; +static rt_uint8_t uart_over_flag; +static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TEST_UART_NAME); + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TEST_UART_NAME); + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); return -RT_ERROR; } @@ -50,10 +50,10 @@ static void uart_send_entry(void *parameter) { rt_uint8_t *uart_write_buffer; rt_uint16_t send_len, len = 0; - rt_err_t result; + rt_err_t result; rt_uint32_t i = 0; - send_len = *(rt_uint16_t *)parameter; + send_len = *(rt_uint16_t *)parameter; /* assign send buffer */ uart_write_buffer = (rt_uint8_t *)rt_malloc(send_len); if (uart_write_buffer == RT_NULL) @@ -72,15 +72,14 @@ static void uart_send_entry(void *parameter) /* send buffer */ while (send_len - len) { - len += rt_device_write(&serial->parent, 0, uart_write_buffer + len, send_len - len); - result = rt_sem_take(tx_sem, RT_WAITING_FOREVER); + len += rt_device_write(&serial->parent, 0, uart_write_buffer + len, send_len - len); + result = rt_sem_take(tx_sem, RT_WAITING_FOREVER); if (result != RT_EOK) { LOG_E("take sem err in send."); } } rt_free(uart_write_buffer); - } static void uart_rec_entry(void *parameter) @@ -90,9 +89,9 @@ static void uart_rec_entry(void *parameter) rev_len = *(rt_uint16_t *)parameter; rt_uint8_t *ch; ch = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1)); - rt_int32_t cnt, i; - rt_uint8_t last_old_data; - rt_bool_t fisrt_flag = RT_TRUE; + rt_int32_t cnt, i; + rt_uint8_t last_old_data; + rt_bool_t fisrt_flag = RT_TRUE; rt_uint32_t all_receive_length = 0; while (1) @@ -143,8 +142,8 @@ static rt_err_t uart_api(rt_uint16_t test_buf) { rt_thread_t thread_send = RT_NULL; rt_thread_t thread_recv = RT_NULL; - rt_err_t result = RT_EOK; - uart_over_flag = RT_FALSE; + rt_err_t result = RT_EOK; + uart_over_flag = RT_FALSE; result = uart_find(); if (result != RT_EOK) @@ -162,9 +161,9 @@ static rt_err_t uart_api(rt_uint16_t test_buf) /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; - config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = BSP_UART2_TX_BUFSIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING); @@ -213,29 +212,56 @@ static rt_err_t uart_api(rt_uint16_t test_buf) rt_thread_mdelay(5); } __exit: + rt_thread_mdelay(10); if (tx_sem) rt_sem_delete(tx_sem); rt_device_close(&serial->parent); + uart_over_flag = RT_FALSE; return result; } static void tc_uart_api(void) { rt_uint32_t times = 0; - rt_uint16_t num = 0; + rt_uint16_t num = 0; + rt_uint32_t i = 0; + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + while (TC_UART_SEND_TIMES - times) { num = (rand() % 1000) + 1; - if(uart_api(num) == RT_EOK) - LOG_I("data_lens [%3d], it is correct to read and write data. [%d] times testing.", num, ++times); + if (uart_api(num) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", num, ++times); else { LOG_E("uart test error"); break; } } - uassert_true(uart_over_flag == RT_TRUE); + +__exit: + uassert_true(uart_result == RT_TRUE); } static rt_err_t utest_tc_init(void) @@ -246,10 +272,11 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - tx_sem = RT_NULL; - uart_result = RT_TRUE; + tx_sem = RT_NULL; + uart_result = RT_TRUE; uart_over_flag = RT_FALSE; - + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c index c1c88ddc9ff..dd8c59e9af6 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2019, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -13,26 +13,26 @@ #include #include +#define DBG_LVL DBG_LOG + #define TC_UART_DEVICE_NAME "uart2" -#define TC_UART_SEND_TIMES 100 +#define TC_UART_SEND_TIMES 100 #ifdef UTEST_SERIAL_TC -#define TEST_UART_NAME TC_UART_DEVICE_NAME - static struct rt_serial_device *serial; -static rt_sem_t rx_sem; -static rt_uint8_t uart_over_flag; -static rt_bool_t uart_result = RT_TRUE; +static rt_sem_t rx_sem; +static rt_uint8_t uart_over_flag; +static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TEST_UART_NAME); + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TEST_UART_NAME); + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); return -RT_ERROR; } @@ -52,7 +52,7 @@ static void uart_send_entry(void *parameter) rt_uint16_t send_len; rt_uint32_t i = 0; - send_len = *(rt_uint16_t *)parameter; + send_len = *(rt_uint16_t *)parameter; /* assign send buffer */ uart_write_buffer = (rt_uint8_t *)rt_malloc(send_len); @@ -85,9 +85,9 @@ static void uart_rec_entry(void *parameter) rev_len = *(rt_uint16_t *)parameter; rt_uint8_t *ch; ch = (rt_uint8_t *)rt_calloc(1, sizeof(rt_uint8_t) * (rev_len + 1)); - rt_int32_t cnt, i; - rt_uint8_t last_old_data; - rt_bool_t fisrt_flag = RT_TRUE; + rt_int32_t cnt, i; + rt_uint8_t last_old_data; + rt_bool_t fisrt_flag = RT_TRUE; rt_uint32_t all_receive_length = 0; while (1) @@ -146,7 +146,7 @@ static rt_err_t uart_api(rt_uint16_t test_buf) { rt_thread_t thread_send = RT_NULL; rt_thread_t thread_recv = RT_NULL; - rt_err_t result = RT_EOK; + rt_err_t result = RT_EOK; result = uart_find(); if (result != RT_EOK) @@ -164,9 +164,9 @@ static rt_err_t uart_api(rt_uint16_t test_buf) /* reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; - config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = BSP_UART2_TX_BUFSIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -216,6 +216,7 @@ static rt_err_t uart_api(rt_uint16_t test_buf) rt_thread_mdelay(5); } __exit: + rt_thread_mdelay(10); if (rx_sem) rt_sem_delete(rx_sem); rt_device_close(&serial->parent); @@ -226,18 +227,43 @@ static rt_err_t uart_api(rt_uint16_t test_buf) static void tc_uart_api(void) { rt_uint32_t times = 0; - rt_uint16_t num = 0; + rt_uint16_t num = 0; + rt_uint32_t i = 0; + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + while (TC_UART_SEND_TIMES - times) { num = (rand() % 1000) + 1; - if(uart_api(num) == RT_EOK) - LOG_I("data_lens [%3d], it is correct to read and write data. [%d] times testing.", num, ++times); + if (uart_api(num) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", num, ++times); else { LOG_E("uart test error"); break; } } + +__exit: uassert_true(uart_result == RT_TRUE); } @@ -249,10 +275,11 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rx_sem = RT_NULL; - uart_result = RT_TRUE; - uart_over_flag = RT_FALSE; - + rx_sem = RT_NULL; + uart_result = RT_TRUE; + uart_over_flag = RT_FALSE; + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c index ad8d20b8cff..11bdc7e0834 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2019, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -13,14 +13,14 @@ #include #include +#define DBG_LVL DBG_LOG + #define TC_UART_DEVICE_NAME "uart2" #define TC_UART_SEND_TIMES 100 #ifdef UTEST_SERIAL_TC -#define TEST_UART_NAME TC_UART_DEVICE_NAME - static struct rt_serial_device *serial; static rt_sem_t tx_sem; static rt_sem_t rx_sem; @@ -29,11 +29,11 @@ static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TEST_UART_NAME); + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TEST_UART_NAME); + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); return -RT_ERROR; } @@ -241,6 +241,7 @@ static rt_err_t uart_api(rt_uint16_t test_buf) rt_thread_mdelay(5); } __exit: + rt_thread_mdelay(10); if (tx_sem) rt_sem_delete(tx_sem); @@ -248,25 +249,51 @@ static rt_err_t uart_api(rt_uint16_t test_buf) rt_sem_delete(rx_sem); rt_device_close(&serial->parent); + uart_over_flag = RT_FALSE; return result; } static void tc_uart_api(void) { rt_uint32_t times = 0; - rt_uint16_t num = 0; + rt_uint16_t num = 0; + rt_uint32_t i = 0; + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + + for (i = 1; i < 10; i++) + { + if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + else + { + LOG_E("uart test error"); + goto __exit; + } + } + while (TC_UART_SEND_TIMES - times) { num = (rand() % 1000) + 1; - if(uart_api(num) == RT_EOK) - LOG_I("data_lens [%3d], it is correct to read and write data. [%d] times testing.", num, ++times); + if (uart_api(num) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", num, ++times); else { LOG_E("uart test error"); break; } } - uassert_true(uart_over_flag == RT_TRUE); + +__exit: + uassert_true(uart_result == RT_TRUE); } static rt_err_t utest_tc_init(void) @@ -280,7 +307,8 @@ static rt_err_t utest_tc_cleanup(void) tx_sem = RT_NULL; uart_result = RT_TRUE; uart_over_flag = RT_FALSE; - + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c new file mode 100644 index 00000000000..57386566589 --- /dev/null +++ b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2006-2024 RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * + */ + +#include +#include "utest.h" +#include +#include + +/* #define DBG_LVL DBG_LOG*/ + +#define TC_UART_DEVICE_NAME "uart2" + +#ifdef UTEST_SERIAL_TC + +static struct rt_serial_device *serial; +static rt_bool_t uart_result = RT_TRUE; +static rt_uint8_t uart_write_flag = RT_TRUE; +static rt_uint8_t uart_over_flag = RT_FALSE; + + +static rt_err_t uart_find(void) +{ + serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + + if (serial == RT_NULL) + { + LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + return -RT_ERROR; + } + + return RT_EOK; +} + + +static void uart_send_entry(void *parameter) +{ + rt_uint8_t *uart_write_buffer = RT_NULL; + rt_uint32_t i = 0; + + /* assign send buffer */ + uart_write_buffer = (rt_uint8_t *)rt_malloc(BSP_UART2_RX_BUFSIZE); + if (uart_write_buffer == RT_NULL) + { + LOG_E("Without spare memory for uart dma!"); + uart_result = RT_FALSE; + return; + } + + for (i = 0; i < BSP_UART2_RX_BUFSIZE; i++) + { + uart_write_buffer[i] = (rt_uint8_t)i; + } + + while (1) + { + if (uart_write_flag == RT_FALSE) + break; + + rt_device_write(&serial->parent, 0, uart_write_buffer, BSP_UART2_RX_BUFSIZE / 3); + rt_thread_mdelay(40); + } + + rt_free(uart_write_buffer); +} + +static void uart_rec_entry(void *parameter) +{ + rt_uint8_t *ch; + rt_uint32_t old_tick; + rt_uint32_t i; + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_RX_BUFSIZE * 10 + 1)); + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_TIMEOUT, (void *)100); + + uart_write_flag = RT_TRUE; + for (i = 0; i < 10; i++) + { + rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); + old_tick = rt_tick_get(); + uint32_t recv_len = rt_device_read(&serial->parent, 0, (void *)ch, BSP_UART2_RX_BUFSIZE); + if (rt_tick_get() - old_tick > 100 + 2 || rt_tick_get() - old_tick < 100 - 2) + { + rt_kprintf("%d recv_len: %d\r\n", rt_tick_get() - old_tick, recv_len); + uart_write_flag = RT_FALSE; + uart_result = RT_FALSE; + rt_free(ch); + return; + } + } + uart_write_flag = RT_FALSE; + + rt_thread_mdelay(60); + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_TIMEOUT, (void *)10); + for (i = 0; i < 10; i++) + { + old_tick = rt_tick_get(); + rt_device_write(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE * 10); + if (rt_tick_get() - old_tick > 10 + 2 || rt_tick_get() - old_tick < 10 - 2) + { + uart_result = RT_FALSE; + rt_free(ch); + return; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + } + + rt_free(ch); + uart_over_flag = RT_TRUE; +} + +static rt_bool_t uart_api() +{ + rt_thread_t thread_send = RT_NULL; + rt_thread_t thread_recv = RT_NULL; + rt_err_t result = RT_EOK; + + result = uart_find(); + if (result != RT_EOK) + { + return RT_FALSE; + } + + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = 64; + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); + + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + if (result != RT_EOK) + { + LOG_E("Open uart device failed."); + return RT_FALSE; + } + + thread_send = rt_thread_create("uart_send", uart_send_entry, NULL, 2048, RT_THREAD_PRIORITY_MAX - 4, 10); + thread_recv = rt_thread_create("uart_recv", uart_rec_entry, NULL, 2048, RT_THREAD_PRIORITY_MAX - 5, 10); + + if ((thread_send != RT_NULL) && (thread_recv != RT_NULL)) + { + rt_thread_startup(thread_send); + rt_thread_startup(thread_recv); + } + else + { + result = -RT_ERROR; + goto __exit; + } + + while (1) + { + if (uart_result != RT_TRUE) + { + LOG_E("The test for uart dma is failure."); + result = -RT_ERROR; + goto __exit; + } + if (uart_over_flag == RT_TRUE) + { + goto __exit; + } + /* waiting for test over */ + rt_thread_mdelay(5); + } + +__exit: + rt_device_close(&serial->parent); + return result == RT_EOK ? RT_TRUE : RT_FALSE; +} + +static void tc_uart_api(void) +{ + uassert_true(uart_api() == RT_TRUE); +} + +static rt_err_t utest_tc_init(void) +{ + return RT_EOK; +} + +static rt_err_t utest_tc_cleanup(void) +{ + uart_result = RT_TRUE; + uart_write_flag = RT_TRUE; + uart_over_flag = RT_FALSE; + rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + while (rt_device_close(uart_dev) != -RT_ERROR); + return RT_EOK; +} + +static void testcase(void) +{ + UTEST_UNIT_RUN(tc_uart_api); +} + +UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_timeout_rxb_txb", utest_tc_init, utest_tc_cleanup, 30); + +#endif /* TC_UART_USING_TC */ From 915ce0550052558928bd8ae8879784bccef4d446 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 4 Sep 2024 11:04:14 +0800 Subject: [PATCH 02/17] format code --- components/drivers/include/drivers/serial_v2.h | 2 +- components/drivers/serial/serial_v2.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/drivers/include/drivers/serial_v2.h b/components/drivers/include/drivers/serial_v2.h index 1d00d08c914..bce8fa8454d 100644 --- a/components/drivers/include/drivers/serial_v2.h +++ b/components/drivers/include/drivers/serial_v2.h @@ -135,7 +135,7 @@ struct serial_configure * Serial Receive FIFO mode */ struct rt_serial_rx_fifo -{ +{ struct rt_ringbuffer rb; struct rt_completion rx_cpt; diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c index 19aca9636eb..f17e2a849ab 100644 --- a/components/drivers/serial/serial_v2.c +++ b/components/drivers/serial/serial_v2.c @@ -585,7 +585,7 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev, rt_int32_t tx_timeout = tx_fifo->tx_timeout; rt_tick_t now_tick = 0; rt_tick_t begin_tick = rt_tick_get(); - + while (send_size != size) { /* Copy one piece of data into the ringbuffer at a time From 37140fec22077795d4b8b4bae435611003b7b309 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 4 Sep 2024 19:59:48 +0800 Subject: [PATCH 03/17] =?UTF-8?q?[components][serial=5Fv2]=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96txflush=E9=80=BB=E8=BE=91=E3=80=81=E5=AF=B9tx=E7=9A=84?= =?UTF-8?q?activated=E5=81=9A=E4=B8=AD=E6=96=AD=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/serial/serial_v2.c | 55 ++++++++++++++------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c index f17e2a849ab..acb32b6264f 100644 --- a/components/drivers/serial/serial_v2.c +++ b/components/drivers/serial/serial_v2.c @@ -188,7 +188,7 @@ static int serial_fops_poll(struct dfs_file *fd, struct rt_pollreq *req) mask |= POLLIN; rt_hw_interrupt_enable(level); } - // mask|=POLLOUT; + /* mask|=POLLOUT; */ return mask; } @@ -500,6 +500,7 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev, { struct rt_serial_device *serial; struct rt_serial_tx_fifo *tx_fifo; + rt_base_t level; rt_ssize_t send_size; rt_err_t ret; @@ -518,12 +519,16 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev, /* When serial transmit in tx_blocking mode, * if the activated mode is RT_TRUE, it will return directly */ + level = rt_hw_interrupt_disable(); if (tx_fifo->activated == RT_TRUE) { + rt_hw_interrupt_enable(level); return 0; } tx_fifo->activated = RT_TRUE; + rt_hw_interrupt_enable(level); + /* clear tx_cpt flag */ rt_completion_wait(&tx_fifo->tx_cpt, 0); @@ -542,7 +547,10 @@ static rt_ssize_t _serial_fifo_tx_blocking_nbuf(struct rt_device *dev, } /* Inactive tx mode flag */ + level = rt_hw_interrupt_disable(); tx_fifo->activated = RT_FALSE; + rt_hw_interrupt_enable(level); + return send_size; } @@ -579,8 +587,15 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev, } /* When serial transmit in tx_blocking mode, * if the activated mode is RT_TRUE, it will return directly */ - if (tx_fifo->activated == RT_TRUE) return 0; + level = rt_hw_interrupt_disable(); + if (tx_fifo->activated == RT_TRUE) + { + rt_hw_interrupt_enable(level); + return 0; + } tx_fifo->activated = RT_TRUE; + rt_hw_interrupt_enable(level); + rt_int32_t tx_timeout = tx_fifo->tx_timeout; rt_tick_t now_tick = 0; @@ -625,8 +640,11 @@ static rt_ssize_t _serial_fifo_tx_blocking_buf(struct rt_device *dev, } } } + /* Finally Inactivate the tx->fifo */ + level = rt_hw_interrupt_disable(); tx_fifo->activated = RT_FALSE; + rt_hw_interrupt_enable(level); return send_size; } @@ -809,6 +827,7 @@ static rt_err_t rt_serial_tx_enable(struct rt_device *dev, dev->write = _serial_fifo_tx_nonblocking; #endif + rt_completion_init(&tx_fifo->tx_cpt); dev->open_flag |= RT_SERIAL_TX_NON_BLOCKING; /* Call the control() API to configure the serial device by RT_SERIAL_TX_NON_BLOCKING*/ @@ -1296,26 +1315,15 @@ static rt_err_t rt_serial_control(struct rt_device *dev, { struct rt_serial_tx_fifo* tx_fifo; rt_base_t level; - tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx; - if(serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) + level = rt_hw_interrupt_disable(); + if(tx_fifo->activated != RT_FALSE) { - level = rt_hw_interrupt_disable(); - if(tx_fifo->activated != RT_FALSE) - { - rt_hw_interrupt_enable(level); - rt_completion_wait(&tx_fifo->tx_cpt, RT_WAITING_FOREVER); - break; - } rt_hw_interrupt_enable(level); + rt_completion_wait(&tx_fifo->tx_cpt, RT_WAITING_FOREVER); + break; } - else - { - while(tx_fifo->activated == RT_TRUE) - { - // rt_thread_mdelay(1); - } - } + rt_hw_interrupt_enable(level); } break; @@ -1746,11 +1754,7 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) * then the transmit completion callback is triggered*/ if (tx_length == 0) { - /* Maybe some datas left in the buffer still need to be sent in block mode */ - if (serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) - { - rt_completion_done(&tx_fifo->tx_cpt); - } + rt_completion_done(&tx_fifo->tx_cpt); /* Trigger the transmit completion callback */ if (serial->parent.tx_complete != RT_NULL) @@ -1790,10 +1794,7 @@ void rt_hw_serial_isr(struct rt_serial_device *serial, int event) if (tx_length == 0) { - if (serial->parent.open_flag & RT_SERIAL_TX_BLOCKING) - { - rt_completion_done(&tx_fifo->tx_cpt); - } + rt_completion_done(&tx_fifo->tx_cpt); /* Trigger the transmit completion callback */ if (serial->parent.tx_complete != RT_NULL) From bef1507443a1731f063a3e7654df4385e27ee50a Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Tue, 10 Sep 2024 11:50:49 +0800 Subject: [PATCH 04/17] =?UTF-8?q?[components][at]=20at=5Fclient=E9=80=82?= =?UTF-8?q?=E9=85=8D=E6=96=B0=E7=89=88serial=5Fv2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/net/at/include/at.h | 9 +++++-- components/net/at/src/at_client.c | 45 ++++++++++++++++++++++++------- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/components/net/at/include/at.h b/components/net/at/include/at.h index 2d9e7e51db3..fbd462c1821 100644 --- a/components/net/at/include/at.h +++ b/components/net/at/include/at.h @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team +/* * Copyright (c) 2006-2024 RT-Thread Development Team + * * SPDX-License-Identifier: Apache-2.0 * @@ -14,6 +14,7 @@ #include #include +#include #ifdef __cplusplus extern "C" { @@ -164,7 +165,11 @@ struct at_client rt_size_t recv_line_len; /* The maximum supported receive data length */ rt_size_t recv_bufsz; + +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) rt_sem_t rx_notice; +#endif + rt_mutex_t lock; at_response_t resp; diff --git a/components/net/at/src/at_client.c b/components/net/at/src/at_client.c index 5d665fee661..0d4333461a1 100644 --- a/components/net/at/src/at_client.c +++ b/components/net/at/src/at_client.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2023, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -444,6 +444,7 @@ static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeo { rt_err_t result = RT_EOK; +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) while (rt_device_read(client->device, 0, ch, 1) == 0) { result = rt_sem_take(client->rx_notice, rt_tick_from_millisecond(timeout)); @@ -454,6 +455,15 @@ static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeo rt_sem_control(client->rx_notice, RT_IPC_CMD_RESET, RT_NULL); } +#else + rt_device_control(client->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)rt_tick_from_millisecond(timeout)); + result = rt_device_read(client->device, 0, ch, 1); + if(result <= 0) + { + result = RT_ERROR; + } + rt_device_control(client->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)RT_WAITING_FOREVER); +#endif return RT_EOK; } @@ -473,7 +483,7 @@ static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeo */ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_int32_t timeout) { - rt_size_t len = 0; + rt_size_t read_idx = 0; RT_ASSERT(buf); @@ -483,16 +493,17 @@ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_i return 0; } +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) while (size) { rt_size_t read_len; rt_sem_control(client->rx_notice, RT_IPC_CMD_RESET, RT_NULL); - read_len = rt_device_read(client->device, 0, buf + len, size); + read_len = rt_device_read(client->device, 0, buf + read_idx, size); if (read_len > 0) { - len += read_len; + read_idx += read_len; size -= read_len; } else @@ -501,12 +512,17 @@ rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_i break; } } +#else + rt_device_control(client->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)rt_tick_from_millisecond(timeout)); + read_idx = rt_device_read(client->device, 0, buf, size); + rt_device_control(client->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)RT_WAITING_FOREVER); +#endif #ifdef AT_PRINT_RAW_CMD - at_print_raw_cmd("urc_recv", buf, len); + at_print_raw_cmd("urc_recv", buf, read_idx); #endif - return len; + return read_idx; } /** @@ -774,12 +790,13 @@ static void client_parser(at_client_t client) } else { -// log_d("unrecognized line: %.*s", client->recv_line_len, client->recv_line_buf); +/* log_d("unrecognized line: %.*s", client->recv_line_len, client->recv_line_buf);*/ } } } } +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) static rt_err_t at_client_rx_ind(rt_device_t dev, rt_size_t size) { int idx = 0; @@ -794,6 +811,7 @@ static rt_err_t at_client_rx_ind(rt_device_t dev, rt_size_t size) return RT_EOK; } +#endif /* initialize the client object parameters */ static int at_client_para_init(at_client_t client) @@ -836,6 +854,7 @@ static int at_client_para_init(at_client_t client) goto __exit; } +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) rt_snprintf(name, RT_NAME_MAX, "%s%d", AT_CLIENT_SEM_NAME, at_client_num); client->rx_notice = rt_sem_create(name, 0, RT_IPC_FLAG_FIFO); if (client->rx_notice == RT_NULL) @@ -844,6 +863,7 @@ static int at_client_para_init(at_client_t client) result = -RT_ENOMEM; goto __exit; } +#endif rt_snprintf(name, RT_NAME_MAX, "%s%d", AT_CLIENT_RESP_NAME, at_client_num); client->resp_notice = rt_sem_create(name, 0, RT_IPC_FLAG_FIFO); @@ -862,7 +882,8 @@ static int at_client_para_init(at_client_t client) (void (*)(void *parameter))client_parser, client, 1024 + 512, - RT_THREAD_PRIORITY_MAX / 3 - 1, + /* RT_THREAD_PRIORITY_MAX / 3 - 1,*/ + 8, 5); if (client->parser == RT_NULL) { @@ -877,10 +898,12 @@ static int at_client_para_init(at_client_t client) rt_mutex_delete(client->lock); } +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) if (client->rx_notice) { rt_sem_delete(client->rx_notice); } +#endif if (client->resp_notice) { @@ -958,7 +981,7 @@ int at_client_init(const char *dev_name, rt_size_t recv_bufsz, rt_size_t send_bu if (client->device) { RT_ASSERT(client->device->type == RT_Device_Class_Char); - +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) rt_device_set_rx_indicate(client->device, at_client_rx_ind); /* using DMA mode first */ open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); @@ -968,6 +991,10 @@ int at_client_init(const char *dev_name, rt_size_t recv_bufsz, rt_size_t send_bu open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); } RT_ASSERT(open_result == RT_EOK); +#else + open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + RT_ASSERT(open_result == RT_EOK); +#endif } else { From 29a7414119d509c0397d0ff22c61d7751e01eec8 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Tue, 10 Sep 2024 11:51:38 +0800 Subject: [PATCH 05/17] =?UTF-8?q?[components][at]=20at=5Fserver=E9=80=82?= =?UTF-8?q?=E9=85=8D=E6=96=B0=E7=89=88serial=5Fv2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/net/at/include/at.h | 3 ++ components/net/at/src/at_server.c | 57 +++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/components/net/at/include/at.h b/components/net/at/include/at.h index fbd462c1821..608d743cc1f 100644 --- a/components/net/at/include/at.h +++ b/components/net/at/include/at.h @@ -90,7 +90,10 @@ struct at_server char send_buffer[AT_SERVER_SEND_BUFF_LEN]; char recv_buffer[AT_SERVER_RECV_BUFF_LEN]; rt_size_t cur_recv_len; + +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) rt_sem_t rx_notice; +#endif rt_thread_t parser; void (*parser_entry)(struct at_server *server); diff --git a/components/net/at/src/at_server.c b/components/net/at/src/at_server.c index de67001e170..9c8d138ae71 100644 --- a/components/net/at/src/at_server.c +++ b/components/net/at/src/at_server.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -222,25 +222,30 @@ rt_size_t at_server_recv(at_server_t server, char *buf, rt_size_t size, rt_int32 return 0; } - while (1) +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) + while (size) { - if (read_idx < size) - { - /* check get data value */ - result = server->get_char(server, &ch, timeout); - if (result != RT_EOK) - { - LOG_E("AT Server receive failed, uart device get data error."); - return 0; - } + rt_size_t read_len; + + rt_sem_control(server->rx_notice, RT_IPC_CMD_RESET, RT_NULL); - buf[read_idx++] = ch; + read_len = rt_device_read(server->device, 0, buf + read_idx, size); + if (read_len > 0) + { + read_idx += read_len; + size -= read_len; } else { - break; + if (rt_sem_take(server->rx_notice, rt_tick_from_millisecond(timeout)) != RT_EOK) + break; } } +#else + rt_device_control(server->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)rt_tick_from_millisecond(timeout)); + read_idx = rt_device_read(server->device, 0, buf, size); + rt_device_control(server->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)RT_WAITING_FOREVER); +#endif return read_idx; } @@ -410,15 +415,25 @@ static rt_err_t at_server_getchar(at_server_t server, char *ch, rt_int32_t timeo { rt_err_t result = RT_EOK; +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) while (rt_device_read(at_server_local->device, 0, ch, 1) == 0) { - rt_sem_control(at_server_local->rx_notice, RT_IPC_CMD_RESET, RT_NULL); result = rt_sem_take(at_server_local->rx_notice, rt_tick_from_millisecond(timeout)); if (result != RT_EOK) { return result; } + rt_sem_control(at_server_local->rx_notice, RT_IPC_CMD_RESET, RT_NULL); } +#else + rt_device_control(server->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)rt_tick_from_millisecond(timeout)); + result = rt_device_read(server->device, 0, ch, 1); + if(result <= 0) + { + result = RT_ERROR; + } + rt_device_control(server->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)RT_WAITING_FOREVER); +#endif return result; } @@ -496,6 +511,7 @@ static void server_parser(at_server_t server) } } +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) static rt_err_t at_rx_ind(rt_device_t dev, rt_size_t size) { if (size > 0) @@ -505,6 +521,7 @@ static rt_err_t at_rx_ind(rt_device_t dev, rt_size_t size) return RT_EOK; } +#endif #if defined(__ICCARM__) || defined(__ICCRX__) /* for IAR compiler */ #pragma section="RtAtCmdTab" @@ -550,6 +567,7 @@ int at_server_init(void) rt_memset(at_server_local->recv_buffer, 0x00, AT_SERVER_RECV_BUFF_LEN); at_server_local->cur_recv_len = 0; +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) at_server_local->rx_notice = rt_sem_create("at_svr", 0, RT_IPC_FLAG_FIFO); if (!at_server_local->rx_notice) { @@ -557,13 +575,14 @@ int at_server_init(void) result = -RT_ENOMEM; goto __exit; } +#endif /* Find and open command device */ at_server_local->device = rt_device_find(AT_SERVER_DEVICE); if (at_server_local->device) { RT_ASSERT(at_server_local->device->type == RT_Device_Class_Char); - +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) rt_device_set_rx_indicate(at_server_local->device, at_rx_ind); /* using DMA mode first */ open_result = rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); @@ -573,6 +592,10 @@ int at_server_init(void) open_result = rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); } RT_ASSERT(open_result == RT_EOK); +#else + open_result = rt_device_open(at_server_local->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + RT_ASSERT(open_result == RT_EOK); +#endif } else { @@ -608,10 +631,14 @@ int at_server_init(void) { if (at_server_local) { + +#if (!defined(RT_USING_SERIAL_V2) || RT_VER_NUM < 0x50200) if (at_server_local->rx_notice) { rt_sem_delete(at_server_local->rx_notice); } +#endif + if (at_server_local->device) { rt_device_close(at_server_local->device); From 0d92bda61775f648287edfd5f76679a1a253aa40 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Tue, 10 Sep 2024 12:09:18 +0800 Subject: [PATCH 06/17] =?UTF-8?q?[components][serial=5Fv2]=20=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E5=A2=9E=E5=8A=A0=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E8=B0=83=E7=94=A8=EF=BC=8Cformat=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drivers/serial_v2/uart_flush_rx.c | 77 +++++------ .../drivers/serial_v2/uart_flush_txb.c | 48 +++++-- .../drivers/serial_v2/uart_flush_txnb.c | 49 +++++-- .../drivers/serial_v2/uart_get_rx_data_len.c | 121 ++++++++---------- 4 files changed, 155 insertions(+), 140 deletions(-) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c index 50e886f5def..c2201d6f825 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c @@ -19,6 +19,8 @@ #ifdef UTEST_SERIAL_TC +#define TC_UART_SEND_TIMES 100 + static struct rt_serial_device *serial; static rt_err_t uart_find(void) @@ -34,6 +36,23 @@ static rt_err_t uart_find(void) return RT_EOK; } +static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t size) +{ + rt_device_write(&serial->parent, 0, ch, size); + rt_thread_mdelay(1); + if (1 != rt_device_read(&serial->parent, 0, ch, 1)) + { + return -RT_ERROR; + } + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); + if (0 != rt_device_read(&serial->parent, 0, ch, 1)) + { + return -RT_ERROR; + } + + return RT_EOK; +} static rt_bool_t uart_api() { @@ -60,52 +79,22 @@ static rt_bool_t uart_api() } rt_uint8_t *ch; - ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_TX_BUFSIZE * 2 + 1)); - - rt_device_write(&serial->parent, 0, ch, BSP_UART2_TX_BUFSIZE / 2); - rt_thread_mdelay(100); - if (1 != rt_device_read(&serial->parent, 0, ch, 1)) - { - result = -RT_ERROR; - goto __exit; - } - - rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); - if (0 != rt_device_read(&serial->parent, 0, ch, 1)) - { - result = -RT_ERROR; - goto __exit; - } - - rt_device_write(&serial->parent, 0, ch, BSP_UART2_TX_BUFSIZE); - rt_thread_mdelay(100); - if (1 != rt_device_read(&serial->parent, 0, ch, 1)) - { - result = -RT_ERROR; - goto __exit; - } - - rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); - if (0 != rt_device_read(&serial->parent, 0, ch, 1)) - { - result = -RT_ERROR; - goto __exit; - } - - - rt_device_write(&serial->parent, 0, ch, BSP_UART2_TX_BUFSIZE * 2); - rt_thread_mdelay(100); - if (1 != rt_device_read(&serial->parent, 0, ch, 1)) - { - result = -RT_ERROR; - goto __exit; - } + rt_uint32_t i; + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_TX_BUFSIZE * 5 + 1)); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); - if (0 != rt_device_read(&serial->parent, 0, ch, 1)) + for (i = 0; i < TC_UART_SEND_TIMES; i++) { - result = -RT_ERROR; - goto __exit; + if (RT_EOK != test_item(ch, BSP_UART2_RX_BUFSIZE + BSP_UART2_RX_BUFSIZE * (rand() % 5))) + { + result = -RT_ERROR; + goto __exit; + } + + if (RT_EOK != test_item(ch, rand() % (BSP_UART2_RX_BUFSIZE * 5))) + { + result = -RT_ERROR; + goto __exit; + } } __exit: diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c index 325cc0a793d..bb5c9f6e6dd 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c @@ -19,6 +19,8 @@ #ifdef UTEST_SERIAL_TC +#define TC_UART_SEND_TIMES 100 + static struct rt_serial_device *serial; static rt_err_t uart_find(void) @@ -61,29 +63,51 @@ static rt_bool_t uart_api() rt_uint8_t *ch; rt_uint32_t old_tick; + rt_uint32_t i; ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (256 * 5 + 10)); rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_TIMEOUT, (void *)1); - rt_device_write(&serial->parent, 0, ch, 256 * 5); - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + for (i = 0; i < TC_UART_SEND_TIMES; i++) { - result = -RT_ERROR; - goto __exit; + rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5)); + + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } } - rt_device_write(&serial->parent, 0, ch, 256 * 5 + 1); - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + for (i = 0; i < TC_UART_SEND_TIMES; i++) { - result = -RT_ERROR; - goto __exit; + rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5) + 1); + + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } } + for (i = 0; i < TC_UART_SEND_TIMES; i++) + { + rt_device_write(&serial->parent, 0, ch, 256 + rand() % (256 * 4)); + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } + } + + __exit: rt_free(ch); rt_device_close(&serial->parent); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c index 18950a9aad2..e200bf2071d 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c @@ -19,6 +19,8 @@ #ifdef UTEST_SERIAL_TC +#define TC_UART_SEND_TIMES 100 + static struct rt_serial_device *serial; static rt_err_t uart_find(void) @@ -61,28 +63,49 @@ static rt_bool_t uart_api() rt_uint8_t *ch; rt_uint32_t old_tick; + rt_uint32_t i; ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (256 * 5 + 10)); - rt_device_write(&serial->parent, 0, ch, 256 * 5); - - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + for (i = 0; i < TC_UART_SEND_TIMES; i++) { - result = -RT_ERROR; - goto __exit; + rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5)); + + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } } - rt_device_write(&serial->parent, 0, ch, 256 * 5 + 1); - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + for (i = 0; i < TC_UART_SEND_TIMES; i++) + { + rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5) + 1); + + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } + } + + for (i = 0; i < TC_UART_SEND_TIMES; i++) { - result = -RT_ERROR; - goto __exit; + rt_device_write(&serial->parent, 0, ch, 256 + rand() % (256 * 4)); + old_tick = rt_tick_get(); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + if (rt_tick_get() - old_tick < 2) + { + result = -RT_ERROR; + goto __exit; + } } + __exit: rt_free(ch); rt_device_close(&serial->parent); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c index 534cd589605..5528ba7d0af 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c @@ -19,6 +19,8 @@ #ifdef UTEST_SERIAL_TC +#define TC_UART_SEND_TIMES 100 + static struct rt_serial_device *serial; static rt_uint8_t uart_over_flag = RT_FALSE; @@ -34,109 +36,86 @@ static rt_err_t uart_find(void) return RT_EOK; } -static rt_bool_t uart_api() -{ - rt_err_t result = RT_EOK; - - result = uart_find(); - if (result != RT_EOK) - { - return RT_FALSE; - } - - /* Reinitialize */ - struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; - config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; - rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); - result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); - if (result != RT_EOK) - { - LOG_E("Open uart device failed."); - return RT_FALSE; - } - - rt_uint8_t *ch; +static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t size) +{ rt_uint32_t old_tick; rt_ssize_t send_len; rt_ssize_t buf_data_len; - ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_TX_BUFSIZE * 2 + 1)); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); - if (0 != buf_data_len) + send_len = rt_device_write(&serial->parent, 0, ch, size); + + if (size > BSP_UART2_RX_BUFSIZE) { - result = -RT_ERROR; - goto __exit; + size = BSP_UART2_RX_BUFSIZE; } - send_len = rt_device_write(&serial->parent, 0, ch, 30); - rt_thread_delay(100); + rt_thread_delay(5); rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); - if (30 != buf_data_len) + if (size != buf_data_len) { - result = -RT_ERROR; - goto __exit; + return -RT_ERROR; } - if (30 != rt_device_read(&serial->parent, 0, ch, 30)) + + if (size != rt_device_read(&serial->parent, 0, ch, size)) { - result = -RT_ERROR; - goto __exit; + return -RT_ERROR; } rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); if (0 != buf_data_len) { - result = -RT_ERROR; - goto __exit; + return -RT_ERROR; } - send_len = rt_device_write(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE * 2); - rt_thread_delay(100); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); - if (BSP_UART2_RX_BUFSIZE != buf_data_len) - { - result = -RT_ERROR; - goto __exit; - } + return RT_EOK; +} - if (BSP_UART2_RX_BUFSIZE != rt_device_read(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE)) - { - result = -RT_ERROR; - goto __exit; - } +static rt_bool_t uart_api() +{ + rt_err_t result = RT_EOK; - rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); - if (0 != buf_data_len) + result = uart_find(); + if (result != RT_EOK) { - result = -RT_ERROR; - goto __exit; + return RT_FALSE; } - send_len = rt_device_write(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE + 20); - rt_thread_delay(100); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); - if (BSP_UART2_RX_BUFSIZE != buf_data_len) - { - result = -RT_ERROR; - goto __exit; - } + /* Reinitialize */ + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); - if (BSP_UART2_RX_BUFSIZE != rt_device_read(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE)) + result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); + if (result != RT_EOK) { - result = -RT_ERROR; - goto __exit; + LOG_E("Open uart device failed."); + return RT_FALSE; } - rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); - if (0 != buf_data_len) + rt_uint8_t *ch; + rt_uint32_t i; + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_TX_BUFSIZE * 5 + 1)); + + for (i = 0; i < TC_UART_SEND_TIMES; i++) { - result = -RT_ERROR; - goto __exit; + if (RT_EOK != test_item(ch, BSP_UART2_RX_BUFSIZE + BSP_UART2_RX_BUFSIZE * (rand() % 5))) + { + result = -RT_ERROR; + goto __exit; + } + + if (RT_EOK != test_item(ch, rand() % (BSP_UART2_RX_BUFSIZE * 5))) + { + result = -RT_ERROR; + goto __exit; + } } + __exit: rt_free(ch); rt_device_close(&serial->parent); From db1a58e055549a6893cdaa32dcd8a024933c5faa Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Tue, 10 Sep 2024 16:38:26 +0800 Subject: [PATCH 07/17] =?UTF-8?q?[components][serial=5Fv2]=20poll=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/serial/serial_v2.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c index acb32b6264f..391c8c5eb91 100644 --- a/components/drivers/serial/serial_v2.c +++ b/components/drivers/serial/serial_v2.c @@ -1292,15 +1292,17 @@ static rt_err_t rt_serial_control(struct rt_device *dev, /* Discard all data */ case RT_SERIAL_CTRL_RX_FLUSH: - if(!(serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)) + if(serial->config.rx_bufsz == 0) { - struct rt_serial_rx_fifo* rx_fifo; - rt_base_t level; - rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; - while (serial->ops->getc(serial) != -1) { } + } + else + { + struct rt_serial_rx_fifo* rx_fifo; + rt_base_t level; + rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; level = rt_hw_interrupt_disable(); rx_fifo->rx_cpt_index = 0; @@ -1311,7 +1313,7 @@ static rt_err_t rt_serial_control(struct rt_device *dev, /* Blocking and wait for the send buffer data to be sent. */ case RT_SERIAL_CTRL_TX_FLUSH: - if(!(serial->parent.open_flag & RT_DEVICE_FLAG_STREAM)) + if(serial->config.tx_bufsz != 0) { struct rt_serial_tx_fifo* tx_fifo; rt_base_t level; @@ -1334,9 +1336,9 @@ static rt_err_t rt_serial_control(struct rt_device *dev, break; } - if(serial->parent.open_flag & RT_DEVICE_FLAG_STREAM) + if(serial->config.rx_bufsz == 0) { - LOG_W("RT_SERIAL_CTRL_RX_FLUSH not support stream mode."); + LOG_W("RT_SERIAL_CTRL_GET_RX_DATA_LEN not support poll mode."); *(rt_ssize_t*)args = -1; break; } From 849d3273fc26fe29846002b377dae3dfecf7bc10 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Tue, 10 Sep 2024 16:41:24 +0800 Subject: [PATCH 08/17] =?UTF-8?q?[components][serial=5Fv2]=20=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=94=A8=E4=BE=8B=E5=8E=BB=E6=8E=89=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E9=9D=9E=E5=BF=85=E8=A6=81=E5=BB=B6=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utest/testcases/drivers/serial_v2/uart_blocking_tx.c | 2 -- examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c | 2 -- .../utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c | 5 ----- .../utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c | 2 -- .../testcases/drivers/serial_v2/uart_overflow_rxb_txb.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c | 2 +- 10 files changed, 6 insertions(+), 17 deletions(-) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c b/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c index a7c650ebed0..e6629e23a6c 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c @@ -24,7 +24,6 @@ static rt_bool_t block_write(rt_device_t uart_dev) rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_BLOCKING); LOG_D("\nBLOCKING WRITE BEGIN\n"); - rt_thread_mdelay(2000); index = 0; wr_sz = 0; @@ -77,7 +76,6 @@ static rt_bool_t block_write(rt_device_t uart_dev) tick_array[index] = tick2 - tick1; write_num_array[index++] = wr_sz; - rt_thread_mdelay(1000); LOG_D("\nBLOCKING_TX END\n"); for(i = 0; i < index; i++) { diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c index c2201d6f825..21162685b2e 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c @@ -39,7 +39,7 @@ static rt_err_t uart_find(void) static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t size) { rt_device_write(&serial->parent, 0, ch, size); - rt_thread_mdelay(1); + rt_thread_mdelay(size / 11); if (1 != rt_device_read(&serial->parent, 0, ch, 1)) { return -RT_ERROR; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c index bb5c9f6e6dd..bf92a399b05 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c @@ -81,7 +81,6 @@ static rt_bool_t uart_api() } } - for (i = 0; i < TC_UART_SEND_TIMES; i++) { rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5) + 1); @@ -107,7 +106,6 @@ static rt_bool_t uart_api() } } - __exit: rt_free(ch); rt_device_close(&serial->parent); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c index 3dbdddb7c99..ba99f464673 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c @@ -24,7 +24,6 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 256); rt_device_write(uart_dev, 0, uart_read_buffer, 256); total_length += recv_length; - rt_thread_mdelay(1000); rt_sprintf(log_buffer, "\nnonblock : %d bytes read, total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); @@ -34,7 +33,6 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 256); rt_device_write(uart_dev, 0, uart_read_buffer, 256); total_length += recv_length; - rt_thread_mdelay(1000); rt_sprintf(log_buffer, "\nnonblock : %d bytes read , total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); @@ -44,7 +42,6 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 256); rt_device_write(uart_dev, 0, uart_read_buffer, 256); total_length += recv_length; - rt_thread_mdelay(1000); rt_sprintf(log_buffer, "\nnonblock : %d bytes read, total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); @@ -54,7 +51,6 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 128); rt_device_write(uart_dev, 0, uart_read_buffer, 128); total_length += recv_length; - rt_thread_mdelay(1000); rt_sprintf(log_buffer, "\nnonblock : %d bytes read , total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); @@ -64,7 +60,6 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) recv_length = rt_device_read(uart_dev, -1, uart_read_buffer, 128); rt_device_write(uart_dev, 0, uart_read_buffer, 128); total_length += recv_length; - rt_thread_mdelay(1000); rt_sprintf(log_buffer, "\nnonblock : %d bytes read , total: %d \n", recv_length, total_length); rt_device_write(uart_dev, 0, log_buffer, rt_strlen(log_buffer)); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c index 60fa8dda8e2..d63f52a04cc 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c @@ -24,7 +24,6 @@ static rt_bool_t nonblock_write(rt_device_t uart_dev) rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_NON_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING); LOG_D("\nNONBLOCKING WRITE BEGIN\n"); - rt_thread_mdelay(2000); index = 0; tmp = 0; @@ -86,7 +85,6 @@ static rt_bool_t nonblock_write(rt_device_t uart_dev) tick_array[index] = tick2 - tick1; write_num_array[index++] = wr_sz; - rt_thread_mdelay(1000); LOG_D("\nNONBLOCKING_TX END\n"); for (i = 0; i < index; i++) { diff --git a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c index 35d3f3d3c63..227399b16f3 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c @@ -139,7 +139,7 @@ static rt_err_t uart_api(rt_uint16_t length) if ((thread_send != RT_NULL) && (thread_recv != RT_NULL)) { rt_thread_startup(thread_send); - rt_thread_mdelay(length / 8 + 10); + rt_thread_mdelay(length / 11 + 10); rt_thread_startup(thread_recv); } else diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c index 615fd760b80..20b2b1997d9 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c @@ -184,7 +184,7 @@ static rt_err_t uart_api(rt_uint16_t length) } __exit: - rt_thread_mdelay(10); + rt_thread_mdelay(5); rt_device_close(&serial->parent); uart_over_flag = RT_FALSE; return result; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c index e92103b0300..d5f66d931bc 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c @@ -212,7 +212,7 @@ static rt_err_t uart_api(rt_uint16_t test_buf) rt_thread_mdelay(5); } __exit: - rt_thread_mdelay(10); + rt_thread_mdelay(5); if (tx_sem) rt_sem_delete(tx_sem); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c index dd8c59e9af6..d7e71e59186 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c @@ -216,7 +216,7 @@ static rt_err_t uart_api(rt_uint16_t test_buf) rt_thread_mdelay(5); } __exit: - rt_thread_mdelay(10); + rt_thread_mdelay(5); if (rx_sem) rt_sem_delete(rx_sem); rt_device_close(&serial->parent); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c index 11bdc7e0834..fed059877b7 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c @@ -241,7 +241,7 @@ static rt_err_t uart_api(rt_uint16_t test_buf) rt_thread_mdelay(5); } __exit: - rt_thread_mdelay(10); + rt_thread_mdelay(5); if (tx_sem) rt_sem_delete(tx_sem); From c6c9f80213cdafd198c0439ae82cee08b46a306f Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Tue, 10 Sep 2024 18:42:16 +0800 Subject: [PATCH 09/17] =?UTF-8?q?[components][serial=5Fv2]=20=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=BE=8B=E7=A8=8B=E4=BD=BF=E7=94=A8menuconfig?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=9B=B4=E6=96=B0?= =?UTF-8?q?readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../utest/testcases/drivers/serial_v2/Kconfig | 20 +++++++++++++ .../testcases/drivers/serial_v2/README.md | 12 ++++---- .../drivers/serial_v2/uart_blocking_rx.c | 5 ++-- .../drivers/serial_v2/uart_blocking_tx.c | 7 ++--- .../drivers/serial_v2/uart_flush_rx.c | 20 +++++-------- .../drivers/serial_v2/uart_flush_txb.c | 12 +++----- .../drivers/serial_v2/uart_flush_txnb.c | 12 +++----- .../drivers/serial_v2/uart_get_rx_data_len.c | 24 +++++++-------- .../drivers/serial_v2/uart_nonblocking_rx.c | 5 ++-- .../drivers/serial_v2/uart_nonblocking_tx.c | 9 +++--- .../drivers/serial_v2/uart_overflow_rxb_txb.c | 30 ++++++++----------- .../drivers/serial_v2/uart_rxb_txb.c | 22 ++++++-------- .../drivers/serial_v2/uart_rxb_txnb.c | 22 ++++++-------- .../drivers/serial_v2/uart_rxnb_txb.c | 22 ++++++-------- .../drivers/serial_v2/uart_rxnb_txnb.c | 22 ++++++-------- .../drivers/serial_v2/uart_timeout_rxb_txb.c | 24 +++++++-------- 16 files changed, 124 insertions(+), 144 deletions(-) diff --git a/examples/utest/testcases/drivers/serial_v2/Kconfig b/examples/utest/testcases/drivers/serial_v2/Kconfig index 3c8d480b3af..ddbcf7a9bf1 100644 --- a/examples/utest/testcases/drivers/serial_v2/Kconfig +++ b/examples/utest/testcases/drivers/serial_v2/Kconfig @@ -4,4 +4,24 @@ config UTEST_SERIAL_TC bool "Serial testcase" default n +if UTEST_SERIAL_TC + + config RT_SERIAL_TC_DEVICE_NAME + string "the device name for serial test" + default "uart2" + + config RT_SERIAL_TC_RXBUF_SIZE + int "the rx buffer size for serial test" + default 128 + + config RT_SERIAL_TC_TXBUF_SIZE + int "the tx buffer size for serial test" + default 128 + + config TC_UART_SEND_TIMES + int "the number of iterations for the test routine." + default 100 + +endif + endmenu diff --git a/examples/utest/testcases/drivers/serial_v2/README.md b/examples/utest/testcases/drivers/serial_v2/README.md index 664cf220343..ec50083d13b 100644 --- a/examples/utest/testcases/drivers/serial_v2/README.md +++ b/examples/utest/testcases/drivers/serial_v2/README.md @@ -85,20 +85,18 @@ ### 4.2 测试条件 -默认测试串口为`**uart2**`请根据需要修改宏定义 - **短接串口的发送TX引脚和接收RX引脚,完成自发自收的回路**。 大致的测试思路: >发送测试流程 : >>1. 先关闭串口,再以需要测试的模式打开. ->>2. 然后依次发送 UART_SEND_TIMES(默认为100) * (1000以内的随机数)个数据. +>>2. 然后依次发送 UART_SEND_TIMES * (1000以内的随机数)个数据. >>3. 打印记录的数据,通过LOG日志的时钟周期来反应发送效率, 通过成功发送的数据量来反应是否产生丢包问题. > >接收测试流程 : >>1. 先关闭串口,再以需要测试的模式打开. ->>2. 然后以此接收 同发送测试流程一致的(1000以内随机数)个数据 +>>2. 然后以此接收 同发送测试流程一致的 UART_SEND_TIMES *(1000以内随机数)个数据 >>3. 接收的同时记录成功接收的数据数量 >>4. 打印记录的数据, 通过现实成功接收的数据量与串口发送的数据量做对比,来验证是否出现丢包问题 @@ -110,7 +108,11 @@ RT-Thread Utestcases ---> [*] RT-Thread Utestcases ---> Utest Serial Testcase ---> - [*] Serial testcase + [*] Serial testcase ---> + the device name for serial test: uart2 (选择测试的串口) + (128)the rx buffer size for serial test (测试串口rx缓冲区大小) + (128)the tx buffer size for serial test (测试串口tx缓冲区大小) + (100)the number of iterations for the test routine. (测试例程的迭代次数) ``` ## 6、使用 diff --git a/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c index c1fdcfb3d24..b8b0351e76f 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_blocking_rx.c @@ -2,7 +2,6 @@ #include #include "utest.h" -#define TC_UART_DEVICE_NAME "uart2" #define DBG_LVL DBG_LOG #ifdef UTEST_SERIAL_TC @@ -64,7 +63,7 @@ static rt_bool_t block_read(rt_device_t uart_dev) static void uart_test_blocking_rx(void) { rt_device_t uart_dev; - uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); uassert_not_null(uart_dev); uassert_true(block_read(uart_dev)); @@ -77,7 +76,7 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c b/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c index e6629e23a6c..3ef774a8930 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_blocking_tx.c @@ -2,8 +2,7 @@ #include #include "utest.h" -#define TC_UART_DEVICE_NAME "uart2" -#define UART_SEND_TIMES 400 +#define UART_SEND_TIMES 100 #define UART_TEST_NUMBER 6 #define DBG_LVL DBG_LOG @@ -89,7 +88,7 @@ static rt_bool_t block_write(rt_device_t uart_dev) static void uart_test_blocking_tx(void) { rt_device_t uart_dev; - uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); uassert_not_null(uart_dev); uassert_true (block_write(uart_dev)); @@ -102,7 +101,7 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c index 21162685b2e..7de23a0826c 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c @@ -15,21 +15,17 @@ #define DBG_LVL DBG_LOG -#define TC_UART_DEVICE_NAME "uart2" - #ifdef UTEST_SERIAL_TC -#define TC_UART_SEND_TIMES 100 - static struct rt_serial_device *serial; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -67,8 +63,8 @@ static rt_bool_t uart_api() /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -80,17 +76,17 @@ static rt_bool_t uart_api() rt_uint8_t *ch; rt_uint32_t i; - ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_TX_BUFSIZE * 5 + 1)); + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 1)); for (i = 0; i < TC_UART_SEND_TIMES; i++) { - if (RT_EOK != test_item(ch, BSP_UART2_RX_BUFSIZE + BSP_UART2_RX_BUFSIZE * (rand() % 5))) + if (RT_EOK != test_item(ch, RT_SERIAL_TC_RXBUF_SIZE + RT_SERIAL_TC_RXBUF_SIZE * (rand() % 5))) { result = -RT_ERROR; goto __exit; } - if (RT_EOK != test_item(ch, rand() % (BSP_UART2_RX_BUFSIZE * 5))) + if (RT_EOK != test_item(ch, rand() % (RT_SERIAL_TC_RXBUF_SIZE * 5))) { result = -RT_ERROR; goto __exit; @@ -116,7 +112,7 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c index bf92a399b05..5ca8c870f12 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c @@ -15,21 +15,17 @@ #define DBG_LVL DBG_LOG -#define TC_UART_DEVICE_NAME "uart2" - #ifdef UTEST_SERIAL_TC -#define TC_UART_SEND_TIMES 100 - static struct rt_serial_device *serial; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -50,7 +46,7 @@ static rt_bool_t uart_api() /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; config.tx_bufsz = 64; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); @@ -124,7 +120,7 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c index e200bf2071d..4fd51124500 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c @@ -15,21 +15,17 @@ #define DBG_LVL DBG_LOG -#define TC_UART_DEVICE_NAME "uart2" - #ifdef UTEST_SERIAL_TC -#define TC_UART_SEND_TIMES 100 - static struct rt_serial_device *serial; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -50,7 +46,7 @@ static rt_bool_t uart_api() /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; config.tx_bufsz = 256; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); @@ -124,7 +120,7 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c index 5528ba7d0af..89d7474517d 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c @@ -15,22 +15,18 @@ /* #define DBG_LVL DBG_LOG*/ -#define TC_UART_DEVICE_NAME "uart2" - #ifdef UTEST_SERIAL_TC -#define TC_UART_SEND_TIMES 100 - static struct rt_serial_device *serial; static rt_uint8_t uart_over_flag = RT_FALSE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -45,9 +41,9 @@ static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t size) send_len = rt_device_write(&serial->parent, 0, ch, size); - if (size > BSP_UART2_RX_BUFSIZE) + if (size > RT_SERIAL_TC_RXBUF_SIZE) { - size = BSP_UART2_RX_BUFSIZE; + size = RT_SERIAL_TC_RXBUF_SIZE; } rt_thread_delay(5); @@ -85,8 +81,8 @@ static rt_bool_t uart_api() /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -98,17 +94,17 @@ static rt_bool_t uart_api() rt_uint8_t *ch; rt_uint32_t i; - ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_TX_BUFSIZE * 5 + 1)); + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 1)); for (i = 0; i < TC_UART_SEND_TIMES; i++) { - if (RT_EOK != test_item(ch, BSP_UART2_RX_BUFSIZE + BSP_UART2_RX_BUFSIZE * (rand() % 5))) + if (RT_EOK != test_item(ch, RT_SERIAL_TC_RXBUF_SIZE + RT_SERIAL_TC_RXBUF_SIZE * (rand() % 5))) { result = -RT_ERROR; goto __exit; } - if (RT_EOK != test_item(ch, rand() % (BSP_UART2_RX_BUFSIZE * 5))) + if (RT_EOK != test_item(ch, rand() % (RT_SERIAL_TC_RXBUF_SIZE * 5))) { result = -RT_ERROR; goto __exit; @@ -134,7 +130,7 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c index ba99f464673..cae85e11cee 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_rx.c @@ -2,7 +2,6 @@ #include #include "utest.h" -#define TC_UART_DEVICE_NAME "uart2" #define DBG_LVL DBG_LOG #ifdef UTEST_SERIAL_TC @@ -73,7 +72,7 @@ static rt_bool_t nonblock_read(rt_device_t uart_dev) static void uart_test_nonblocking_rx(void) { rt_device_t uart_dev; - uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); uassert_not_null(uart_dev); uassert_true(nonblock_read(uart_dev)); @@ -86,7 +85,7 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c index d63f52a04cc..278da17f874 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_nonblocking_tx.c @@ -2,8 +2,7 @@ #include #include "utest.h" -#define TC_UART_DEVICE_NAME "uart2" -#define UART_SEND_TIMES 400 +#define UART_SEND_TIMES 100 #define UART_TEST_NUMBER 6 #define DBG_LVL DBG_LOG @@ -20,7 +19,7 @@ static rt_bool_t nonblock_write(rt_device_t uart_dev) /* make sure device is closed and reopen it */ while (rt_device_close(uart_dev) != -RT_ERROR); - uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); rt_device_open(uart_dev, RT_DEVICE_FLAG_TX_NON_BLOCKING | RT_DEVICE_FLAG_RX_NON_BLOCKING); LOG_D("\nNONBLOCKING WRITE BEGIN\n"); @@ -98,7 +97,7 @@ static rt_bool_t nonblock_write(rt_device_t uart_dev) static void uart_test_nonblocking_tx(void) { rt_device_t uart_dev; - uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); uassert_not_null(uart_dev); uassert_true(nonblock_write(uart_dev)); @@ -111,7 +110,7 @@ static rt_err_t utest_tc_init(void) static rt_err_t utest_tc_cleanup(void) { - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c index 227399b16f3..e7ea1697326 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c @@ -15,10 +15,6 @@ #define DBG_LVL DBG_LOG -#define TC_UART_DEVICE_NAME "uart2" -#define TC_UART_SEND_TIMES 100 - - #ifdef UTEST_SERIAL_TC static struct rt_serial_device *serial; @@ -27,11 +23,11 @@ static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -79,8 +75,8 @@ static void uart_rec_entry(void *parameter) while (1) { - cnt = rt_device_read(&serial->parent, 0, (void *)ch, BSP_UART2_RX_BUFSIZE); - if (cnt != BSP_UART2_RX_BUFSIZE) + cnt = rt_device_read(&serial->parent, 0, (void *)ch, RT_SERIAL_TC_RXBUF_SIZE); + if (cnt != RT_SERIAL_TC_RXBUF_SIZE) { uart_result = RT_FALSE; rt_free(ch); @@ -120,8 +116,8 @@ static rt_err_t uart_api(rt_uint16_t length) /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -175,8 +171,8 @@ static void tc_uart_api(void) rt_uint32_t i = 0; for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_TXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_TXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -186,8 +182,8 @@ static void tc_uart_api(void) for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_RXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_RXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -197,8 +193,8 @@ static void tc_uart_api(void) while (TC_UART_SEND_TIMES - times) { - num = (rand() % BSP_UART2_RX_BUFSIZE) + 1; - if (uart_api(num + BSP_UART2_RX_BUFSIZE) == RT_EOK) + num = (rand() % RT_SERIAL_TC_RXBUF_SIZE) + 1; + if (uart_api(num + RT_SERIAL_TC_RXBUF_SIZE) == RT_EOK) LOG_I("data_lens [%3d], it is correct to read and write data. [%d] times testing.", num, ++times); else { @@ -221,7 +217,7 @@ static rt_err_t utest_tc_cleanup(void) { uart_result = RT_TRUE; uart_over_flag = RT_FALSE; - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c index 20b2b1997d9..67868f85e18 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c @@ -15,10 +15,6 @@ #define DBG_LVL DBG_LOG -#define TC_UART_DEVICE_NAME "uart2" -#define TC_UART_SEND_TIMES 100 - - #ifdef UTEST_SERIAL_TC static struct rt_serial_device *serial; @@ -27,11 +23,11 @@ static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -141,8 +137,8 @@ static rt_err_t uart_api(rt_uint16_t length) /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -197,8 +193,8 @@ static void tc_uart_api(void) rt_uint32_t i = 0; for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_TXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_TXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -208,8 +204,8 @@ static void tc_uart_api(void) for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_RXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_RXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -243,7 +239,7 @@ static rt_err_t utest_tc_cleanup(void) { uart_result = RT_TRUE; uart_over_flag = RT_FALSE; - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c index d5f66d931bc..f7115b41a2c 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c @@ -15,10 +15,6 @@ #define DBG_LVL DBG_LOG -#define TC_UART_DEVICE_NAME "uart2" -#define TC_UART_SEND_TIMES 100 - - #ifdef UTEST_SERIAL_TC static struct rt_serial_device *serial; @@ -28,11 +24,11 @@ static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -162,8 +158,8 @@ static rt_err_t uart_api(rt_uint16_t test_buf) /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING); @@ -228,8 +224,8 @@ static void tc_uart_api(void) rt_uint32_t i = 0; for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_TXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_TXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -239,8 +235,8 @@ static void tc_uart_api(void) for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_RXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_RXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -275,7 +271,7 @@ static rt_err_t utest_tc_cleanup(void) tx_sem = RT_NULL; uart_result = RT_TRUE; uart_over_flag = RT_FALSE; - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c index d7e71e59186..5dd99b0b957 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c @@ -15,10 +15,6 @@ #define DBG_LVL DBG_LOG -#define TC_UART_DEVICE_NAME "uart2" -#define TC_UART_SEND_TIMES 100 - - #ifdef UTEST_SERIAL_TC static struct rt_serial_device *serial; @@ -28,11 +24,11 @@ static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -165,8 +161,8 @@ static rt_err_t uart_api(rt_uint16_t test_buf) /* reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -231,8 +227,8 @@ static void tc_uart_api(void) rt_uint32_t i = 0; for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_TXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_TXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -242,8 +238,8 @@ static void tc_uart_api(void) for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_RXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_RXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -278,7 +274,7 @@ static rt_err_t utest_tc_cleanup(void) rx_sem = RT_NULL; uart_result = RT_TRUE; uart_over_flag = RT_FALSE; - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c index fed059877b7..93c68b2d10d 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c @@ -15,10 +15,6 @@ #define DBG_LVL DBG_LOG -#define TC_UART_DEVICE_NAME "uart2" -#define TC_UART_SEND_TIMES 100 - - #ifdef UTEST_SERIAL_TC static struct rt_serial_device *serial; @@ -29,11 +25,11 @@ static rt_bool_t uart_result = RT_TRUE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -185,8 +181,8 @@ static rt_err_t uart_api(rt_uint16_t test_buf) /* reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = BSP_UART2_TX_BUFSIZE; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING); @@ -260,8 +256,8 @@ static void tc_uart_api(void) rt_uint32_t i = 0; for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_TX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_TX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_TXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_TXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -271,8 +267,8 @@ static void tc_uart_api(void) for (i = 1; i < 10; i++) { - if (uart_api(BSP_UART2_RX_BUFSIZE * i + i % 2) == RT_EOK) - LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", BSP_UART2_RX_BUFSIZE * i + i % 2, ++times); + if (uart_api(RT_SERIAL_TC_RXBUF_SIZE * i + i % 2) == RT_EOK) + LOG_I("data_lens [%4d], it is correct to read and write data. [%d] times testing.", RT_SERIAL_TC_RXBUF_SIZE * i + i % 2, ++times); else { LOG_E("uart test error"); @@ -307,7 +303,7 @@ static rt_err_t utest_tc_cleanup(void) tx_sem = RT_NULL; uart_result = RT_TRUE; uart_over_flag = RT_FALSE; - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } diff --git a/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c index 57386566589..1c5f0009622 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c @@ -15,8 +15,6 @@ /* #define DBG_LVL DBG_LOG*/ -#define TC_UART_DEVICE_NAME "uart2" - #ifdef UTEST_SERIAL_TC static struct rt_serial_device *serial; @@ -27,11 +25,11 @@ static rt_uint8_t uart_over_flag = RT_FALSE; static rt_err_t uart_find(void) { - serial = (struct rt_serial_device *)rt_device_find(TC_UART_DEVICE_NAME); + serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME); if (serial == RT_NULL) { - LOG_E("find %s device failed!\n", TC_UART_DEVICE_NAME); + LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME); return -RT_ERROR; } @@ -45,7 +43,7 @@ static void uart_send_entry(void *parameter) rt_uint32_t i = 0; /* assign send buffer */ - uart_write_buffer = (rt_uint8_t *)rt_malloc(BSP_UART2_RX_BUFSIZE); + uart_write_buffer = (rt_uint8_t *)rt_malloc(RT_SERIAL_TC_RXBUF_SIZE); if (uart_write_buffer == RT_NULL) { LOG_E("Without spare memory for uart dma!"); @@ -53,7 +51,7 @@ static void uart_send_entry(void *parameter) return; } - for (i = 0; i < BSP_UART2_RX_BUFSIZE; i++) + for (i = 0; i < RT_SERIAL_TC_RXBUF_SIZE; i++) { uart_write_buffer[i] = (rt_uint8_t)i; } @@ -63,7 +61,7 @@ static void uart_send_entry(void *parameter) if (uart_write_flag == RT_FALSE) break; - rt_device_write(&serial->parent, 0, uart_write_buffer, BSP_UART2_RX_BUFSIZE / 3); + rt_device_write(&serial->parent, 0, uart_write_buffer, RT_SERIAL_TC_RXBUF_SIZE / 3); rt_thread_mdelay(40); } @@ -75,7 +73,7 @@ static void uart_rec_entry(void *parameter) rt_uint8_t *ch; rt_uint32_t old_tick; rt_uint32_t i; - ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (BSP_UART2_RX_BUFSIZE * 10 + 1)); + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_RXBUF_SIZE * 10 + 1)); rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_TIMEOUT, (void *)100); @@ -84,7 +82,7 @@ static void uart_rec_entry(void *parameter) { rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); old_tick = rt_tick_get(); - uint32_t recv_len = rt_device_read(&serial->parent, 0, (void *)ch, BSP_UART2_RX_BUFSIZE); + uint32_t recv_len = rt_device_read(&serial->parent, 0, (void *)ch, RT_SERIAL_TC_RXBUF_SIZE); if (rt_tick_get() - old_tick > 100 + 2 || rt_tick_get() - old_tick < 100 - 2) { rt_kprintf("%d recv_len: %d\r\n", rt_tick_get() - old_tick, recv_len); @@ -102,7 +100,7 @@ static void uart_rec_entry(void *parameter) for (i = 0; i < 10; i++) { old_tick = rt_tick_get(); - rt_device_write(&serial->parent, 0, ch, BSP_UART2_RX_BUFSIZE * 10); + rt_device_write(&serial->parent, 0, ch, RT_SERIAL_TC_RXBUF_SIZE * 10); if (rt_tick_get() - old_tick > 10 + 2 || rt_tick_get() - old_tick < 10 - 2) { uart_result = RT_FALSE; @@ -132,8 +130,8 @@ static rt_bool_t uart_api() /* Reinitialize */ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; - config.rx_bufsz = BSP_UART2_RX_BUFSIZE; - config.tx_bufsz = 64; + config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -193,7 +191,7 @@ static rt_err_t utest_tc_cleanup(void) uart_result = RT_TRUE; uart_write_flag = RT_TRUE; uart_over_flag = RT_FALSE; - rt_device_t uart_dev = rt_device_find(TC_UART_DEVICE_NAME); + rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME); while (rt_device_close(uart_dev) != -RT_ERROR); return RT_EOK; } From 3ae60c8cc145358e64fd84225a54596db910e3c6 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Tue, 10 Sep 2024 20:37:22 +0800 Subject: [PATCH 10/17] =?UTF-8?q?[components][at=5Fclient]=20at=5Fclient?= =?UTF-8?q?=5Fgetchar=E8=BF=94=E5=9B=9E=E5=80=BC=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E3=80=81at=5Fclient=E8=A7=A3=E6=9E=90=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E4=BC=98=E5=85=88=E7=BA=A7=E9=94=99=E8=AF=AF=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/net/at/src/at_client.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/components/net/at/src/at_client.c b/components/net/at/src/at_client.c index 0d4333461a1..55a0647299f 100644 --- a/components/net/at/src/at_client.c +++ b/components/net/at/src/at_client.c @@ -465,7 +465,7 @@ static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeo rt_device_control(client->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)RT_WAITING_FOREVER); #endif - return RT_EOK; + return result; } /** @@ -882,8 +882,7 @@ static int at_client_para_init(at_client_t client) (void (*)(void *parameter))client_parser, client, 1024 + 512, - /* RT_THREAD_PRIORITY_MAX / 3 - 1,*/ - 8, + RT_THREAD_PRIORITY_MAX / 3 - 1, 5); if (client->parser == RT_NULL) { From 5b84990dfff35f2fb0d910cbb42bff1744ff5e84 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 11 Sep 2024 10:20:31 +0800 Subject: [PATCH 11/17] =?UTF-8?q?[components][at]=20=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E7=A0=81=E5=BA=94=E8=AF=A5=E8=BF=94=E5=9B=9E=E8=B4=9F=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/net/at/src/at_client.c | 2 +- components/net/at/src/at_server.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/components/net/at/src/at_client.c b/components/net/at/src/at_client.c index 55a0647299f..532de4c456e 100644 --- a/components/net/at/src/at_client.c +++ b/components/net/at/src/at_client.c @@ -460,7 +460,7 @@ static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeo result = rt_device_read(client->device, 0, ch, 1); if(result <= 0) { - result = RT_ERROR; + result = -RT_ERROR; } rt_device_control(client->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)RT_WAITING_FOREVER); #endif diff --git a/components/net/at/src/at_server.c b/components/net/at/src/at_server.c index 9c8d138ae71..1f1264ca9bd 100644 --- a/components/net/at/src/at_server.c +++ b/components/net/at/src/at_server.c @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 @@ -430,7 +430,7 @@ static rt_err_t at_server_getchar(at_server_t server, char *ch, rt_int32_t timeo result = rt_device_read(server->device, 0, ch, 1); if(result <= 0) { - result = RT_ERROR; + result = -RT_ERROR; } rt_device_control(server->device, RT_SERIAL_CTRL_RX_TIMEOUT, (void*)RT_WAITING_FOREVER); #endif From 4eabec2e1cae9a3b86803fbb27a9e9b206ba07f7 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 11 Sep 2024 10:26:56 +0800 Subject: [PATCH 12/17] format code --- components/net/at/src/at_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/net/at/src/at_server.c b/components/net/at/src/at_server.c index 1f1264ca9bd..9b8bff584d4 100644 --- a/components/net/at/src/at_server.c +++ b/components/net/at/src/at_server.c @@ -1,4 +1,4 @@ -/* +/* * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 From 61a0c6113c343ca28882b2c1fa981b995320e200 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 11 Sep 2024 14:36:35 +0800 Subject: [PATCH 13/17] =?UTF-8?q?[components][serial=5Fv2]=20TCFLSH?= =?UTF-8?q?=E5=92=8CFIONREAD=E5=AE=8C=E5=96=84=E3=80=81control=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E5=A2=9E=E5=8A=A0=E9=94=99=E8=AF=AF=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/serial/serial_v2.c | 209 ++++++++++++++------------ 1 file changed, 114 insertions(+), 95 deletions(-) diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c index 391c8c5eb91..51211e85336 100644 --- a/components/drivers/serial/serial_v2.c +++ b/components/drivers/serial/serial_v2.c @@ -1119,6 +1119,76 @@ static rt_err_t rt_serial_close(struct rt_device *dev) return RT_EOK; } +static void _serial_rx_flush(struct rt_serial_device *serial) +{ + rt_base_t level; + struct rt_serial_rx_fifo* rx_fifo; + RT_ASSERT(serial != RT_NULL); + + if (serial->config.rx_bufsz == 0) + { + while (serial->ops->getc(serial) != -1) + { + } + } + else + { + rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; + RT_ASSERT(rx_fifo != RT_NULL); + + level = rt_hw_interrupt_disable(); + rx_fifo->rx_cpt_index = 0; + rt_ringbuffer_reset(&rx_fifo->rb); + rt_hw_interrupt_enable(level); + } +} + +static void _serial_tx_flush(struct rt_serial_device *serial) +{ + rt_base_t level; + struct rt_serial_tx_fifo* tx_fifo; + RT_ASSERT(serial != RT_NULL); + + if (serial->config.tx_bufsz != 0) + { + tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx; + RT_ASSERT(tx_fifo != RT_NULL); + + level = rt_hw_interrupt_disable(); + if (tx_fifo->activated != RT_FALSE) + { + rt_hw_interrupt_enable(level); + rt_completion_wait(&tx_fifo->tx_cpt, RT_WAITING_FOREVER); + return; + } + rt_hw_interrupt_enable(level); + } +} + +static rt_err_t _serial_get_unread_bytes_count(struct rt_serial_device *serial, rt_ssize_t* unread_bytes) +{ + rt_base_t level; + struct rt_serial_rx_fifo* rx_fifo; + RT_ASSERT(serial != RT_NULL); + + if (serial->config.rx_bufsz == 0) + { + LOG_W("get unread bytes count not support in poll mode."); + *unread_bytes = -1; + return -RT_EPERM; + } + else + { + rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; + RT_ASSERT(rx_fifo != RT_NULL); + + level = rt_hw_interrupt_disable(); + *unread_bytes = rt_ringbuffer_data_len(&rx_fifo->rb); + rt_hw_interrupt_enable(level); + } + return RT_EOK; +} + #ifdef RT_USING_POSIX_TERMIOS struct speed_baudrate_item { @@ -1171,44 +1241,17 @@ static int _get_baudrate(speed_t speed) 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) + if (queue == TCIFLUSH || queue == TCIOFLUSH) { - 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(); - rx_fifo->rx_cpt_index = 0; - rt_hw_interrupt_enable(level); - } - else - { - while (1) - { - ch = serial->ops->getc(serial); - if (ch == -1) break; - } - } - - break; - - case TCOFLUSH: - break; + _serial_rx_flush(serial); } + if (queue == TCOFLUSH || queue == TCIOFLUSH) + { + _serial_tx_flush(serial); + } } #endif /* RT_USING_POSIX_TERMIOS */ @@ -1242,14 +1285,19 @@ static rt_err_t rt_serial_control(struct rt_device *dev, break; case RT_DEVICE_CTRL_CONFIG: - if (args != RT_NULL) + if (args == RT_NULL) + { + ret = -RT_EINVAL; + } + else { struct serial_configure *pconfig = (struct serial_configure *) args; if (((pconfig->rx_bufsz != serial->config.rx_bufsz) || (pconfig->tx_bufsz != serial->config.tx_bufsz)) && serial->parent.ref_count) { /*can not change buffer size*/ - return -RT_EBUSY; + ret = -RT_EBUSY; + break; } /* set serial configure */ serial->config = *pconfig; @@ -1257,14 +1305,22 @@ static rt_err_t rt_serial_control(struct rt_device *dev, } break; case RT_DEVICE_CTRL_NOTIFY_SET: - if (args != RT_NULL) + if (args == RT_NULL) + { + ret = -RT_EINVAL; + } + else { rt_memcpy(&serial->rx_notify, args, sizeof(struct rt_device_notify)); } break; case RT_DEVICE_CTRL_CONSOLE_OFLAG: - if (args != RT_NULL) + if (args == RT_NULL) + { + ret = -RT_EINVAL; + } + else { *(rt_uint16_t*)args = RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM; } @@ -1272,7 +1328,11 @@ static rt_err_t rt_serial_control(struct rt_device *dev, /* Call before rt_device_read */ case RT_SERIAL_CTRL_RX_TIMEOUT: - if (args != RT_NULL) + if (args == RT_NULL) + { + ret = -RT_EINVAL; + } + else { struct rt_serial_rx_fifo* rx_fifo = RT_NULL; rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; @@ -1282,7 +1342,11 @@ static rt_err_t rt_serial_control(struct rt_device *dev, /* Call before rt_device_write */ case RT_SERIAL_CTRL_TX_TIMEOUT: - if (args != RT_NULL) + if (args == RT_NULL) + { + ret = -RT_EINVAL; + } + else { struct rt_serial_tx_fifo* tx_fifo = RT_NULL; tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx; @@ -1292,65 +1356,23 @@ static rt_err_t rt_serial_control(struct rt_device *dev, /* Discard all data */ case RT_SERIAL_CTRL_RX_FLUSH: - if(serial->config.rx_bufsz == 0) - { - while (serial->ops->getc(serial) != -1) - { - } - } - else - { - struct rt_serial_rx_fifo* rx_fifo; - rt_base_t level; - rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; - - level = rt_hw_interrupt_disable(); - rx_fifo->rx_cpt_index = 0; - rt_ringbuffer_reset(&rx_fifo->rb); - rt_hw_interrupt_enable(level); - } + _serial_rx_flush(serial); break; /* Blocking and wait for the send buffer data to be sent. */ case RT_SERIAL_CTRL_TX_FLUSH: - if(serial->config.tx_bufsz != 0) - { - struct rt_serial_tx_fifo* tx_fifo; - rt_base_t level; - tx_fifo = (struct rt_serial_tx_fifo*)serial->serial_tx; - level = rt_hw_interrupt_disable(); - if(tx_fifo->activated != RT_FALSE) - { - rt_hw_interrupt_enable(level); - rt_completion_wait(&tx_fifo->tx_cpt, RT_WAITING_FOREVER); - break; - } - rt_hw_interrupt_enable(level); - } + _serial_tx_flush(serial); break; /* Get buf data length. */ case RT_SERIAL_CTRL_GET_RX_DATA_LEN: - if(args == RT_NULL) - { - break; - } - - if(serial->config.rx_bufsz == 0) + if (args == RT_NULL) { - LOG_W("RT_SERIAL_CTRL_GET_RX_DATA_LEN not support poll mode."); - *(rt_ssize_t*)args = -1; - break; + ret = -RT_EINVAL; } else { - struct rt_serial_rx_fifo* rx_fifo; - rt_base_t level; - rx_fifo = (struct rt_serial_rx_fifo*)serial->serial_rx; - - level = rt_hw_interrupt_disable(); - *(rt_ssize_t*)args = rt_ringbuffer_data_len(&rx_fifo->rb); - rt_hw_interrupt_enable(level); + ret = _serial_get_unread_bytes_count(serial, (rt_ssize_t*)args); } break; @@ -1547,16 +1569,13 @@ static rt_err_t rt_serial_control(struct rt_device *dev, } break; case FIONREAD: + if (args == RT_NULL) { - rt_size_t recved = 0; - rt_base_t level; - struct rt_serial_rx_fifo * rx_fifo = (struct rt_serial_rx_fifo *) serial->serial_rx; - - level = rt_hw_interrupt_disable(); - recved = rt_ringbuffer_data_len(&rx_fifo->rb); - rt_hw_interrupt_enable(level); - - *(rt_size_t *)args = recved; + ret = -RT_EINVAL; + } + else + { + ret = _serial_get_unread_bytes_count(serial, (rt_ssize_t*)args); } break; #endif /* RT_USING_POSIX_STDIO */ From 6d2e90b5b1dab4ca267b92b0a46e297497cf1363 Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 11 Sep 2024 14:37:59 +0800 Subject: [PATCH 14/17] =?UTF-8?q?[components][serial=5Fv2]=20RT=5FSERIAL?= =?UTF-8?q?=5FCTRL=5FGET=5FRX=5FDATA=5FLEN=E6=9B=B4=E6=94=B9=E4=B8=BART=5F?= =?UTF-8?q?SERIAL=5FCTRL=5FGET=5FUNREAD=5FBYTES=5FCOUNT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/include/drivers/serial_v2.h | 12 ++++++------ components/drivers/serial/serial_v2.c | 4 ++-- .../drivers/serial_v2/uart_get_rx_data_len.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/components/drivers/include/drivers/serial_v2.h b/components/drivers/include/drivers/serial_v2.h index bce8fa8454d..0df8175f6c1 100644 --- a/components/drivers/include/drivers/serial_v2.h +++ b/components/drivers/include/drivers/serial_v2.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2023, RT-Thread Development Team + * Copyright (c) 2006-2024 RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -71,11 +71,11 @@ #define RT_SERIAL_EVENT_RX_DMADONE 0x03 /* Rx DMA transfer done */ #define RT_SERIAL_EVENT_TX_DMADONE 0x04 /* Tx DMA transfer done */ -#define RT_SERIAL_CTRL_RX_TIMEOUT (RT_DEVICE_CTRL_MASK + 0x01) /* Rx timeout. Call before rt_device_read */ -#define RT_SERIAL_CTRL_TX_TIMEOUT (RT_DEVICE_CTRL_MASK + 0x02) /* Tx timeout. Call before rt_device_write */ -#define RT_SERIAL_CTRL_RX_FLUSH (RT_DEVICE_CTRL_MASK + 0x03) /* Clear rx buffer. Discard all data */ -#define RT_SERIAL_CTRL_TX_FLUSH (RT_DEVICE_CTRL_MASK + 0x04) /* Clear tx buffer. Blocking and wait for the send buffer data to be sent. */ -#define RT_SERIAL_CTRL_GET_RX_DATA_LEN (RT_DEVICE_CTRL_MASK + 0x05) /* Get buf data length. */ +#define RT_SERIAL_CTRL_RX_TIMEOUT (RT_DEVICE_CTRL_MASK + 0x01) /* Rx timeout. Call before rt_device_read. not supported in poll mode */ +#define RT_SERIAL_CTRL_TX_TIMEOUT (RT_DEVICE_CTRL_MASK + 0x02) /* Tx timeout. Call before rt_device_write. not supported in poll mode */ +#define RT_SERIAL_CTRL_RX_FLUSH (RT_DEVICE_CTRL_MASK + 0x03) /* Clear rx buffer. Discard all data */ +#define RT_SERIAL_CTRL_TX_FLUSH (RT_DEVICE_CTRL_MASK + 0x04) /* Clear tx buffer. Blocking and wait for the send buffer data to be sent. not supported in poll mode */ +#define RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT (RT_DEVICE_CTRL_MASK + 0x05) /* get unread bytes count. not supported in poll mode */ #define RT_SERIAL_ERR_OVERRUN 0x01 #define RT_SERIAL_ERR_FRAMING 0x02 diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c index 51211e85336..5b91888e32c 100644 --- a/components/drivers/serial/serial_v2.c +++ b/components/drivers/serial/serial_v2.c @@ -1364,8 +1364,8 @@ static rt_err_t rt_serial_control(struct rt_device *dev, _serial_tx_flush(serial); break; - /* Get buf data length. */ - case RT_SERIAL_CTRL_GET_RX_DATA_LEN: + /* get unread bytes count. */ + case RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT: if (args == RT_NULL) { ret = -RT_EINVAL; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c index 89d7474517d..06f7a9ea933 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c @@ -47,7 +47,7 @@ static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t size) } rt_thread_delay(5); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT, (void *)&buf_data_len); if (size != buf_data_len) { return -RT_ERROR; @@ -59,7 +59,7 @@ static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t size) return -RT_ERROR; } - rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_RX_DATA_LEN, (void *)&buf_data_len); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_GET_UNREAD_BYTES_COUNT, (void *)&buf_data_len); if (0 != buf_data_len) { return -RT_ERROR; From cd4a1a4b893a6db76886e215d0d9b2106549a91f Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 11 Sep 2024 14:38:47 +0800 Subject: [PATCH 15/17] =?UTF-8?q?[utest][serial=5Fv2]=20TC=5FUART=5FSEND?= =?UTF-8?q?=5FTIMES=E6=9B=BF=E6=8D=A2=E4=B8=BART=5FSERIAL=5FTC=5FSEND=5FIT?= =?UTF-8?q?ERATIONS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/utest/testcases/drivers/serial_v2/Kconfig | 2 +- examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c | 6 +++--- .../utest/testcases/drivers/serial_v2/uart_flush_txnb.c | 6 +++--- .../testcases/drivers/serial_v2/uart_get_rx_data_len.c | 2 +- .../testcases/drivers/serial_v2/uart_overflow_rxb_txb.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c | 2 +- examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c | 2 +- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/examples/utest/testcases/drivers/serial_v2/Kconfig b/examples/utest/testcases/drivers/serial_v2/Kconfig index ddbcf7a9bf1..974d11adf3f 100644 --- a/examples/utest/testcases/drivers/serial_v2/Kconfig +++ b/examples/utest/testcases/drivers/serial_v2/Kconfig @@ -18,7 +18,7 @@ if UTEST_SERIAL_TC int "the tx buffer size for serial test" default 128 - config TC_UART_SEND_TIMES + config RT_SERIAL_TC_SEND_ITERATIONS int "the number of iterations for the test routine." default 100 diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c index 7de23a0826c..9766b18335a 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c @@ -78,7 +78,7 @@ static rt_bool_t uart_api() rt_uint32_t i; ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 1)); - for (i = 0; i < TC_UART_SEND_TIMES; i++) + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { if (RT_EOK != test_item(ch, RT_SERIAL_TC_RXBUF_SIZE + RT_SERIAL_TC_RXBUF_SIZE * (rand() % 5))) { diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c index 5ca8c870f12..52871f0dbb0 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c @@ -64,7 +64,7 @@ static rt_bool_t uart_api() rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_TIMEOUT, (void *)1); - for (i = 0; i < TC_UART_SEND_TIMES; i++) + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5)); @@ -77,7 +77,7 @@ static rt_bool_t uart_api() } } - for (i = 0; i < TC_UART_SEND_TIMES; i++) + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5) + 1); @@ -90,7 +90,7 @@ static rt_bool_t uart_api() } } - for (i = 0; i < TC_UART_SEND_TIMES; i++) + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { rt_device_write(&serial->parent, 0, ch, 256 + rand() % (256 * 4)); old_tick = rt_tick_get(); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c index 4fd51124500..1a676018609 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c @@ -62,7 +62,7 @@ static rt_bool_t uart_api() rt_uint32_t i; ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (256 * 5 + 10)); - for (i = 0; i < TC_UART_SEND_TIMES; i++) + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5)); @@ -76,7 +76,7 @@ static rt_bool_t uart_api() } - for (i = 0; i < TC_UART_SEND_TIMES; i++) + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5) + 1); @@ -89,7 +89,7 @@ static rt_bool_t uart_api() } } - for (i = 0; i < TC_UART_SEND_TIMES; i++) + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { rt_device_write(&serial->parent, 0, ch, 256 + rand() % (256 * 4)); old_tick = rt_tick_get(); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c index 06f7a9ea933..da7903d412f 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_get_rx_data_len.c @@ -96,7 +96,7 @@ static rt_bool_t uart_api() rt_uint32_t i; ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 1)); - for (i = 0; i < TC_UART_SEND_TIMES; i++) + for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { if (RT_EOK != test_item(ch, RT_SERIAL_TC_RXBUF_SIZE + RT_SERIAL_TC_RXBUF_SIZE * (rand() % 5))) { diff --git a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c index e7ea1697326..8745e46eb64 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c @@ -191,7 +191,7 @@ static void tc_uart_api(void) } } - while (TC_UART_SEND_TIMES - times) + while (RT_SERIAL_TC_SEND_ITERATIONS - times) { num = (rand() % RT_SERIAL_TC_RXBUF_SIZE) + 1; if (uart_api(num + RT_SERIAL_TC_RXBUF_SIZE) == RT_EOK) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c index 67868f85e18..aed643e9b80 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txb.c @@ -213,7 +213,7 @@ static void tc_uart_api(void) } } - while (TC_UART_SEND_TIMES - times) + while (RT_SERIAL_TC_SEND_ITERATIONS - times) { num = (rand() % 1000) + 1; if (uart_api(num) == RT_EOK) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c index f7115b41a2c..92bb1b60257 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxb_txnb.c @@ -244,7 +244,7 @@ static void tc_uart_api(void) } } - while (TC_UART_SEND_TIMES - times) + while (RT_SERIAL_TC_SEND_ITERATIONS - times) { num = (rand() % 1000) + 1; if (uart_api(num) == RT_EOK) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c index 5dd99b0b957..032584a9c6f 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txb.c @@ -247,7 +247,7 @@ static void tc_uart_api(void) } } - while (TC_UART_SEND_TIMES - times) + while (RT_SERIAL_TC_SEND_ITERATIONS - times) { num = (rand() % 1000) + 1; if (uart_api(num) == RT_EOK) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c index 93c68b2d10d..8d238f57e37 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_rxnb_txnb.c @@ -276,7 +276,7 @@ static void tc_uart_api(void) } } - while (TC_UART_SEND_TIMES - times) + while (RT_SERIAL_TC_SEND_ITERATIONS - times) { num = (rand() % 1000) + 1; if (uart_api(num) == RT_EOK) From cad404a122df0dd95233802024878cc77d351eae Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 11 Sep 2024 17:09:22 +0800 Subject: [PATCH 16/17] =?UTF-8?q?[components][serial=5Fv2]=20FIONREAD?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=BA=94=E8=AF=A5=E6=98=AF=E6=97=A0=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/serial/serial_v2.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/components/drivers/serial/serial_v2.c b/components/drivers/serial/serial_v2.c index 5b91888e32c..d5b02261c1f 100644 --- a/components/drivers/serial/serial_v2.c +++ b/components/drivers/serial/serial_v2.c @@ -1575,7 +1575,12 @@ static rt_err_t rt_serial_control(struct rt_device *dev, } else { - ret = _serial_get_unread_bytes_count(serial, (rt_ssize_t*)args); + rt_ssize_t unread_bytes = 0; + ret = _serial_get_unread_bytes_count(serial, &unread_bytes); + if (ret == RT_EOK) + *(rt_size_t *)args = (rt_size_t)unread_bytes; + else + *(rt_size_t *)args = 0; } break; #endif /* RT_USING_POSIX_STDIO */ From 3c107c73fc3394998896843a4fa131d2b16d52fa Mon Sep 17 00:00:00 2001 From: ryancw <1831931681@qq.com> Date: Wed, 11 Sep 2024 19:08:16 +0800 Subject: [PATCH 17/17] =?UTF-8?q?[utest][serial=5Fv2]=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drivers/serial_v2/uart_flush_rx.c | 2 +- .../drivers/serial_v2/uart_flush_txb.c | 58 ++++++++++------- .../drivers/serial_v2/uart_flush_txnb.c | 62 +++++++++++-------- .../drivers/serial_v2/uart_overflow_rxb_txb.c | 3 +- .../drivers/serial_v2/uart_timeout_rxb_txb.c | 24 ++++--- 5 files changed, 89 insertions(+), 60 deletions(-) diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c index 9766b18335a..b1584e926a3 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_rx.c @@ -35,7 +35,7 @@ static rt_err_t uart_find(void) static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t size) { rt_device_write(&serial->parent, 0, ch, size); - rt_thread_mdelay(size / 11); + rt_thread_mdelay(size * 0.0868 + 5); if (1 != rt_device_read(&serial->parent, 0, ch, 1)) { return -RT_ERROR; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c index 52871f0dbb0..5bbb06da376 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txb.c @@ -32,6 +32,35 @@ static rt_err_t uart_find(void) return RT_EOK; } +static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t send_size) +{ + rt_uint32_t old_tick; + rt_tick_t tick_diff; + rt_tick_t expect_time = send_size * 0.0868; + + /* In interrupt mode, ticks may be inaccurate; compensation should be applied*/ + if (send_size > 384) + { + expect_time -= send_size / 384; + } + + old_tick = rt_tick_get(); + rt_device_write(&serial->parent, 0, ch, send_size); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + tick_diff = rt_tick_get() - old_tick; + + if (tick_diff < expect_time) + { + LOG_E("send_size [%4d], time required for TXB mode transmission to complete [%3d], expect_time [%3d]", send_size, tick_diff, expect_time); + return -RT_ERROR; + } + else + { + LOG_I("send_size [%4d], time required for TXB mode transmission to complete [%3d], expect_time [%3d]", send_size, tick_diff, expect_time); + } + + return RT_EOK; +} static rt_bool_t uart_api() { @@ -47,7 +76,7 @@ static rt_bool_t uart_api() struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; - config.tx_bufsz = 64; + config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE * 5 + 10; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING); @@ -58,44 +87,25 @@ static rt_bool_t uart_api() } rt_uint8_t *ch; - rt_uint32_t old_tick; rt_uint32_t i; - ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (256 * 5 + 10)); + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 10)); rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_TIMEOUT, (void *)1); for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { - rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5)); - - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + if (RT_EOK != test_item(ch, RT_SERIAL_TC_TXBUF_SIZE * (rand() % 6))) { result = -RT_ERROR; goto __exit; } - } - - for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) - { - rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5) + 1); - - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + if (RT_EOK != test_item(ch, RT_SERIAL_TC_TXBUF_SIZE * (rand() % 6) + 1)) { result = -RT_ERROR; goto __exit; } - } - for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) - { - rt_device_write(&serial->parent, 0, ch, 256 + rand() % (256 * 4)); - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + if (RT_EOK != test_item(ch, rand() % (RT_SERIAL_TC_TXBUF_SIZE * 5))) { result = -RT_ERROR; goto __exit; diff --git a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c index 1a676018609..ceb5afb50ef 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_flush_txnb.c @@ -32,6 +32,35 @@ static rt_err_t uart_find(void) return RT_EOK; } +static rt_err_t test_item(rt_uint8_t *ch, rt_uint32_t send_size) +{ + rt_uint32_t old_tick; + rt_tick_t tick_diff; + rt_tick_t expect_time = send_size * 0.0868; + + /* In interrupt mode, ticks may be inaccurate; compensation should be applied*/ + if (send_size > 384) + { + expect_time -= send_size / 384; + } + + old_tick = rt_tick_get(); + rt_device_write(&serial->parent, 0, ch, send_size); + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); + tick_diff = rt_tick_get() - old_tick; + + if (tick_diff < expect_time) + { + LOG_E("send_size [%4d], time required for TXNB mode transmission to complete [%3d], expect_time [%3d]", send_size, tick_diff, expect_time); + return -RT_ERROR; + } + else + { + LOG_I("send_size [%4d], time required for TXNB mode transmission to complete [%3d], expect_time [%3d]", send_size, tick_diff, expect_time); + } + + return RT_EOK; +} static rt_bool_t uart_api() { @@ -47,7 +76,7 @@ static rt_bool_t uart_api() struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; config.baud_rate = BAUD_RATE_115200; config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE; - config.tx_bufsz = 256; + config.tx_bufsz = RT_SERIAL_TC_RXBUF_SIZE * 5 + 10; rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config); result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_NON_BLOCKING); @@ -58,50 +87,31 @@ static rt_bool_t uart_api() } rt_uint8_t *ch; - rt_uint32_t old_tick; rt_uint32_t i; - ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (256 * 5 + 10)); + ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_TXBUF_SIZE * 5 + 10)); + + rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_TIMEOUT, (void *)1); for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) { - rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5)); - - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + if (RT_EOK != test_item(ch, RT_SERIAL_TC_TXBUF_SIZE * (rand() % 6))) { result = -RT_ERROR; goto __exit; } - } - - - for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) - { - rt_device_write(&serial->parent, 0, ch, 256 + 256 * (rand() % 5) + 1); - - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + if (RT_EOK != test_item(ch, RT_SERIAL_TC_TXBUF_SIZE * (rand() % 6) + 1)) { result = -RT_ERROR; goto __exit; } - } - for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++) - { - rt_device_write(&serial->parent, 0, ch, 256 + rand() % (256 * 4)); - old_tick = rt_tick_get(); - rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); - if (rt_tick_get() - old_tick < 2) + if (RT_EOK != test_item(ch, rand() % (RT_SERIAL_TC_TXBUF_SIZE * 5))) { result = -RT_ERROR; goto __exit; } } - __exit: rt_free(ch); rt_device_close(&serial->parent); diff --git a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c index 8745e46eb64..fca80756f23 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_overflow_rxb_txb.c @@ -135,7 +135,8 @@ static rt_err_t uart_api(rt_uint16_t length) if ((thread_send != RT_NULL) && (thread_recv != RT_NULL)) { rt_thread_startup(thread_send); - rt_thread_mdelay(length / 11 + 10); + /* waiting for data transmission to complete*/ + rt_thread_mdelay(length * 0.0868 + 5); rt_thread_startup(thread_recv); } else diff --git a/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c index 1c5f0009622..92f7dc4e5ce 100644 --- a/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c +++ b/examples/utest/testcases/drivers/serial_v2/uart_timeout_rxb_txb.c @@ -71,7 +71,9 @@ static void uart_send_entry(void *parameter) static void uart_rec_entry(void *parameter) { rt_uint8_t *ch; - rt_uint32_t old_tick; + rt_tick_t old_tick; + rt_tick_t tick_diff; + rt_ssize_t recv_len; rt_uint32_t i; ch = (rt_uint8_t *)rt_malloc(sizeof(rt_uint8_t) * (RT_SERIAL_TC_RXBUF_SIZE * 10 + 1)); @@ -81,16 +83,19 @@ static void uart_rec_entry(void *parameter) for (i = 0; i < 10; i++) { rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL); - old_tick = rt_tick_get(); - uint32_t recv_len = rt_device_read(&serial->parent, 0, (void *)ch, RT_SERIAL_TC_RXBUF_SIZE); - if (rt_tick_get() - old_tick > 100 + 2 || rt_tick_get() - old_tick < 100 - 2) + old_tick = rt_tick_get(); + recv_len = rt_device_read(&serial->parent, 0, (void *)ch, RT_SERIAL_TC_RXBUF_SIZE); + tick_diff = rt_tick_get() - old_tick; + if (tick_diff > 100 + 1 || tick_diff < 100) { - rt_kprintf("%d recv_len: %d\r\n", rt_tick_get() - old_tick, recv_len); + LOG_E("timeout_test: recv_size [%d], RX block time [%d], expect_time [100 - 101]", recv_len, tick_diff); uart_write_flag = RT_FALSE; uart_result = RT_FALSE; rt_free(ch); return; } + + LOG_I("timeout_test: RX block time [%d], expect_time [100 - 101]", tick_diff); } uart_write_flag = RT_FALSE; @@ -99,15 +104,18 @@ static void uart_rec_entry(void *parameter) rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_TIMEOUT, (void *)10); for (i = 0; i < 10; i++) { - old_tick = rt_tick_get(); - rt_device_write(&serial->parent, 0, ch, RT_SERIAL_TC_RXBUF_SIZE * 10); - if (rt_tick_get() - old_tick > 10 + 2 || rt_tick_get() - old_tick < 10 - 2) + old_tick = rt_tick_get(); + recv_len = rt_device_write(&serial->parent, 0, ch, RT_SERIAL_TC_RXBUF_SIZE * 10); + tick_diff = rt_tick_get() - old_tick; + if (tick_diff > 10 + 1 || tick_diff < 10) { + LOG_E("timeout_test: recv_size [%d], TX block time [%d], expect_time [10 - 11]", recv_len, tick_diff); uart_result = RT_FALSE; rt_free(ch); return; } + LOG_I("timeout_test: TX block time [%d], expect_time [10 - 11]", tick_diff); rt_device_control(&serial->parent, RT_SERIAL_CTRL_TX_FLUSH, RT_NULL); }