Skip to content

Commit 222338e

Browse files
jmartinez-silabsandy31415restyled-commits
authored
[Silabs] Fix some uart cli hang (project-chip#35723)
* Add macros to abstact eusart api between series * Fix for uart cpp with irq handling with series3. Tweak uart and shell task priority. * [MATTER-4132]force implementation of _read and _write from newlib to use our UartConsole api when SILABS_LOG_OUT_UART is enabled * remove segger_rtt_syscalls when uartlog is enabled * Apply suggestions from code review Co-authored-by: Andrei Litvin <andy314@gmail.com> * Restyled by gn --------- Co-authored-by: Andrei Litvin <andy314@gmail.com> Co-authored-by: Restyled.io <commits@restyled.io>
1 parent e527611 commit 222338e

File tree

5 files changed

+103
-26
lines changed

5 files changed

+103
-26
lines changed

examples/platform/silabs/syscalls_stubs.cpp

+34-8
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,31 @@ extern "C" {
3838
#include "uart.h"
3939
#endif
4040

41+
int _open(char * path, int flags, ...);
4142
int _close(int file);
4243
int _fstat(int file, struct stat * st);
4344
int _isatty(int file);
4445
int _lseek(int file, int ptr, int dir);
4546
int _read(int file, char * ptr, int len);
4647
int _write(int file, const char * ptr, int len);
4748

49+
/**************************************************************************
50+
* @brief
51+
* Open a file.
52+
*
53+
* @param[in] file
54+
* File you want to open.
55+
*
56+
* @return
57+
* Returns -1 since there is not logic here to open file.
58+
**************************************************************************/
59+
60+
int __attribute__((weak)) _open(char * path, int flags, ...)
61+
{
62+
/* Pretend like we always fail */
63+
return -1;
64+
}
65+
4866
/**************************************************************************
4967
* @brief
5068
* Close a file.
@@ -170,17 +188,22 @@ int __attribute__((weak)) _lseek(int file, int ptr, int dir)
170188
* @return
171189
* Number of characters that have been read.
172190
*************************************************************************/
173-
int __attribute__((weak)) _read(int file, char * ptr, int len)
191+
#if SILABS_LOG_OUT_UART
192+
int _read(int file, char * ptr, int len)
174193
{
175194
(void) file;
176-
#if SILABS_LOG_OUT_UART
177195
return uartConsoleRead(ptr, len);
196+
}
178197
#else
198+
int __attribute__((weak)) _read(int file, char * ptr, int len)
199+
{
200+
(void) file;
179201
(void) ptr;
180202
(void) len;
181-
#endif
203+
182204
return 0;
183205
}
206+
#endif // SILABS_LOG_OUT_UART
184207

185208
/**************************************************************************
186209
* @brief
@@ -198,17 +221,20 @@ int __attribute__((weak)) _read(int file, char * ptr, int len)
198221
* @return
199222
* Number of characters that have been written.
200223
**************************************************************************/
201-
int __attribute__((weak)) _write(int file, const char * ptr, int len)
224+
#if SILABS_LOG_OUT_UART
225+
int _write(int file, const char * ptr, int len)
202226
{
203227
(void) file;
204-
#if SILABS_LOG_OUT_UART
205-
uartConsoleWrite(ptr, len);
228+
return uartConsoleWrite(ptr, len);
229+
}
206230
#else
231+
int __attribute__((weak)) _write(int file, const char * ptr, int len)
232+
{
233+
(void) file;
207234
(void) ptr;
208-
#endif
209-
210235
return len;
211236
}
237+
#endif // SILABS_LOG_OUT_UART
212238

213239
#ifdef __cplusplus
214240
}

examples/platform/silabs/uart.cpp

+53-15
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,12 @@ extern "C" {
4040
#include "rsi_rom_egpio.h"
4141
#include "sl_si91x_usart.h"
4242
#else // For EFR32
43+
#if (_SILICON_LABS_32B_SERIES < 3)
4344
#include "em_core.h"
4445
#include "em_usart.h"
46+
#else
47+
#include "sl_hal_eusart.h"
48+
#endif //_SILICON_LABS_32B_SERIES
4549
#include "uartdrv.h"
4650
#ifdef SL_BOARD_NAME
4751
#include "sl_board_control.h"
@@ -86,11 +90,34 @@ extern "C" {
8690
#define USART_IRQ HELPER2(SL_UARTDRV_EUSART_VCOM_PERIPHERAL_NO)
8791
#define USART_IRQHandler HELPER4(SL_UARTDRV_EUSART_VCOM_PERIPHERAL_NO)
8892
#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+
89116
#else
90117
#define USART_IRQ HELPER2(SL_UARTDRV_USART_VCOM_PERIPHERAL_NO)
91118
#define USART_IRQHandler HELPER4(SL_UARTDRV_USART_VCOM_PERIPHERAL_NO)
92119
#define vcom_handle sl_uartdrv_usart_vcom_handle
93-
#endif // EFR32MG24
120+
#endif // SL_CATALOG_UARTDRV_EUSART_PRESENT
94121

95122
namespace {
96123
// In order to reduce the probability of data loss during the dmaFull callback handler we use
@@ -118,7 +145,11 @@ typedef struct
118145
#if SILABS_LOG_OUT_UART
119146
#define UART_MAX_QUEUE_SIZE 125
120147
#else
148+
#if (_SILICON_LABS_32B_SERIES < 3)
121149
#define UART_MAX_QUEUE_SIZE 25
150+
#else
151+
#define UART_MAX_QUEUE_SIZE 50
152+
#endif
122153
#endif
123154

124155
#ifdef CHIP_CONFIG_LOG_MESSAGE_MAX_SIZE
@@ -138,13 +169,7 @@ constexpr osThreadAttr_t kUartTaskAttr = { .name = "UART",
138169
.cb_size = osThreadCbSize,
139170
.stack_mem = uartStack,
140171
.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 };
148173

149174
typedef struct
150175
{
@@ -309,16 +334,17 @@ void uartConsoleInit(void)
309334

310335
#ifdef SL_CATALOG_UARTDRV_EUSART_PRESENT
311336
// 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);
313339

314340
// 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);
316342

317343
// Enable EUSART
318-
EUSART_Enable(SL_UARTDRV_EUSART_VCOM_PERIPHERAL, eusartEnable);
344+
EUSART_ENABLE(SL_UARTDRV_EUSART_VCOM_PERIPHERAL);
319345
#else
320346
USART_IntEnable(SL_UARTDRV_USART_VCOM_PERIPHERAL, USART_IF_RXDATAV);
321-
#endif // EFR32MG24
347+
#endif // SL_CATALOG_UARTDRV_EUSART_PRESENT
322348
#endif // SLI_SI91X_MCU_INTERFACE == 0
323349
}
324350

@@ -344,9 +370,15 @@ void USART_IRQHandler(void)
344370
#elif !defined(PW_RPC_ENABLED) && !defined(SL_WIFI)
345371
otSysEventSignalPending();
346372
#endif
347-
348373
#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+
}
350382
#endif
351383
}
352384

@@ -418,7 +450,8 @@ int16_t uartConsoleWrite(const char * Buf, uint16_t BufLength)
418450
memcpy(workBuffer.data, Buf, BufLength);
419451
workBuffer.length = BufLength;
420452

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)
422455
{
423456
return BufLength;
424457
}
@@ -445,6 +478,7 @@ int16_t uartLogWrite(const char * log, uint16_t length)
445478
memcpy(workBuffer.data + length, "\r\n", 2);
446479
workBuffer.length = length + 2;
447480

481+
// Don't wait when queue is full. Drop the log and return UART_CONSOLE_ERR
448482
if (osMessageQueuePut(sUartTxQueue, &workBuffer, osPriorityNormal, 0) == osOK)
449483
{
450484
return length;
@@ -462,6 +496,10 @@ int16_t uartConsoleRead(char * Buf, uint16_t NbBytesToRead)
462496
{
463497
uint8_t * data;
464498

499+
#ifdef SL_CATALOG_UARTDRV_EUSART_PRESENT
500+
EUSART_INT_ENABLE(SL_UARTDRV_EUSART_VCOM_PERIPHERAL, EUSART_IF_RXFL);
501+
#endif
502+
465503
if (Buf == NULL || NbBytesToRead < 1)
466504
{
467505
return UART_CONSOLE_ERR;

src/lib/shell/streamer_silabs.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,13 @@ ssize_t streamer_efr_read(streamer_t * streamer, char * buffer, size_t length)
4747
ssize_t streamer_efr_write(streamer_t * streamer, const char * buffer, size_t length)
4848
{
4949
(void) streamer;
50-
return uartConsoleWrite(buffer, (uint16_t) length);
50+
int16_t bytesWritten = uartConsoleWrite(buffer, (uint16_t) length);
51+
if (bytesWritten < 0) // The Write failed
52+
{
53+
bytesWritten = 0;
54+
}
55+
56+
return bytesWritten;
5157
}
5258

5359
static streamer_t streamer_efr = {

third_party/silabs/SiWx917_sdk.gni

+5-1
Original file line numberDiff line numberDiff line change
@@ -773,8 +773,12 @@ template("siwx917_sdk") {
773773
public_deps = [
774774
"${segger_rtt_root}:segger_rtt",
775775
"${segger_rtt_root}:segger_rtt_printf",
776-
"${segger_rtt_root}:segger_rtt_syscalls",
777776
]
777+
778+
if (!sl_uart_log_output) {
779+
public_deps += [ "${segger_rtt_root}:segger_rtt_syscalls" ]
780+
}
781+
778782
if (chip_crypto == "platform") {
779783
if (sl_si91x_crypto_flavor == "tinycrypt") {
780784
public_deps += [ ":siwx917_tinycrypt" ]

third_party/silabs/efr32_sdk.gni

+4-1
Original file line numberDiff line numberDiff line change
@@ -1072,9 +1072,12 @@ template("efr32_sdk") {
10721072
":efr32_mbedtls_config",
10731073
"${segger_rtt_root}:segger_rtt",
10741074
"${segger_rtt_root}:segger_rtt_printf",
1075-
"${segger_rtt_root}:segger_rtt_syscalls",
10761075
]
10771076

1077+
if (!sl_uart_log_output) {
1078+
public_deps += [ "${segger_rtt_root}:segger_rtt_syscalls" ]
1079+
}
1080+
10781081
if (defined(invoker.sources)) {
10791082
sources += invoker.sources
10801083
}

0 commit comments

Comments
 (0)