diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-09-29 15:17:10 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-09-29 15:17:32 +1000 |
| commit | ba940baa0aff05ad26d265f32f1d185a1f410373 (patch) | |
| tree | aca7e4ef8049039b7eb92160732d711db15873cf /src/drivers | |
| parent | c53802f308f57f0d829f5a02baf9e9fe8219c301 (diff) | |
| download | tangara-fw-ba940baa0aff05ad26d265f32f1d185a1f410373.tar.gz | |
Add a lock around the SPI bus
This seems to have been the cause of recurring deadlocks that have been
difficult to repo.
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/display.cpp | 9 | ||||
| -rw-r--r-- | src/drivers/include/spi.hpp | 2 | ||||
| -rw-r--r-- | src/drivers/spi.cpp | 6 |
3 files changed, 15 insertions, 2 deletions
diff --git a/src/drivers/display.cpp b/src/drivers/display.cpp index 48310074..a06320f4 100644 --- a/src/drivers/display.cpp +++ b/src/drivers/display.cpp @@ -34,6 +34,7 @@ #include "gpios.hpp" #include "misc/lv_color.h" #include "soc/soc.h" +#include "spi.hpp" #include "tasks.hpp" static const char* kTag = "DISPLAY"; @@ -267,8 +268,12 @@ void Display::SendTransaction(TransactionType type, gpio_set_level(kDisplayDr, type); - // TODO(jacqueline): Handle these errors. - esp_err_t ret = spi_device_transmit(handle_, &sTransaction); + esp_err_t ret; + { + auto lock = drivers::acquire_spi(); + // TODO(jacqueline): Handle these errors. + ret = spi_device_transmit(handle_, &sTransaction); + } ESP_ERROR_CHECK(ret); } diff --git a/src/drivers/include/spi.hpp b/src/drivers/include/spi.hpp index 7dbc2aae..60638f71 100644 --- a/src/drivers/include/spi.hpp +++ b/src/drivers/include/spi.hpp @@ -6,11 +6,13 @@ #pragma once +#include <mutex> #include "esp_err.h" namespace drivers { esp_err_t init_spi(void); esp_err_t deinit_spi(void); +std::lock_guard<std::mutex> acquire_spi(void); } // namespace drivers diff --git a/src/drivers/spi.cpp b/src/drivers/spi.cpp index 93bf9cde..ba461b67 100644 --- a/src/drivers/spi.cpp +++ b/src/drivers/spi.cpp @@ -20,6 +20,8 @@ static const gpio_num_t kSpiSdoPin = GPIO_NUM_23; static const gpio_num_t kSpiSdiPin = GPIO_NUM_19; static const gpio_num_t kSpiSclkPin = GPIO_NUM_18; +static std::mutex sSpiMutex{}; + esp_err_t init_spi(void) { spi_bus_config_t config = { .mosi_io_num = kSpiSdoPin, @@ -52,4 +54,8 @@ esp_err_t deinit_spi(void) { return spi_bus_free(kSpiHost); } +std::lock_guard<std::mutex> acquire_spi(void) { + return std::lock_guard<std::mutex>{sSpiMutex}; +} + } // namespace drivers |
