From 8821e0edcf5ec1b82d97ed14cde8977ebf495dd9 Mon Sep 17 00:00:00 2001 From: Thomas Eichinger Date: Mon, 19 Jan 2015 12:15:45 +0100 Subject: [PATCH] cpu/stm32f4: make i2c thread-safe --- cpu/stm32f4/periph/i2c.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/cpu/stm32f4/periph/i2c.c b/cpu/stm32f4/periph/i2c.c index e814aaef3b..dabf3119b3 100644 --- a/cpu/stm32f4/periph/i2c.c +++ b/cpu/stm32f4/periph/i2c.c @@ -17,6 +17,7 @@ * * @author Peter Kietzmann * @author Hauke Petersen + * @auhtor Thomas Eichinge * * @} */ @@ -25,6 +26,7 @@ #include "cpu.h" #include "irq.h" +#include "mutex.h" #include "periph_conf.h" #include "periph/i2c.h" @@ -43,6 +45,24 @@ static inline void _clear_addr(I2C_TypeDef *dev); static inline void _write(I2C_TypeDef *dev, char *data, int length); static inline void _stop(I2C_TypeDef *dev); +/** + * @brief Array holding one pre-initialized mutex for each I2C device + */ +static mutex_t locks[] = { +#if I2C_0_EN + [I2C_0] = MUTEX_INIT, +#endif +#if I2C_1_EN + [I2C_1] = MUTEX_INIT, +#endif +#if I2C_2_EN + [I2C_2] = MUTEX_INIT +#endif +#if I2C_3_EN + [I2C_3] = MUTEX_INIT +#endif +}; + int i2c_init_master(i2c_t dev, i2c_speed_t speed) { I2C_TypeDef *i2c; @@ -201,6 +221,24 @@ int i2c_init_slave(i2c_t dev, uint8_t address) return -1; } +int i2c_acquire(i2c_t dev) +{ + if (dev >= I2C_NUMOF) { + return -1; + } + mutex_lock(&locks[dev]); + return 0; +} + +int i2c_release(i2c_t dev) +{ + if (dev >= I2C_NUMOF) { + return -1; + } + mutex_unlock(&locks[dev]); + return 0; +} + int i2c_read_byte(i2c_t dev, uint8_t address, char *data) { return i2c_read_bytes(dev, address, data, 1);