diff --git a/cpu/stm32f3/periph/spi.c b/cpu/stm32f3/periph/spi.c index 6203ec6dee..2b401e6468 100644 --- a/cpu/stm32f3/periph/spi.c +++ b/cpu/stm32f3/periph/spi.c @@ -17,6 +17,7 @@ * @author Peter Kietzmann * @author Fabian Nack * @author Hauke Petersen + * @author Joakim Gebart * * @} */ @@ -24,6 +25,7 @@ #include "board.h" #include "cpu.h" +#include "mutex.h" #include "periph/spi.h" #include "periph_conf.h" #include "thread.h" @@ -57,6 +59,21 @@ static inline void irq_handler_transfer(SPI_TypeDef *spi, spi_t dev); static spi_state_t spi_config[SPI_NUMOF]; +/** + * @brief Array holding one pre-initialized mutex for each SPI device + */ +static mutex_t locks[] = { +#if SPI_0_EN + [SPI_0] = MUTEX_INIT, +#endif +#if SPI_1_EN + [SPI_1] = MUTEX_INIT, +#endif +#if SPI_2_EN + [SPI_2] = MUTEX_INIT +#endif +}; + int spi_init_master(spi_t dev, spi_conf_t conf, spi_speed_t speed) { uint8_t speed_divider; @@ -262,6 +279,24 @@ int spi_conf_pins(spi_t dev) return 0; } +int spi_acquire(spi_t dev) +{ + if (dev >= SPI_NUMOF) { + return -1; + } + mutex_lock(&locks[dev]); + return 0; +} + +int spi_release(spi_t dev) +{ + if (dev >= SPI_NUMOF) { + return -1; + } + mutex_unlock(&locks[dev]); + return 0; +} + int spi_transfer_byte(spi_t dev, char out, char *in) { if (dev >= SPI_NUMOF) {