Skip to content

Commit 6773f33

Browse files
Terezventhenrikbrixandersen
authored andcommitted
drivers: spi: gecko: add new driver for SPI communication via EUSART
Added a new driver to support SPI communication via EUSART. Since the Silabs EFR32MG24 family SoCs have only one USART, EUSART support is necessary for implementing SPI functionality. Signed-off-by: Teresa Zepeda Ventura <[email protected]>
1 parent 3359459 commit 6773f33

File tree

10 files changed

+419
-5
lines changed

10 files changed

+419
-5
lines changed

drivers/pinctrl/pinctrl_gecko.c

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
2424
(void)base;
2525
#endif /*USART_COUNT > 1*/
2626

27+
#ifdef CONFIG_SPI_GECKO_EUSART
28+
EUSART_TypeDef *ebase = (EUSART_TypeDef *)reg;
29+
int eusart_num = EUSART_NUM(ebase);
30+
#endif
31+
2732
#endif
2833

2934
#ifdef CONFIG_I2C_GECKO
@@ -171,7 +176,53 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
171176
#endif /* CONFIG_SOC_FAMILY_SILABS_S1 */
172177
#endif /* CONFIG_UART_GECKO */
173178

174-
#ifdef CONFIG_SPI_GECKO
179+
#ifdef CONFIG_SPI_GECKO_EUSART
180+
case GECKO_FUN_SPI_SCK:
181+
pin_config.mode = gpioModePushPull;
182+
pin_config.out = 1;
183+
GPIO->EUSARTROUTE[eusart_num].SCLKROUTE =
184+
(pin_config.port << _GPIO_EUSART_SCLKROUTE_PORT_SHIFT) |
185+
(pin_config.pin << _GPIO_EUSART_SCLKROUTE_PIN_SHIFT);
186+
GPIO->EUSARTROUTE[eusart_num].ROUTEEN |= GPIO_EUSART_ROUTEEN_SCLKPEN;
187+
GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
188+
pin_config.out);
189+
break;
190+
191+
case GECKO_FUN_SPI_CSN:
192+
pin_config.mode = gpioModePushPull;
193+
pin_config.out = 1;
194+
GPIO->EUSARTROUTE[eusart_num].CSROUTE =
195+
(pin_config.port << _GPIO_EUSART_CSROUTE_PORT_SHIFT) |
196+
(pin_config.pin << _GPIO_EUSART_CSROUTE_PIN_SHIFT);
197+
GPIO->EUSARTROUTE[eusart_num].ROUTEEN |= GPIO_EUSART_ROUTEEN_CSPEN;
198+
GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
199+
pin_config.out);
200+
break;
201+
202+
case GECKO_FUN_SPI_MOSI:
203+
pin_config.mode = gpioModePushPull;
204+
pin_config.out = 1;
205+
GPIO->EUSARTROUTE[eusart_num].TXROUTE =
206+
(pin_config.port << _GPIO_EUSART_TXROUTE_PORT_SHIFT) |
207+
(pin_config.pin << _GPIO_EUSART_TXROUTE_PIN_SHIFT);
208+
GPIO->EUSARTROUTE[eusart_num].ROUTEEN |= GPIO_EUSART_ROUTEEN_TXPEN;
209+
GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
210+
pin_config.out);
211+
break;
212+
213+
case GECKO_FUN_SPI_MISO:
214+
pin_config.mode = gpioModeInput;
215+
pin_config.out = 1;
216+
GPIO->EUSARTROUTE[eusart_num].RXROUTE =
217+
(pin_config.port << _GPIO_EUSART_RXROUTE_PORT_SHIFT) |
218+
(pin_config.pin << _GPIO_EUSART_RXROUTE_PIN_SHIFT);
219+
GPIO->EUSARTROUTE[EUSART_NUM(EUSART1)].ROUTEEN |= GPIO_EUSART_ROUTEEN_RXPEN;
220+
GPIO_PinModeSet(pin_config.port, pin_config.pin, pin_config.mode,
221+
pin_config.out);
222+
break;
223+
#endif /*CONFIG_SPI_GECKO_EUSART*/
224+
225+
#ifdef CONFIG_SPI_GECKO_USART
175226
#ifdef CONFIG_SOC_FAMILY_SILABS_S1
176227
case GECKO_FUN_SPIM_SCK:
177228
pin_config.mode = gpioModePushPull;
@@ -287,7 +338,7 @@ int pinctrl_configure_pins(const pinctrl_soc_pin_t *pins, uint8_t pin_cnt, uintp
287338
pin_config.out);
288339
break;
289340
#endif /* CONFIG_SOC_FAMILY_SILABS_S1 */
290-
#endif /* CONFIG_SPI_GECKO */
341+
#endif /* CONFIG_SPI_GECKO_USART */
291342

292343
#ifdef CONFIG_I2C_GECKO
293344
case GECKO_FUN_I2C_SDA:

drivers/spi/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ zephyr_library_sources_ifdef(CONFIG_SPI_LITEX spi_litex.c)
2828
zephyr_library_sources_ifdef(CONFIG_SPI_LITEX_LITESPI spi_litex_litespi.c)
2929
zephyr_library_sources_ifdef(CONFIG_SPI_OC_SIMPLE spi_oc_simple.c)
3030
zephyr_library_sources_ifdef(CONFIG_SPI_XEC_QMSPI spi_xec_qmspi.c)
31-
zephyr_library_sources_ifdef(CONFIG_SPI_GECKO spi_gecko.c)
31+
zephyr_library_sources_ifdef(CONFIG_SPI_GECKO_USART spi_gecko_usart.c)
32+
zephyr_library_sources_ifdef(CONFIG_SPI_GECKO_EUSART spi_gecko_eusart.c)
3233
zephyr_library_sources_ifdef(CONFIG_SPI_XLNX_AXI_QUADSPI spi_xlnx_axi_quadspi.c)
3334
zephyr_library_sources_ifdef(CONFIG_ESP32_SPIM spi_esp32_spim.c)
3435
zephyr_library_sources_ifdef(CONFIG_SPI_TEST spi_test.c)

drivers/spi/Kconfig

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ source "drivers/spi/Kconfig.oc_simple"
111111

112112
source "drivers/spi/Kconfig.xec_qmspi"
113113

114-
source "drivers/spi/Kconfig.gecko"
114+
source "drivers/spi/Kconfig.gecko_usart"
115+
116+
source "drivers/spi/Kconfig.gecko_eusart"
115117

116118
source "drivers/spi/Kconfig.xlnx"
117119

drivers/spi/Kconfig.gecko_eusart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Gecko SPI configuration option
2+
3+
# Copyright (c) 2024 Daikin Comfort Technologies North America, Inc.
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
config SPI_GECKO_EUSART
7+
bool "Gecko EUSART SPI controller driver"
8+
default y
9+
depends on DT_HAS_SILABS_GECKO_SPI_EUSART_ENABLED
10+
depends on GPIO
11+
select SOC_GECKO_EUSART
12+
help
13+
Enable the EUSART SPI peripherals on Gecko

drivers/spi/Kconfig.gecko renamed to drivers/spi/Kconfig.gecko_usart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Copyright (c) 2019 Christian Taedcke <[email protected]>
44
# SPDX-License-Identifier: Apache-2.0
55

6-
config SPI_GECKO
6+
config SPI_GECKO_USART
77
bool "Gecko SPI controller driver"
88
default y
99
depends on DT_HAS_SILABS_GECKO_SPI_USART_ENABLED

0 commit comments

Comments
 (0)