Hi all,

(First time posting on a Mailing List, I apologize if I'm breaking any rule)
(For the record: this work is done during my work hours at Reflex Aerospace)

I believe that I found a bug in the TMS570 BSP, more specifically the receiving
part of the SCI driver. Please find attached the git diff with more details.

```
Author: Adrien Chardon <adr...@reflexaerospace.com>
Date:   Wed Jan 24 18:01:52 2024 +0100

    bsp/tms570/sci: fix bug in tms570_sci_read_received_chars()

    `tms570_sci_interrupt_handler()` is called when an RX interrupt fires. It 
checks
    in the register `FLR`, the `RXRDY` bit (Receiver ready flag - indicate that 
the
    SCIRD contains new data). If it is set, it calls
    `tms570_sci_read_received_chars()`.

    `tms570_sci_read_received_chars()` checks the register `RD` against 0. If 
it is
    non zero, it returns 1 to indicate that one byte was read.

    In the old behavior, if it is zero, the function returns 0 to indicate that 
no
    data was read.

    The new behavior is to not silently drop 0x00 bytes. Ignoring 0x00 bytes is 
fine
    when working with printable text (which, I assume, is how this driver was
    tested), but as soon as the UART is used in non canonical (raw) mode, with
    potentially 0x00 bytes, these bytes will be silently dropped, causing 
issues in
    the data/protocol layer above.

diff --git bsps/arm/tms570/console/tms570-sci.c 
bsps/arm/tms570/console/tms570-sci.c
index a14b7dad5d..eb7c381d42 100644
--- bsps/arm/tms570/console/tms570-sci.c
+++ bsps/arm/tms570/console/tms570-sci.c
@@ -191,11 +191,8 @@ static int tms570_sci_read_received_chars(
   if ( N < 1 ) {
     return 0;
   }
-  if ( ctx->regs->RD != 0 ) {
-     buf[0] = ctx->regs->RD;
-    return 1;
-  }
-  return 0;
+  buf[0] = ctx->regs->RD;
+  return 1;
 }
```

Best regards

Adrien Chardon
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to