summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorhaitao-zhang <[email protected]>2026-06-03 11:28:22 +0800
committerGitHub <[email protected]>2026-06-03 11:28:22 +0800
commit38ac0718ecc579b00c43f8d41a988efcb65be5ca (patch)
treeca8b2c2061c1493050e70baba8dbbf2b564a0abd /bsp
parent196a6f44cdb85ca8e89d8d464800ec05636dae67 (diff)
[BSP] [NS800RT7P65]Feature/optimize ns800 uart Drive (#11423)
[ns800] Option Uart Kconfig, and Resolve the issue of data loss in serial communication at low baud rates.
Diffstat (limited to 'bsp')
-rw-r--r--bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_uart.c67
-rw-r--r--bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig26
2 files changed, 82 insertions, 11 deletions
diff --git a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_uart.c b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_uart.c
index 76c084038a..181a427c22 100644
--- a/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_uart.c
+++ b/bsp/novosns/ns800/libraries/HAL_Drivers/drivers/drv_uart.c
@@ -46,6 +46,29 @@
#define NS800_UART_DEFAULT_TX_TIMEOUT BSP_NS800_UART_TX_TIMEOUT
#endif
+/* Default UART configuration from Kconfig */
+#ifndef BSP_UART_DEFAULT_BAUDRATE
+#define BSP_UART_DEFAULT_BAUDRATE 115200
+#endif
+
+/* Data bits mapping */
+#if defined(BSP_UART_DATABITS_7)
+#define NS800_UART_DEFAULT_DATA_BITS DATA_BITS_7
+#elif defined(BSP_UART_DATABITS_8)
+#define NS800_UART_DEFAULT_DATA_BITS DATA_BITS_8
+#elif defined(BSP_UART_DATABITS_9)
+#define NS800_UART_DEFAULT_DATA_BITS DATA_BITS_9
+#else
+#define NS800_UART_DEFAULT_DATA_BITS DATA_BITS_8
+#endif
+
+/* Stop bits mapping */
+#ifdef BSP_UART_STOPBITS_2
+#define NS800_UART_DEFAULT_STOP_BITS STOP_BITS_2
+#else
+#define NS800_UART_DEFAULT_STOP_BITS STOP_BITS_1
+#endif
+
enum
{
#ifdef BSP_USING_UART1
@@ -377,31 +400,48 @@ static rt_err_t ns800_control(struct rt_serial_device *serial, int cmd, void *ar
return RT_EOK;
}
-static int ns800_putc(struct rt_serial_device *serial, char c)
+static rt_err_t ns800_wait_tx_space(struct ns800_uart *uart, rt_uint32_t timeout_ms)
{
- struct ns800_uart *uart;
- rt_uint32_t block_timeout;
+ rt_tick_t start_tick;
+ rt_tick_t timeout_tick;
- RT_ASSERT(serial != RT_NULL);
+ RT_ASSERT(uart != RT_NULL);
- uart = rt_container_of(serial, struct ns800_uart, serial);
- block_timeout = uart->tx_block_timeout;
+ if (UART_isSpaceAvailable(uart->handle.Instance))
+ {
+ return RT_EOK;
+ }
+
+ timeout_tick = rt_tick_from_millisecond(timeout_ms);
+ start_tick = rt_tick_get();
while (!UART_isSpaceAvailable(uart->handle.Instance))
{
- if (block_timeout-- == 0U)
+ if ((rt_tick_get() - start_tick) > timeout_tick)
{
- return -1;
+ return -RT_ETIMEOUT;
}
}
- UART_writeChar(uart->handle.Instance, (rt_uint8_t)c);
+ return RT_EOK;
+}
+
+static int ns800_putc(struct rt_serial_device *serial, char c)
+{
+ struct ns800_uart *uart;
+ rt_err_t result;
+
+ RT_ASSERT(serial != RT_NULL);
- while ((uart->handle.Instance->STAT.BIT.TC == false) && (--block_timeout != 0U))
+ uart = rt_container_of(serial, struct ns800_uart, serial);
+ result = ns800_wait_tx_space(uart, uart->tx_block_timeout);
+ if (result != RT_EOK)
{
+ return -1;
}
- return (block_timeout != 0U) ? 1 : -1;
+ UART_writeChar(uart->handle.Instance, (rt_uint8_t)c);
+ return 1;
}
static int ns800_getc(struct rt_serial_device *serial)
@@ -489,6 +529,11 @@ static void ns800_uart_fill_default_config(struct serial_configure *config,
*config = (struct serial_configure)RT_SERIAL_CONFIG_DEFAULT;
+ /* Override with Kconfig settings */
+ config->baud_rate = BSP_UART_DEFAULT_BAUDRATE;
+ config->data_bits = NS800_UART_DEFAULT_DATA_BITS;
+ config->stop_bits = NS800_UART_DEFAULT_STOP_BITS;
+
#ifdef RT_USING_SERIAL_V2
config->rx_bufsz = hw->rx_bufsz;
config->tx_bufsz = hw->tx_bufsz;
diff --git a/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig b/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig
index 0d9073c9bb..fa348a7a18 100644
--- a/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig
+++ b/bsp/novosns/ns800/ns800rt7p65-nssinepad/board/Kconfig
@@ -20,6 +20,32 @@ menu "On-chip Peripheral Drivers"
default 6000
depends on !RT_USING_SERIAL_V2
+ config BSP_UART_DEFAULT_BAUDRATE
+ int "UART default baudrate"
+ default 115200
+ help
+ Default baudrate for all UART ports.
+
+ choice BSP_UART_DEFAULT_DATABITS
+ prompt "UART default data bits"
+ default BSP_UART_DATABITS_8
+ config BSP_UART_DATABITS_7
+ bool "7 bits"
+ config BSP_UART_DATABITS_8
+ bool "8 bits"
+ config BSP_UART_DATABITS_9
+ bool "9 bits"
+ endchoice
+
+ choice BSP_UART_DEFAULT_STOPBITS
+ prompt "UART default stop bits"
+ default BSP_UART_STOPBITS_1
+ config BSP_UART_STOPBITS_1
+ bool "1 bit"
+ config BSP_UART_STOPBITS_2
+ bool "2 bits"
+ endchoice
+
menuconfig BSP_USING_UART1
bool "Enable UART1"
default y