Skip to content

Commit 07452b2

Browse files
committed
Fix FreeRTOS weirdness on Funhouse
Funhouse has DotStars attached to SPI that exercises this bug. Most boards are NeoPixel and avoid this. Fixes #9486
1 parent 4d88d73 commit 07452b2

File tree

1 file changed

+5
-1
lines changed
  • ports/espressif/common-hal/busio

1 file changed

+5
-1
lines changed

ports/espressif/common-hal/busio/SPI.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
129129

130130
// Wait for any other users of this to finish.
131131
while (!common_hal_busio_spi_try_lock(self)) {
132+
RUN_BACKGROUND_TASKS;
132133
}
133134

134135
// Mark us as deinit early in case we are used in an interrupt.
@@ -139,7 +140,10 @@ void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
139140
spi_bus_remove_device(spi_handle[self->host_id]);
140141
spi_bus_free(self->host_id);
141142

143+
// Release the mutex before we delete it. Otherwise FreeRTOS gets unhappy.
144+
xSemaphoreGive(self->mutex);
142145
vSemaphoreDelete(self->mutex);
146+
self->mutex = NULL;
143147

144148
common_hal_reset_pin(self->MOSI);
145149
common_hal_reset_pin(self->MISO);
@@ -166,7 +170,7 @@ bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) {
166170
}
167171

168172
bool common_hal_busio_spi_has_lock(busio_spi_obj_t *self) {
169-
return xSemaphoreGetMutexHolder(self->mutex) == xTaskGetCurrentTaskHandle();
173+
return self->mutex != NULL && xSemaphoreGetMutexHolder(self->mutex) == xTaskGetCurrentTaskHandle();
170174
}
171175

172176
void common_hal_busio_spi_unlock(busio_spi_obj_t *self) {

0 commit comments

Comments
 (0)