@@ -40,8 +40,12 @@ extern "C" {
40
40
#include " rsi_rom_egpio.h"
41
41
#include " sl_si91x_usart.h"
42
42
#else // For EFR32
43
+ #if (_SILICON_LABS_32B_SERIES < 3)
43
44
#include " em_core.h"
44
45
#include " em_usart.h"
46
+ #else
47
+ #include " sl_hal_eusart.h"
48
+ #endif // _SILICON_LABS_32B_SERIES
45
49
#include " uartdrv.h"
46
50
#ifdef SL_BOARD_NAME
47
51
#include " sl_board_control.h"
@@ -86,11 +90,34 @@ extern "C" {
86
90
#define USART_IRQ HELPER2 (SL_UARTDRV_EUSART_VCOM_PERIPHERAL_NO)
87
91
#define USART_IRQHandler HELPER4 (SL_UARTDRV_EUSART_VCOM_PERIPHERAL_NO)
88
92
#define vcom_handle sl_uartdrv_eusart_vcom_handle
93
+
94
+ #if (_SILICON_LABS_32B_SERIES < 3)
95
+ #define EUSART_INT_ENABLE EUSART_IntEnable
96
+ #define EUSART_INT_DISABLE EUSART_IntDisable
97
+ #define EUSART_INT_CLEAR EUSART_IntClear
98
+ #define EUSART_CLEAR_RX
99
+ #define EUSART_GET_PENDING_INT EUSART_IntGet
100
+ #define EUSART_ENABLE (eusart ) EUSART_Enable(eusart, eusartEnable)
101
+ #else
102
+ #define EUSART_INT_ENABLE sl_hal_eusart_enable_interrupts
103
+ #define EUSART_INT_DISABLE sl_hal_eusart_disable_interrupts
104
+ #define EUSART_INT_SET sl_hal_eusart_set_interrupts
105
+ #define EUSART_INT_CLEAR sl_hal_eusart_clear_interrupts
106
+ #define EUSART_CLEAR_RX sl_hal_eusart_clear_rx
107
+ #define EUSART_GET_PENDING_INT sl_hal_eusart_get_pending_interrupts
108
+ #define EUSART_ENABLE (eusart ) \
109
+ { \
110
+ sl_hal_eusart_enable (eusart); \
111
+ sl_hal_eusart_enable_tx (eusart); \
112
+ sl_hal_eusart_enable_rx (eusart); \
113
+ }
114
+ #endif // _SILICON_LABS_32B_SERIES
115
+
89
116
#else
90
117
#define USART_IRQ HELPER2 (SL_UARTDRV_USART_VCOM_PERIPHERAL_NO)
91
118
#define USART_IRQHandler HELPER4 (SL_UARTDRV_USART_VCOM_PERIPHERAL_NO)
92
119
#define vcom_handle sl_uartdrv_usart_vcom_handle
93
- #endif // EFR32MG24
120
+ #endif // SL_CATALOG_UARTDRV_EUSART_PRESENT
94
121
95
122
namespace {
96
123
// In order to reduce the probability of data loss during the dmaFull callback handler we use
@@ -118,7 +145,11 @@ typedef struct
118
145
#if SILABS_LOG_OUT_UART
119
146
#define UART_MAX_QUEUE_SIZE 125
120
147
#else
148
+ #if (_SILICON_LABS_32B_SERIES < 3)
121
149
#define UART_MAX_QUEUE_SIZE 25
150
+ #else
151
+ #define UART_MAX_QUEUE_SIZE 50
152
+ #endif
122
153
#endif
123
154
124
155
#ifdef CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE
@@ -138,13 +169,7 @@ constexpr osThreadAttr_t kUartTaskAttr = { .name = "UART",
138
169
.cb_size = osThreadCbSize,
139
170
.stack_mem = uartStack,
140
171
.stack_size = kUartTaskSize ,
141
- #if SLI_SI91X_MCU_INTERFACE
142
- // Reducing the priority of the UART task to avoid priority inversion
143
- .priority = osPriorityNormal
144
- #else
145
- .priority = osPriorityRealtime
146
- #endif // SLI_SI91X_MCU_INTERFACE
147
- };
172
+ .priority = osPriorityBelowNormal };
148
173
149
174
typedef struct
150
175
{
@@ -309,16 +334,17 @@ void uartConsoleInit(void)
309
334
310
335
#ifdef SL_CATALOG_UARTDRV_EUSART_PRESENT
311
336
// Clear previous RX interrupts
312
- EUSART_IntClear (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
337
+ EUSART_INT_CLEAR (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, (EUSART_IF_RXFL | EUSART_IF_RXOF));
338
+ EUSART_CLEAR_RX (SL_UARTDRV_EUSART_VCOM_PERIPHERAL);
313
339
314
340
// Enable RX interrupts
315
- EUSART_IntEnable (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
341
+ EUSART_INT_ENABLE (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
316
342
317
343
// Enable EUSART
318
- EUSART_Enable (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, eusartEnable );
344
+ EUSART_ENABLE (SL_UARTDRV_EUSART_VCOM_PERIPHERAL);
319
345
#else
320
346
USART_IntEnable (SL_UARTDRV_USART_VCOM_PERIPHERAL, USART_IF_RXDATAV);
321
- #endif // EFR32MG24
347
+ #endif // SL_CATALOG_UARTDRV_EUSART_PRESENT
322
348
#endif // SLI_SI91X_MCU_INTERFACE == 0
323
349
}
324
350
@@ -344,9 +370,15 @@ void USART_IRQHandler(void)
344
370
#elif !defined(PW_RPC_ENABLED) && !defined(SL_WIFI)
345
371
otSysEventSignalPending ();
346
372
#endif
347
-
348
373
#ifdef SL_CATALOG_UARTDRV_EUSART_PRESENT
349
- EUSART_IntClear (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
374
+ // disable RXFL IRQ until data read by uartConsoleRead
375
+ EUSART_INT_DISABLE (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
376
+ EUSART_INT_CLEAR (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
377
+
378
+ if (EUSART_GET_PENDING_INT (SL_UARTDRV_EUSART_VCOM_PERIPHERAL) & EUSART_IF_RXOF)
379
+ {
380
+ EUSART_CLEAR_RX (SL_UARTDRV_EUSART_VCOM_PERIPHERAL);
381
+ }
350
382
#endif
351
383
}
352
384
@@ -418,7 +450,8 @@ int16_t uartConsoleWrite(const char * Buf, uint16_t BufLength)
418
450
memcpy (workBuffer.data , Buf, BufLength);
419
451
workBuffer.length = BufLength;
420
452
421
- if (osMessageQueuePut (sUartTxQueue , &workBuffer, osPriorityNormal, 0 ) == osOK)
453
+ // this is usually a command response. Wait on queue if full.
454
+ if (osMessageQueuePut (sUartTxQueue , &workBuffer, osPriorityNormal, osWaitForever) == osOK)
422
455
{
423
456
return BufLength;
424
457
}
@@ -445,6 +478,7 @@ int16_t uartLogWrite(const char * log, uint16_t length)
445
478
memcpy (workBuffer.data + length, " \r\n " , 2 );
446
479
workBuffer.length = length + 2 ;
447
480
481
+ // Don't wait when queue is full. Drop the log and return UART_CONSOLE_ERR
448
482
if (osMessageQueuePut (sUartTxQueue , &workBuffer, osPriorityNormal, 0 ) == osOK)
449
483
{
450
484
return length;
@@ -462,6 +496,10 @@ int16_t uartConsoleRead(char * Buf, uint16_t NbBytesToRead)
462
496
{
463
497
uint8_t * data;
464
498
499
+ #ifdef SL_CATALOG_UARTDRV_EUSART_PRESENT
500
+ EUSART_INT_ENABLE (SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
501
+ #endif
502
+
465
503
if (Buf == NULL || NbBytesToRead < 1 )
466
504
{
467
505
return UART_CONSOLE_ERR;
0 commit comments