laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/simtrace2/+/30193 )

Change subject: firmware/sniffer: Pass PARITY/OVERRUN/FRAMING error via 
ringbuffer
......................................................................

firmware/sniffer: Pass PARITY/OVERRUN/FRAMING error via ringbuffer

those kind of errors should be passed to the main loop for further
processing, in-order together with the byte stream received from the
USART.

Change-Id: Iebd9bbc97c2a5a0c402e7a2711520299a1ade568
---
M firmware/libcommon/include/simtrace_prot.h
M firmware/libcommon/source/sniffer.c
2 files changed, 37 insertions(+), 12 deletions(-)

Approvals:
  laforge: Looks good to me, approved
  Hoernchen: Looks good to me, but someone else must approve
  Jenkins Builder: Verified



diff --git a/firmware/libcommon/include/simtrace_prot.h 
b/firmware/libcommon/include/simtrace_prot.h
index 5c43b06..d1eb89b 100644
--- a/firmware/libcommon/include/simtrace_prot.h
+++ b/firmware/libcommon/include/simtrace_prot.h
@@ -313,6 +313,9 @@
 #define SNIFF_DATA_FLAG_ERROR_INCOMPLETE (1<<5)
 #define SNIFF_DATA_FLAG_ERROR_MALFORMED (1<<6)
 #define SNIFF_DATA_FLAG_ERROR_CHECKSUM (1<<7)
+#define SNIFF_DATA_FLAG_ERROR_OVERRUN (1<<8)
+#define SNIFF_DATA_FLAG_ERROR_FRAMING (1<<9)
+#define SNIFF_DATA_FLAG_ERROR_PARITY (1<<10)

 /* SIMTRACE_MSGT_SNIFF_CHANGE */
 struct sniff_change {
diff --git a/firmware/libcommon/source/sniffer.c 
b/firmware/libcommon/source/sniffer.c
index bea4d95..e87e9b8 100644
--- a/firmware/libcommon/source/sniffer.c
+++ b/firmware/libcommon/source/sniffer.c
@@ -111,6 +111,11 @@
        TPDU_S_SW2, /*!< second status word */
 };

+/*! Error flags we use to report USART errors via the ringbuffer */
+#define RBUF16_F_OVERRUN       0x0100
+#define RBUF16_F_FRAMING       0x0200
+#define RBUF16_F_PARITY                0x0400
+
 
/*------------------------------------------------------------------------------
  *         Internal variables
  
*------------------------------------------------------------------------------*/
@@ -818,23 +823,32 @@

        /* Read channel status register */
        uint32_t csr = sniff_usart.base->US_CSR;
-       /* Verify if there was an error */
-       if (csr & US_CSR_OVRE)
-               TRACE_ERROR("USART overrun error\n\r");
-       if (csr & US_CSR_FRAME)
-               TRACE_ERROR("USART framing error\n\r");
-       if (csr & US_CSR_PARE)
-               TRACE_ERROR("USART parity error\n\r");
-       if (csr & (US_CSR_OVRE|US_CSR_FRAME|US_CSR_PARE))
-               sniff_usart.base->US_CR |= US_CR_RSTSTA;
+
+       uint16_t byte = 0;
+       bool byte_received = false;

        /* Verify if character has been received */
        if (csr & US_CSR_RXRDY) {
+               byte_received = true;
                /* Read communication data byte between phone and SIM */
-               uint8_t byte = sniff_usart.base->US_RHR;
+               byte = sniff_usart.base->US_RHR;
                /* Reset WT timer */
                wt_remaining = g_wt;
-               /* Store sniffed data into buffer (also clear interrupt */
+       }
+
+       /* Verify if there was an error */
+       if (csr & US_CSR_OVRE)
+               byte |= RBUF16_F_OVERRUN;
+       if (csr & US_CSR_FRAME)
+               byte |= RBUF16_F_FRAMING;
+       if (csr & US_CSR_PARE)
+               byte |= RBUF16_F_PARITY;
+
+       if (csr & (US_CSR_OVRE|US_CSR_FRAME|US_CSR_PARE))
+               sniff_usart.base->US_CR |= US_CR_RSTSTA;
+
+       /* Store sniffed data (or error flags, or both) into buffer */
+       if (byte_received || byte) {
                if (rbuf16_write(&sniff_buffer, byte) != 0)
                        TRACE_ERROR("USART buffer full\n\r");
        }
@@ -1008,7 +1022,8 @@
         */
        /* Handle sniffed data */
        if (!rbuf16_is_empty(&sniff_buffer)) { /* use if instead of while to 
let the main loop restart the watchdog */
-               uint8_t byte = rbuf16_read(&sniff_buffer);
+               uint16_t entry = rbuf16_read(&sniff_buffer);
+               uint8_t byte = entry & 0xff;
                /* Convert convention if required */
                if (convention_convert) {
                        byte = convention_convert_lut[byte];
@@ -1046,6 +1061,13 @@
                default:
                        TRACE_ERROR("Data received in unknown state %u\n\r", 
iso_state);
                }
+
+               if (entry & RBUF16_F_PARITY)
+                       TRACE_ERROR("USART PARITY Error\r\n");
+               if (entry & RBUF16_F_FRAMING)
+                       TRACE_ERROR("USART FRAMING Error\r\n");
+               if (entry & RBUF16_F_OVERRUN)
+                       TRACE_ERROR("USART OVERRUN Error\r\n");
        }

        /* Handle flags */

--
To view, visit https://gerrit.osmocom.org/c/simtrace2/+/30193
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: simtrace2
Gerrit-Branch: master
Gerrit-Change-Id: Iebd9bbc97c2a5a0c402e7a2711520299a1ade568
Gerrit-Change-Number: 30193
Gerrit-PatchSet: 2
Gerrit-Owner: laforge <[email protected]>
Gerrit-Reviewer: Hoernchen <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: tsaitgaist <[email protected]>
Gerrit-MessageType: merged

Reply via email to