Merge pull request #15846 from benpicco/cpu/sam0_common-spi_fixes
cpu/sam0_common: SPI: MOSI only operation & fix for adafruit-itsybitsy-m4
This commit is contained in:
commit
1d0dbb4626
@ -350,13 +350,15 @@ void spi_init(spi_t bus)
|
|||||||
void spi_init_pins(spi_t bus)
|
void spi_init_pins(spi_t bus)
|
||||||
{
|
{
|
||||||
/* MISO must always have PD/PU, see #5968. This is a ~65uA difference */
|
/* MISO must always have PD/PU, see #5968. This is a ~65uA difference */
|
||||||
|
if (gpio_is_valid(spi_config[bus].miso_pin)) {
|
||||||
gpio_init(spi_config[bus].miso_pin, GPIO_IN_PD);
|
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].mosi_pin, GPIO_OUT);
|
||||||
gpio_init(spi_config[bus].clk_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);
|
|
||||||
/* clk_pin will be muxed during acquire / release */
|
|
||||||
|
|
||||||
|
/* mosi_pin, clk_pin will be muxed during acquire / release */
|
||||||
mutex_unlock(&locks[bus]);
|
mutex_unlock(&locks[bus]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -364,8 +366,9 @@ void spi_deinit_pins(spi_t bus)
|
|||||||
{
|
{
|
||||||
mutex_lock(&locks[bus]);
|
mutex_lock(&locks[bus]);
|
||||||
|
|
||||||
|
if (gpio_is_valid(spi_config[bus].miso_pin)) {
|
||||||
gpio_disable_mux(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)
|
int spi_acquire(spi_t bus, spi_cs_t cs, spi_mode_t mode, spi_clk_t clk)
|
||||||
@ -385,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 */
|
/* 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);
|
gpio_init_mux(spi_config[bus].clk_pin, spi_config[bus].clk_mux);
|
||||||
|
|
||||||
return SPI_OK;
|
return SPI_OK;
|
||||||
@ -392,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)
|
void spi_release(spi_t bus)
|
||||||
{
|
{
|
||||||
/* Demux clk_pin back to GPIO_OUT function. Otherwise it will get HIGH-Z
|
/* Demux clk_pin and mosi_pin back to GPIO_OUT function.
|
||||||
* and lead to unexpected current draw by SPI salves. */
|
* 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].clk_pin);
|
||||||
|
gpio_disable_mux(spi_config[bus].mosi_pin);
|
||||||
|
|
||||||
if (_is_qspi(bus)) {
|
if (_is_qspi(bus)) {
|
||||||
_qspi_release();
|
_qspi_release();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user