From 29735aa7c43c0897faee20258318ff6152d25595 Mon Sep 17 00:00:00 2001 From: Gunar Schorcht Date: Fri, 5 Jan 2018 18:39:01 +0100 Subject: [PATCH] semaphore handling added to SPI interface --- examples/lsm303d/lsm303d_example.c | 9 ++++++--- extras/lsm303d/lsm303d.c | 12 ++++++++++++ extras/lsm303d/lsm303d_platform.h | 6 +++--- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/examples/lsm303d/lsm303d_example.c b/examples/lsm303d/lsm303d_example.c index d4823d4..7ad44b2 100644 --- a/examples/lsm303d/lsm303d_example.c +++ b/examples/lsm303d/lsm303d_example.c @@ -177,11 +177,14 @@ void user_task_interrupt (void *pvParameters) // get the source of the interrupt that reset *INTx* signals #ifdef INT_DATA lsm303d_get_int_data_source (sensor, &data_src); - #elif INT_THRESH + #endif + #ifdef INT_THRESH lsm303d_get_int_m_thresh_source(sensor, &thresh_src); - #elif INT_EVENT + #endif + #ifdef INT_EVENT lsm303d_get_int_event_source (sensor, &event_src, lsm303d_int_event1_gen); - #elif INT_CLICK + #endif + #ifdef INT_CLICK lsm303d_get_int_click_source (sensor, &click_src); #endif diff --git a/extras/lsm303d/lsm303d.c b/extras/lsm303d/lsm303d.c index be54e0d..3a7297f 100644 --- a/extras/lsm303d/lsm303d.c +++ b/extras/lsm303d/lsm303d.c @@ -397,6 +397,8 @@ lsm303d_sensor_t* lsm303d_init_sensor (uint8_t bus, uint8_t addr, uint8_t cs) free (dev); return NULL; } + if (!addr) + spi_semaphore_init(dev); // check availability of the sensor if (!lsm303d_is_available (dev)) @@ -1554,6 +1556,8 @@ static bool lsm303d_spi_read(lsm303d_sensor_t* dev, uint8_t reg, uint8_t *data, uint8_t addr = (reg & 0x3f) | LSM303D_SPI_READ_FLAG | LSM303D_SPI_AUTO_INC_FLAG; + spi_semaphore_take (dev); + static uint8_t mosi[LSM303D_SPI_BUF_SIZE]; static uint8_t miso[LSM303D_SPI_BUF_SIZE]; @@ -1564,6 +1568,7 @@ static bool lsm303d_spi_read(lsm303d_sensor_t* dev, uint8_t reg, uint8_t *data, if (!spi_transfer_pf (dev->bus, dev->cs, mosi, miso, len+1)) { + spi_semaphore_give (dev); error_dev ("Could not read data from SPI", __FUNCTION__, dev); dev->error_code |= LSM303D_SPI_READ_FAILED; return false; @@ -1573,6 +1578,8 @@ static bool lsm303d_spi_read(lsm303d_sensor_t* dev, uint8_t reg, uint8_t *data, for (int i=0; i < len; i++) data[i] = miso[i+1]; + spi_semaphore_give (dev); + #ifdef LSM303D_DEBUG_LEVEL_2 printf("LSM303D %s: read the following bytes from reg %02x: ", __FUNCTION__, reg); for (int i=0; i < len; i++) @@ -1602,6 +1609,8 @@ static bool lsm303d_spi_write(lsm303d_sensor_t* dev, uint8_t reg, uint8_t *data, return false; } + spi_semaphore_take (dev); + reg &= 0x7f; // first byte in output is the register address @@ -1620,11 +1629,14 @@ static bool lsm303d_spi_write(lsm303d_sensor_t* dev, uint8_t reg, uint8_t *data, if (!spi_transfer_pf (dev->bus, dev->cs, mosi, NULL, len+1)) { + spi_semaphore_give (dev); error_dev ("Could not write data to SPI.", __FUNCTION__, dev); dev->error_code |= LSM303D_SPI_WRITE_FAILED; return false; } + spi_semaphore_give (dev); + return true; } diff --git a/extras/lsm303d/lsm303d_platform.h b/extras/lsm303d/lsm303d_platform.h index ba3eb71..f697212 100644 --- a/extras/lsm303d/lsm303d_platform.h +++ b/extras/lsm303d/lsm303d_platform.h @@ -69,9 +69,9 @@ // platform specific definitions -#define spi_semaphore_init() -#define spi_semaphore_take() -#define spi_semaphore_give() +#define spi_semaphore_init(d) +#define spi_semaphore_take(d) +#define spi_semaphore_give(d) // platform specific SPI functions