This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 092bdec20ba2360e035da8270c1c948f2439aec6
Author: Bowen Wang <[email protected]>
AuthorDate: Wed Aug 28 13:59:39 2024 +0800

    drivers/serial: support force panic only when repeat the panic char
    
    We can increase the panic repeat count to avoid abnormal crashes
    caused by serial port interference.
    
    Signed-off-by: Bowen Wang <[email protected]>
---
 drivers/serial/Kconfig        |  7 +++++++
 drivers/serial/serial.c       | 14 +++++++++++++-
 include/nuttx/serial/serial.h |  4 ++++
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index 4cf3b2b4a3..fe09c6a2f6 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -333,6 +333,13 @@ config TTY_FORCE_PANIC_CHAR
        ---help---
                Use Ctrl-? 0x1F inputs to determine whether panic system
 
+config TTY_FORCE_PANIC_REPEAT_COUNT
+       int "TTY force crash repeat count"
+       default 1
+       depends on TTY_FORCE_PANIC
+       ---help---
+               Repeat how many times the panic char to determine whether panic 
system
+
 config TTY_SIGINT
        bool "Support SIGINT"
        default n
diff --git a/drivers/serial/serial.c b/drivers/serial/serial.c
index fedcc0c25c..b881f5d470 100644
--- a/drivers/serial/serial.c
+++ b/drivers/serial/serial.c
@@ -1914,6 +1914,10 @@ int uart_register(FAR const char *path, FAR uart_dev_t 
*dev)
   dev->pid = INVALID_PROCESS_ID;
 #endif
 
+#ifdef CONFIG_TTY_FORCE_PANIC
+  dev->panic_count = 0;
+#endif
+
   /* If this UART is a serial console */
 
   if (dev->isconsole)
@@ -2128,9 +2132,17 @@ int uart_check_special(FAR uart_dev_t *dev, FAR const 
char *buf, size_t size)
 #ifdef CONFIG_TTY_FORCE_PANIC
       if (buf[i] == CONFIG_TTY_FORCE_PANIC_CHAR)
         {
-          PANIC_WITH_REGS("Force panic by user.", NULL);
+          if (++dev->panic_count >= CONFIG_TTY_FORCE_PANIC_REPEAT_COUNT)
+            {
+              PANIC_WITH_REGS("Force panic by user.", NULL);
+            }
+
           return 0;
         }
+      else
+        {
+          dev->panic_count = 0;
+        }
 #endif
 
 #ifdef CONFIG_TTY_LAUNCH
diff --git a/include/nuttx/serial/serial.h b/include/nuttx/serial/serial.h
index bb14c9a2c7..b7a05ac2d1 100644
--- a/include/nuttx/serial/serial.h
+++ b/include/nuttx/serial/serial.h
@@ -310,6 +310,10 @@ struct uart_dev_s
   pid_t                pid;          /* Thread PID to receive signals (-1 if 
none) */
 #endif
 
+#ifdef CONFIG_TTY_FORCE_PANIC
+  int                  panic_count;
+#endif
+
   /* Terminal control flags */
 
   tcflag_t             tc_iflag;     /* Input modes */

Reply via email to