summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-09-29 15:17:10 +1000
committerjacqueline <me@jacqueline.id.au>2023-09-29 15:17:32 +1000
commitba940baa0aff05ad26d265f32f1d185a1f410373 (patch)
treeaca7e4ef8049039b7eb92160732d711db15873cf /src/drivers
parentc53802f308f57f0d829f5a02baf9e9fe8219c301 (diff)
downloadtangara-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.cpp9
-rw-r--r--src/drivers/include/spi.hpp2
-rw-r--r--src/drivers/spi.cpp6
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