Skip to content

Commit 13622a3

Browse files
[Silabs] Added fixes for hardfault issue with rs9116 when LCD enabled and 917 NCP-LCD enablement (project-chip#32209)
* Added fixes for hardfault issue with rs9116 when LCD enabled * resolved build errors with mg12 * Pull request project-chip#1552: [MATTER-2763]wifi-917NCP_enabling LCD Merge in WMN_TOOLS/matter from feature/wifi_917ncp_lcd to RC_2.3.0-1.3 Squashed commit of the following: commit 136a77e165aefb649a8187c5177319e13af0f21a Author: bhmanda-silabs <bhavani.manda@silabs.com> Date: Fri Feb 9 22:50:30 2024 +0530 Resolved review comments commit 4c2f020a346c3e6e3c12fb72fc4d8691ed12aaec Author: bhmanda-silabs <bhavani.manda@silabs.com> Date: Thu Feb 8 19:36:25 2024 +0530 removed commented code commit a67ada4d9d56dea11e627887e6ee4d431bae22ad Author: bhmanda-silabs <bhavani.manda@silabs.com> Date: Thu Feb 8 19:29:54 2024 +0530 Removed special characters ... and 3 more commits * resolved review comments * Resolved review comments * Resolved comments and removed ununsed macros * removed semaphore in header file as it is not being used in this file * resolved the comments * Restyled
1 parent 355e2b4 commit 13622a3

File tree

6 files changed

+107
-161
lines changed

6 files changed

+107
-161
lines changed

examples/platform/silabs/display/demo-ui.c

+11-5
Original file line numberDiff line numberDiff line change
@@ -103,18 +103,24 @@ void demoUIInit(GLIB_Context_t * context)
103103

104104
sl_status_t updateDisplay(void)
105105
{
106+
sl_status_t status = SL_STATUS_OK;
106107
#if SIWX_917 && SL_ICD_ENABLED && DISPLAY_ENABLED
107108
sl_memlcd_post_wakeup_init();
108109
#endif // SIWX_917 && SL_ICD_ENABLED && DISPLAY_ENABLED
109110
#if SL_LCDCTRL_MUX
110-
sl_wfx_host_pre_lcd_spi_transfer();
111-
#endif // SL_LCDCTRL_MUX
112-
sl_status_t status = DMD_updateDisplay();
113-
#if SL_LCDCTRL_MUX
114-
sl_wfx_host_post_lcd_spi_transfer();
111+
status = sl_wfx_host_pre_lcd_spi_transfer();
112+
if (status != SL_STATUS_OK)
113+
return status;
115114
#endif // SL_LCDCTRL_MUX
115+
status = DMD_updateDisplay();
116116
if (status != DMD_OK)
117117
return SL_STATUS_FAIL;
118+
#if SL_LCDCTRL_MUX
119+
status = sl_wfx_host_post_lcd_spi_transfer();
120+
if (status != SL_STATUS_OK)
121+
return status;
122+
#endif // SL_LCDCTRL_MUX
123+
118124
return SL_STATUS_OK;
119125
}
120126

examples/platform/silabs/efr32/rs911x/hal/efx32_ncp_host.c

+18-8
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,14 @@
3636
#include "sl_power_manager.h"
3737
#endif
3838

39-
#define USART_INITSYNC_BAUDRATE 12500000
39+
#include "sl_board_control.h"
40+
#include "sl_si91x_ncp_utility.h"
41+
#include "spi_multiplex.h"
4042

4143
static bool dma_callback(unsigned int channel, unsigned int sequenceNo, void * userParam);
4244

43-
unsigned int rx_ldma_channel;
44-
unsigned int tx_ldma_channel;
45+
uint32_t rx_ldma_channel;
46+
uint32_t tx_ldma_channel;
4547
osMutexId_t ncp_transfer_mutex = 0;
4648

4749
static uint32_t dummy_buffer;
@@ -81,7 +83,7 @@ static void efx32_spi_init(void)
8183
USART_InitSync_TypeDef init = USART_INITSYNC_DEFAULT;
8284

8385
init.msbf = true; // MSB first transmission for SPI compatibility
84-
init.autoCsEnable = true; // Allow the USART to assert CS
86+
init.autoCsEnable = false;
8587
init.baudrate = USART_INITSYNC_BAUDRATE;
8688

8789
// Configure SPI bus pins
@@ -109,15 +111,15 @@ static void efx32_spi_init(void)
109111
// Enable USART interface pins
110112
GPIO->USARTROUTE[SPI_USART_ROUTE_INDEX].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | // MISO
111113
GPIO_USART_ROUTEEN_TXPEN | // MOSI
112-
GPIO_USART_ROUTEEN_CLKPEN | GPIO_USART_ROUTEEN_CSPEN;
114+
GPIO_USART_ROUTEEN_CLKPEN;
113115

114116
// Set slew rate for alternate usage pins
115117
GPIO_SlewrateSet(SPI_CLOCK_PIN.port, 7, 7);
116118

117119
// Configure and enable USART
118120
USART_InitSync(SPI_USART, &init);
119121

120-
SPI_USART->TIMING |= /*USART_TIMING_TXDELAY_ONE | USART_TIMING_CSSETUP_ONE |*/ USART_TIMING_CSHOLD_ONE;
122+
SPI_USART->TIMING |= USART_TIMING_TXDELAY_ONE | USART_TIMING_CSSETUP_ONE | USART_TIMING_CSHOLD_ONE;
121123

122124
// SPI_USART->CTRL_SET |= USART_CTRL_SMSDELAY;
123125

@@ -145,6 +147,14 @@ uint32_t sl_si91x_host_get_wake_indicator(void)
145147

146148
sl_status_t sl_si91x_host_init(sl_si91x_host_init_configuration * config)
147149
{
150+
#if SL_SPICTRL_MUX
151+
sl_status_t status = sl_board_disable_display();
152+
if (SL_STATUS_OK != status)
153+
{
154+
SILABS_LOG("sl_board_disable_display failed with error: %x", status);
155+
return status;
156+
}
157+
#endif // SL_SPICTRL_MUX
148158
init_config.rx_irq = config->rx_irq;
149159
init_config.rx_done = config->rx_done;
150160

@@ -175,8 +185,8 @@ sl_status_t sl_si91x_host_init(sl_si91x_host_init_configuration * config)
175185
GPIO_PinModeSet(WAKE_INDICATOR_PIN.port, WAKE_INDICATOR_PIN.pin, gpioModeWiredOrPullDown, 0);
176186

177187
DMADRV_Init();
178-
DMADRV_AllocateChannel(&rx_ldma_channel, NULL);
179-
DMADRV_AllocateChannel(&tx_ldma_channel, NULL);
188+
DMADRV_AllocateChannel((unsigned int *) &rx_ldma_channel, NULL);
189+
DMADRV_AllocateChannel((unsigned int *) &tx_ldma_channel, NULL);
180190

181191
return SL_STATUS_OK;
182192
}

examples/platform/silabs/efr32/rs911x/hal/efx_spi.c

+34-61
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,18 @@
3535
#include "em_gpio.h"
3636
#include "em_ldma.h"
3737
#include "gpiointerrupt.h"
38-
#include "spidrv.h"
39-
38+
#include "sl_board_control.h"
4039
#include "sl_device_init_clocks.h"
4140
#include "sl_device_init_hfxo.h"
4241
#include "sl_spidrv_instances.h"
4342
#include "sl_status.h"
43+
#include "spidrv.h"
4444

4545
#include "silabs_utils.h"
4646
#include "spi_multiplex.h"
4747
#include "wfx_host_events.h"
4848
#include "wfx_rsi.h"
4949

50-
#define DEFAULT_SPI_TRASFER_MODE 0
51-
// Macro to drive semaphore block minimun timer in milli seconds
52-
#define RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS (50)
5350
#if defined(SL_CATALOG_POWER_MANAGER_PRESENT)
5451
#include "sl_power_manager.h"
5552
#endif
@@ -62,29 +59,33 @@
6259
#endif // SL_BTLCTRL_MUX
6360
#if SL_LCDCTRL_MUX
6461
#include "sl_memlcd.h"
62+
#include "sl_memlcd_display.h"
6563
#endif // SL_LCDCTRL_MUX
6664
#if SL_MX25CTRL_MUX
6765
#include "sl_mx25_flash_shutdown_usart_config.h"
6866
#endif // SL_MX25CTRL_MUX
6967

7068
#if defined(EFR32MG12)
7169
#include "em_usart.h"
72-
70+
#include "sl_spidrv_exp_config.h"
7371
#define SL_SPIDRV_HANDLE sl_spidrv_exp_handle
74-
7572
#elif defined(EFR32MG24)
7673
#include "em_eusart.h"
7774
#include "sl_spidrv_eusart_exp_config.h"
75+
#include "spi_multiplex.h"
76+
#else
77+
#error "Unknown platform"
78+
#endif
7879

80+
#if defined(EFR32MG24)
7981
#define SL_SPIDRV_HANDLE sl_spidrv_eusart_exp_handle
8082
#define SL_SPIDRV_EXP_BITRATE_MULTIPLEXED SL_SPIDRV_EUSART_EXP_BITRATE
81-
#define SL_SPIDRV_UART_CONSOLE_BITRATE SL_UARTDRV_EUSART_VCOM_BAUDRATE
82-
#define SL_SPIDRV_FRAME_LENGTH SL_SPIDRV_EUSART_EXP_FRAME_LENGTH
83-
84-
#endif // EFR32MG12 || EFR32MG24
83+
#endif
8584

8685
#define CONCAT(A, B) (A##B)
8786
#define SPI_CLOCK(N) CONCAT(cmuClock_USART, N)
87+
// Macro to drive semaphore block minimun timer in milli seconds
88+
#define RSI_SEM_BLOCK_MIN_TIMER_VALUE_MS (50)
8889

8990
#if SL_SPICTRL_MUX
9091
StaticSemaphore_t spi_sem_peripheral;
@@ -97,16 +98,6 @@ static TaskHandle_t spiInitiatorTaskHandle = NULL;
9798

9899
static uint32_t dummy_buffer; /* Used for DMA - when results don't matter */
99100

100-
#if defined(EFR32MG12)
101-
#include "sl_spidrv_exp_config.h"
102-
extern SPIDRV_Handle_t sl_spidrv_exp_handle;
103-
#define SL_SPIDRV_HANDLE sl_spidrv_exp_handle
104-
#elif defined(EFR32MG24)
105-
#include "spi_multiplex.h"
106-
#else
107-
#error "Unknown platform"
108-
#endif
109-
110101
// variable to identify spi configured for expansion header
111102
// EUSART configuration available on the SPIDRV
112103
static bool spi_enabled = false;
@@ -129,7 +120,7 @@ void sl_wfx_host_gpio_init(void)
129120
#if defined(EFR32MG24)
130121
// Set CS pin to high/inactive
131122
GPIO_PinModeSet(SL_SPIDRV_EUSART_EXP_CS_PORT, SL_SPIDRV_EUSART_EXP_CS_PIN, gpioModePushPull, PINOUT_SET);
132-
#endif
123+
#endif // EFR32MG24
133124

134125
GPIO_PinModeSet(WFX_RESET_PIN.port, WFX_RESET_PIN.pin, gpioModePushPull, PINOUT_SET);
135126
GPIO_PinModeSet(WFX_SLEEP_CONFIRM_PIN.port, WFX_SLEEP_CONFIRM_PIN.pin, gpioModePushPull, PINOUT_CLEAR);
@@ -171,8 +162,6 @@ void sl_wfx_host_reset_chip(void)
171162
vTaskDelay(pdMS_TO_TICKS(3));
172163
}
173164

174-
void gpio_interrupt([[maybe_unused]] uint8_t interrupt_number) {}
175-
176165
/*****************************************************************
177166
* @fn void rsi_hal_board_init(void)
178167
* @brief
@@ -201,26 +190,12 @@ void rsi_hal_board_init(void)
201190
sl_wfx_host_reset_chip();
202191
}
203192

204-
void sl_si91x_host_enable_high_speed_bus()
205-
{
206-
// dummy function for wifi-sdk
207-
}
208-
209193
#if SL_SPICTRL_MUX
210-
void SPIDRV_SetBaudrate(uint32_t baudrate)
211-
{
212-
if (EUSART_BaudrateGet(MY_USART) == baudrate)
213-
{
214-
// EUSART synced to baudrate already
215-
return;
216-
}
217-
EUSART_BaudrateSet(MY_USART, 0, baudrate);
218-
}
219-
220194
sl_status_t sl_wfx_host_spi_cs_assert(void)
221195
{
196+
#if SL_SPICTRL_MUX
222197
xSemaphoreTake(spi_sem_sync_hdl, portMAX_DELAY);
223-
198+
#endif // SL_SPICTRL_MUX
224199
if (!spi_enabled) // Reduce sl_spidrv_init_instances
225200
{
226201
sl_spidrv_init_instances();
@@ -234,22 +209,23 @@ sl_status_t sl_wfx_host_spi_cs_assert(void)
234209

235210
sl_status_t sl_wfx_host_spi_cs_deassert(void)
236211
{
212+
sl_status_t status = SL_STATUS_OK;
237213
if (spi_enabled)
238214
{
239-
if (ECODE_EMDRV_SPIDRV_OK != SPIDRV_DeInit(SL_SPIDRV_HANDLE))
215+
status = SPIDRV_DeInit(SL_SPIDRV_HANDLE);
216+
if (SL_STATUS_OK == status)
240217
{
241-
xSemaphoreGive(spi_sem_sync_hdl);
242-
SILABS_LOG("%s error.", __func__);
243-
return SL_STATUS_FAIL;
244-
}
245218
#if defined(EFR32MG24)
246-
GPIO_PinOutSet(SL_SPIDRV_EUSART_EXP_CS_PORT, SL_SPIDRV_EUSART_EXP_CS_PIN);
247-
GPIO->EUSARTROUTE[SL_SPIDRV_EUSART_EXP_PERIPHERAL_NO].ROUTEEN = PINOUT_CLEAR;
219+
GPIO_PinOutSet(SL_SPIDRV_EUSART_EXP_CS_PORT, SL_SPIDRV_EUSART_EXP_CS_PIN);
220+
GPIO->EUSARTROUTE[SL_SPIDRV_EUSART_EXP_PERIPHERAL_NO].ROUTEEN = PINOUT_CLEAR;
248221
#endif // EFR32MG24
249-
spi_enabled = false;
222+
spi_enabled = false;
223+
}
250224
}
225+
#if SL_SPICTRL_MUX
251226
xSemaphoreGive(spi_sem_sync_hdl);
252-
return SL_STATUS_OK;
227+
#endif // SL_SPICTRL_MUX
228+
return status;
253229
}
254230
#endif // SL_SPICTRL_MUX
255231

@@ -320,33 +296,30 @@ sl_status_t sl_wfx_host_post_bootloader_spi_transfer(void)
320296
sl_status_t sl_wfx_host_pre_lcd_spi_transfer(void)
321297
{
322298
#if SL_SPICTRL_MUX
323-
if (sl_wfx_host_spi_cs_deassert() != SL_STATUS_OK)
324-
{
325-
return SL_STATUS_FAIL;
326-
}
327299
xSemaphoreTake(spi_sem_sync_hdl, portMAX_DELAY);
328300
#endif // SL_SPICTRL_MUX
329-
// sl_memlcd_refresh takes care of SPIDRV_Init()
330-
if (SL_STATUS_OK != sl_memlcd_refresh(sl_memlcd_get()))
301+
sl_status_t status = sl_board_enable_display();
302+
if (SL_STATUS_OK == status)
331303
{
304+
// sl_memlcd_refresh takes care of SPIDRV_Init()
305+
status = sl_memlcd_refresh(sl_memlcd_get());
306+
}
332307
#if SL_SPICTRL_MUX
333-
xSemaphoreGive(spi_sem_sync_hdl);
308+
xSemaphoreGive(spi_sem_sync_hdl);
334309
#endif // SL_SPICTRL_MUX
335-
SILABS_LOG("%s error.", __func__);
336-
return SL_STATUS_FAIL;
337-
}
338-
return SL_STATUS_OK;
310+
return status;
339311
}
340312

341313
sl_status_t sl_wfx_host_post_lcd_spi_transfer(void)
342314
{
343315
USART_Enable(SL_MEMLCD_SPI_PERIPHERAL, usartDisable);
344316
CMU_ClockEnable(SPI_CLOCK(SL_MEMLCD_SPI_PERIPHERAL_NO), false);
345317
GPIO->USARTROUTE[SL_MEMLCD_SPI_PERIPHERAL_NO].ROUTEEN = PINOUT_CLEAR;
318+
sl_status_t status = sl_board_disable_display();
346319
#if SL_SPICTRL_MUX
347320
xSemaphoreGive(spi_sem_sync_hdl);
348321
#endif // SL_SPICTRL_MUX
349-
return SL_STATUS_OK;
322+
return status;
350323
}
351324
#endif // SL_LCDCTRL_MUX
352325

0 commit comments

Comments
 (0)