From 00a467e86df8369f2227e4a19eaf4304719e6657 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Thu, 21 Jan 2021 17:51:51 +0100 Subject: [PATCH 1/2] cpu/sam0_common: SPI: allow to only configure MOSI/CLK Some slave devices (e.g. LED strips) don't have a back-channel and will only need MOSI and CLK. --- cpu/sam0_common/periph/spi.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cpu/sam0_common/periph/spi.c b/cpu/sam0_common/periph/spi.c index 7cf29e46a5..9832763015 100644 --- a/cpu/sam0_common/periph/spi.c +++ b/cpu/sam0_common/periph/spi.c @@ -350,11 +350,15 @@ void spi_init(spi_t bus) void spi_init_pins(spi_t bus) { /* MISO must always have PD/PU, see #5968. This is a ~65uA difference */ - gpio_init(spi_config[bus].miso_pin, GPIO_IN_PD); + if (gpio_is_valid(spi_config[bus].miso_pin)) { + gpio_init(spi_config[bus].miso_pin, GPIO_IN_PD); + gpio_init_mux(spi_config[bus].miso_pin, spi_config[bus].miso_mux); + } + gpio_init(spi_config[bus].mosi_pin, GPIO_OUT); - gpio_init(spi_config[bus].clk_pin, GPIO_OUT); - gpio_init_mux(spi_config[bus].miso_pin, spi_config[bus].miso_mux); gpio_init_mux(spi_config[bus].mosi_pin, spi_config[bus].mosi_mux); + + gpio_init(spi_config[bus].clk_pin, GPIO_OUT); /* clk_pin will be muxed during acquire / release */ mutex_unlock(&locks[bus]); @@ -364,7 +368,9 @@ void spi_deinit_pins(spi_t bus) { mutex_lock(&locks[bus]); - gpio_disable_mux(spi_config[bus].miso_pin); + if (gpio_is_valid(spi_config[bus].miso_pin)) { + gpio_disable_mux(spi_config[bus].miso_pin); + } gpio_disable_mux(spi_config[bus].mosi_pin); } From 31bf0c5257308b39bdb2346262d4c4f6f3418820 Mon Sep 17 00:00:00 2001 From: Benjamin Valentin Date: Sun, 24 Jan 2021 16:31:38 +0100 Subject: [PATCH 2/2] cpu/sam0_common: SPI: only mux MISO on spi_acquire() --- cpu/sam0_common/periph/spi.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cpu/sam0_common/periph/spi.c b/cpu/sam0_common/periph/spi.c index 9832763015..52158da6b0 100644 --- a/cpu/sam0_common/periph/spi.c +++ b/cpu/sam0_common/periph/spi.c @@ -356,11 +356,9 @@ void spi_init_pins(spi_t bus) } gpio_init(spi_config[bus].mosi_pin, GPIO_OUT); - gpio_init_mux(spi_config[bus].mosi_pin, spi_config[bus].mosi_mux); - gpio_init(spi_config[bus].clk_pin, GPIO_OUT); - /* clk_pin will be muxed during acquire / release */ + /* mosi_pin, clk_pin will be muxed during acquire / release */ mutex_unlock(&locks[bus]); } @@ -371,7 +369,6 @@ void spi_deinit_pins(spi_t bus) if (gpio_is_valid(spi_config[bus].miso_pin)) { gpio_disable_mux(spi_config[bus].miso_pin); } - gpio_disable_mux(spi_config[bus].mosi_pin); } int spi_acquire(spi_t bus, spi_cs_t cs, spi_mode_t mode, spi_clk_t clk) @@ -391,6 +388,7 @@ int spi_acquire(spi_t bus, spi_cs_t cs, spi_mode_t mode, spi_clk_t clk) } /* mux clk_pin to SPI peripheral */ + gpio_init_mux(spi_config[bus].mosi_pin, spi_config[bus].mosi_mux); gpio_init_mux(spi_config[bus].clk_pin, spi_config[bus].clk_mux); return SPI_OK; @@ -398,9 +396,11 @@ int spi_acquire(spi_t bus, spi_cs_t cs, spi_mode_t mode, spi_clk_t clk) void spi_release(spi_t bus) { - /* Demux clk_pin back to GPIO_OUT function. Otherwise it will get HIGH-Z - * and lead to unexpected current draw by SPI salves. */ + /* Demux clk_pin and mosi_pin back to GPIO_OUT function. + * Otherwise it will get HIGH-Z and lead to unexpected current draw by SPI salves. + */ gpio_disable_mux(spi_config[bus].clk_pin); + gpio_disable_mux(spi_config[bus].mosi_pin); if (_is_qspi(bus)) { _qspi_release();