Skip to content

Commit 7c2d808

Browse files
committed
fixing beginTransaction() by protecting _freq and _div by additional mutex
1 parent 3480fa9 commit 7c2d808

File tree

4 files changed

+20
-20
lines changed

4 files changed

+20
-20
lines changed

cores/esp32/esp32-hal-spi.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,23 +1002,13 @@ void spiTransferBits(spi_t * spi, uint32_t data, uint32_t * out, uint8_t bits)
10021002
#define MSB_24_SET(var, val) { uint8_t * d = (uint8_t *)&(val); (var) = d[2] | (d[1] << 8) | (d[0] << 16); }
10031003
#define MSB_16_SET(var, val) { (var) = (((val) & 0xFF00) >> 8) | (((val) & 0xFF) << 8); }
10041004
#define MSB_PIX_SET(var, val) { uint8_t * d = (uint8_t *)&(val); (var) = d[1] | (d[0] << 8) | (d[3] << 16) | (d[2] << 24); }
1005-
void spiLock(spi_t * spi){
1006-
if(!spi) {
1007-
return;
1008-
}
1009-
SPI_MUTEX_LOCK();
1010-
}
1011-
void spiUnlock(spi_t * spi){
1012-
if(!spi) {
1013-
return;
1014-
}
1015-
SPI_MUTEX_UNLOCK();
1016-
}
1005+
10171006
void spiTransaction(spi_t * spi, uint32_t clockDiv, uint8_t dataMode, uint8_t bitOrder)
10181007
{
10191008
if(!spi) {
10201009
return;
10211010
}
1011+
SPI_MUTEX_LOCK();
10221012
spi->dev->clock.val = clockDiv;
10231013
switch (dataMode) {
10241014
case SPI_MODE1:
@@ -1069,6 +1059,7 @@ void spiSimpleTransaction(spi_t * spi)
10691059
if(!spi) {
10701060
return;
10711061
}
1062+
SPI_MUTEX_UNLOCK();
10721063
}
10731064

10741065
void spiEndTransaction(spi_t * spi)

cores/esp32/esp32-hal-spi.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
1+
SPI_MUTEX_LOCK();// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
22
//
33
// Licensed under the Apache License, Version 2.0 (the "License");
44
// you may not use this file except in compliance with the License.
@@ -119,8 +119,6 @@ void spiTransferBits(spi_t * spi, uint32_t data, uint32_t * out, uint8_t bits);
119119
/*
120120
* New (EXPERIMENTAL) Transaction lock based API (lock once until endTransaction)
121121
* */
122-
void spiLock(spi_t * spi);
123-
void spiUnlock(spi_t * spi);
124122
void spiTransaction(spi_t * spi, uint32_t clockDiv, uint8_t dataMode, uint8_t bitOrder);
125123
void spiSimpleTransaction(spi_t * spi);
126124
void spiEndTransaction(spi_t * spi);

libraries/SPI/src/SPI.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,23 @@ void SPIClass::setHwCs(bool use)
106106

107107
void SPIClass::setFrequency(uint32_t freq)
108108
{
109-
//check if last freq changed
109+
SPI_PARAM_LOCK();
110+
//check if last freq changed
110111
uint32_t cdiv = spiGetClockDiv(_spi);
111112
if(_freq != freq || _div != cdiv) {
112113
_freq = freq;
113114
_div = spiFrequencyToClockDiv(_freq);
114115
spiSetClockDiv(_spi, _div);
115116
}
117+
SPI_PARAM_UNLOCK();
116118
}
117119

118120
void SPIClass::setClockDivider(uint32_t clockDiv)
119121
{
120-
_div = clockDiv;
122+
SPI_PARAM_LOCK();
123+
_div = clockDiv;
121124
spiSetClockDiv(_spi, _div);
125+
SPI_PARAM_UNLOCK();
122126
}
123127

124128
uint32_t SPIClass::getClockDivider()
@@ -138,23 +142,23 @@ void SPIClass::setBitOrder(uint8_t bitOrder)
138142

139143
void SPIClass::beginTransaction(SPISettings settings)
140144
{
141-
spiLock(_spi);
142-
//check if last freq changed
145+
SPI_PARAM_LOCK();
146+
//check if last freq changed
143147
uint32_t cdiv = spiGetClockDiv(_spi);
144148
if(_freq != settings._clock || _div != cdiv) {
145149
_freq = settings._clock;
146150
_div = spiFrequencyToClockDiv(_freq);
147151
}
148152
spiTransaction(_spi, _div, settings._dataMode, settings._bitOrder);
149153
_inTransaction = true;
154+
SPI_PARAM_UNLOCK();
150155
}
151156

152157
void SPIClass::endTransaction()
153158
{
154159
if(_inTransaction){
155160
_inTransaction = false;
156161
spiEndTransaction(_spi);
157-
spiUnlock(_spi);
158162
}
159163
}
160164

libraries/SPI/src/SPI.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@
2525
#include "pins_arduino.h"
2626
#include "esp32-hal-spi.h"
2727

28+
#if !CONFIG_DISABLE_HAL_LOCKS
29+
#include "FreeRTOS.h"
30+
#endif
31+
2832
#define SPI_HAS_TRANSACTION
2933

3034
class SPISettings
@@ -49,6 +53,9 @@ class SPIClass
4953
int8_t _ss;
5054
uint32_t _div;
5155
uint32_t _freq;
56+
#if !CONFIG_DISABLE_HAL_LOCKS
57+
xSemaphoreHandle paramLock=NULL;
58+
#endif
5259
bool _inTransaction;
5360
void writePattern_(const uint8_t * data, uint8_t size, uint8_t repeat);
5461

0 commit comments

Comments
 (0)