From ba940baa0aff05ad26d265f32f1d185a1f410373 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 29 Sep 2023 15:17:10 +1000 Subject: Add a lock around the SPI bus This seems to have been the cause of recurring deadlocks that have been difficult to repo. --- src/drivers/display.cpp | 9 +++++++-- src/drivers/include/spi.hpp | 2 ++ src/drivers/spi.cpp | 6 ++++++ 3 files changed, 15 insertions(+), 2 deletions(-) (limited to 'src/drivers') 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 #include "esp_err.h" namespace drivers { esp_err_t init_spi(void); esp_err_t deinit_spi(void); +std::lock_guard 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 acquire_spi(void) { + return std::lock_guard{sSpiMutex}; +} + } // namespace drivers -- cgit v1.2.3