Skip to content

Commit 079e676

Browse files
mark9064JF002
authored andcommitted
SPI transaction hooks
1 parent 6b5235c commit 079e676

9 files changed

+52
-29
lines changed

src/drivers/Spi.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ Spi::Spi(SpiMaster& spiMaster, uint8_t pinCsn) : spiMaster {spiMaster}, pinCsn {
99
nrf_gpio_pin_set(pinCsn);
1010
}
1111

12-
bool Spi::Write(const uint8_t* data, size_t size) {
13-
return spiMaster.Write(pinCsn, data, size);
12+
bool Spi::Write(const uint8_t* data, size_t size, void (*TransactionHook)(bool)) {
13+
return spiMaster.Write(pinCsn, data, size, TransactionHook);
1414
}
1515

1616
bool Spi::Read(uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize) {

src/drivers/Spi.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ namespace Pinetime {
1414
Spi& operator=(Spi&&) = delete;
1515

1616
bool Init();
17-
bool Write(const uint8_t* data, size_t size);
17+
bool Write(const uint8_t* data, size_t size, void (*TransactionHook)(bool));
1818
bool Read(uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize);
1919
bool WriteCmdAndBuffer(const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize);
2020
void Sleep();

src/drivers/SpiMaster.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ void SpiMaster::OnEndEvent() {
143143
}
144144

145145
nrf_gpio_pin_set(this->pinCsn);
146+
if (this->TransactionHook != nullptr) {
147+
this->TransactionHook(false);
148+
}
146149
currentBufferAddr = 0;
147150
BaseType_t xHigherPriorityTaskWoken2 = pdFALSE;
148151
xSemaphoreGiveFromISR(mutex, &xHigherPriorityTaskWoken2);
@@ -173,13 +176,14 @@ void SpiMaster::PrepareRx(const uint32_t bufferAddress, const size_t size) {
173176
spiBaseAddress->EVENTS_END = 0;
174177
}
175178

176-
bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size) {
179+
bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size, void (*TransactionHook)(bool)) {
177180
if (data == nullptr)
178181
return false;
179182
auto ok = xSemaphoreTake(mutex, portMAX_DELAY);
180183
ASSERT(ok == true);
181184
taskToNotify = xTaskGetCurrentTaskHandle();
182185

186+
this->TransactionHook = TransactionHook;
183187
this->pinCsn = pinCsn;
184188

185189
if (size == 1) {
@@ -188,6 +192,9 @@ bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size) {
188192
DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0);
189193
}
190194

195+
if (this->TransactionHook != nullptr) {
196+
this->TransactionHook(true);
197+
}
191198
nrf_gpio_pin_clear(this->pinCsn);
192199

193200
currentBufferAddr = (uint32_t) data;
@@ -203,6 +210,9 @@ bool SpiMaster::Write(uint8_t pinCsn, const uint8_t* data, size_t size) {
203210
while (spiBaseAddress->EVENTS_END == 0)
204211
;
205212
nrf_gpio_pin_set(this->pinCsn);
213+
if (this->TransactionHook != nullptr) {
214+
this->TransactionHook(false);
215+
}
206216
currentBufferAddr = 0;
207217

208218
DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0);
@@ -217,7 +227,7 @@ bool SpiMaster::Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t* data
217227
xSemaphoreTake(mutex, portMAX_DELAY);
218228

219229
taskToNotify = nullptr;
220-
230+
this->TransactionHook = nullptr;
221231
this->pinCsn = pinCsn;
222232
DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0);
223233
spiBaseAddress->INTENCLR = (1 << 6);
@@ -267,6 +277,8 @@ bool SpiMaster::WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t* cmd, size_t cmd
267277

268278
taskToNotify = nullptr;
269279

280+
this->TransactionHook = nullptr;
281+
270282
this->pinCsn = pinCsn;
271283
DisableWorkaroundForFtpan58(spiBaseAddress, 0, 0);
272284
spiBaseAddress->INTENCLR = (1 << 6);

src/drivers/SpiMaster.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ namespace Pinetime {
3131
SpiMaster& operator=(SpiMaster&&) = delete;
3232

3333
bool Init();
34-
bool Write(uint8_t pinCsn, const uint8_t* data, size_t size);
34+
bool Write(uint8_t pinCsn, const uint8_t* data, size_t size, void (*TransactionHook)(bool));
3535
bool Read(uint8_t pinCsn, uint8_t* cmd, size_t cmdSize, uint8_t* data, size_t dataSize);
3636

3737
bool WriteCmdAndBuffer(uint8_t pinCsn, const uint8_t* cmd, size_t cmdSize, const uint8_t* data, size_t dataSize);
@@ -50,6 +50,7 @@ namespace Pinetime {
5050

5151
NRF_SPIM_Type* spiBaseAddress;
5252
uint8_t pinCsn;
53+
void (*TransactionHook)(bool);
5354

5455
SpiMaster::SpiModule spi;
5556
SpiMaster::Parameters params;

src/drivers/SpiNorFlash.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ void SpiNorFlash::Uninit() {
2222

2323
void SpiNorFlash::Sleep() {
2424
auto cmd = static_cast<uint8_t>(Commands::DeepPowerDown);
25-
spi.Write(&cmd, sizeof(uint8_t));
25+
spi.Write(&cmd, sizeof(uint8_t), nullptr);
2626
NRF_LOG_INFO("[SpiNorFlash] Sleep")
2727
}
2828

src/drivers/St7789.cpp

+26-16
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@
33
#include <libraries/delay/nrf_delay.h>
44
#include <nrfx_log.h>
55
#include "drivers/Spi.h"
6+
#include "drivers/PinMap.h"
67

78
using namespace Pinetime::Drivers;
89

9-
St7789::St7789(Spi& spi, uint8_t pinDataCommand, uint8_t pinReset) : spi {spi}, pinDataCommand {pinDataCommand}, pinReset {pinReset} {
10+
St7789::St7789(Spi& spi) : spi {spi} {
1011
}
1112

1213
void St7789::Init() {
13-
nrf_gpio_cfg_output(pinDataCommand);
14-
nrf_gpio_cfg_output(pinReset);
15-
nrf_gpio_pin_set(pinReset);
14+
nrf_gpio_cfg_output(PinMap::LcdDataCommand);
15+
nrf_gpio_cfg_output(PinMap::LcdReset);
16+
nrf_gpio_pin_set(PinMap::LcdReset);
1617
HardwareReset();
1718
SoftwareReset();
1819
SleepOut();
@@ -29,18 +30,28 @@ void St7789::Init() {
2930
DisplayOn();
3031
}
3132

33+
void St7789::EnableDataMode(bool isStart) {
34+
if (isStart) {
35+
nrf_gpio_pin_set(PinMap::LcdDataCommand);
36+
}
37+
}
38+
39+
void St7789::EnableCommandMode(bool isStart) {
40+
if (isStart) {
41+
nrf_gpio_pin_clear(PinMap::LcdDataCommand);
42+
}
43+
}
44+
3245
void St7789::WriteCommand(uint8_t cmd) {
33-
nrf_gpio_pin_clear(pinDataCommand);
34-
WriteSpi(&cmd, 1);
46+
WriteSpi(&cmd, 1, EnableCommandMode);
3547
}
3648

3749
void St7789::WriteData(uint8_t data) {
38-
nrf_gpio_pin_set(pinDataCommand);
39-
WriteSpi(&data, 1);
50+
WriteSpi(&data, 1, EnableDataMode);
4051
}
4152

42-
void St7789::WriteSpi(const uint8_t* data, size_t size) {
43-
spi.Write(data, size);
53+
void St7789::WriteSpi(const uint8_t* data, size_t size, void (*TransactionHook)(bool)) {
54+
spi.Write(data, size, TransactionHook);
4455
}
4556

4657
void St7789::SoftwareReset() {
@@ -152,24 +163,23 @@ void St7789::Uninit() {
152163

153164
void St7789::DrawBuffer(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t* data, size_t size) {
154165
SetAddrWindow(x, y, x + width - 1, y + height - 1);
155-
nrf_gpio_pin_set(pinDataCommand);
156-
WriteSpi(data, size);
166+
WriteSpi(data, size, EnableDataMode);
157167
}
158168

159169
void St7789::HardwareReset() {
160-
nrf_gpio_pin_clear(pinReset);
170+
nrf_gpio_pin_clear(PinMap::LcdReset);
161171
nrf_delay_ms(10);
162-
nrf_gpio_pin_set(pinReset);
172+
nrf_gpio_pin_set(PinMap::LcdReset);
163173
}
164174

165175
void St7789::Sleep() {
166176
SleepIn();
167-
nrf_gpio_cfg_default(pinDataCommand);
177+
nrf_gpio_cfg_default(PinMap::LcdDataCommand);
168178
NRF_LOG_INFO("[LCD] Sleep");
169179
}
170180

171181
void St7789::Wakeup() {
172-
nrf_gpio_cfg_output(pinDataCommand);
182+
nrf_gpio_cfg_output(PinMap::LcdDataCommand);
173183
SleepOut();
174184
VerticalScrollStartAddress(verticalScrollingStartAddress);
175185
DisplayOn();

src/drivers/St7789.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Pinetime {
88

99
class St7789 {
1010
public:
11-
explicit St7789(Spi& spi, uint8_t pinDataCommand, uint8_t pinReset);
11+
explicit St7789(Spi& spi);
1212
St7789(const St7789&) = delete;
1313
St7789& operator=(const St7789&) = delete;
1414
St7789(St7789&&) = delete;
@@ -26,8 +26,6 @@ namespace Pinetime {
2626

2727
private:
2828
Spi& spi;
29-
uint8_t pinDataCommand;
30-
uint8_t pinReset;
3129
uint8_t verticalScrollingStartAddress = 0;
3230

3331
void HardwareReset();
@@ -45,7 +43,9 @@ namespace Pinetime {
4543
void SetAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
4644
void SetVdv();
4745
void WriteCommand(uint8_t cmd);
48-
void WriteSpi(const uint8_t* data, size_t size);
46+
void WriteSpi(const uint8_t* data, size_t size, void (*TransactionHook)(bool));
47+
static void EnableDataMode(bool isStart);
48+
static void EnableCommandMode(bool isStart);
4949

5050
enum class Commands : uint8_t {
5151
SoftwareReset = 0x01,

src/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ Pinetime::Drivers::SpiMaster spi {Pinetime::Drivers::SpiMaster::SpiModule::SPI0,
6868
Pinetime::PinMap::SpiMiso}};
6969

7070
Pinetime::Drivers::Spi lcdSpi {spi, Pinetime::PinMap::SpiLcdCsn};
71-
Pinetime::Drivers::St7789 lcd {lcdSpi, Pinetime::PinMap::LcdDataCommand, Pinetime::PinMap::LcdReset};
71+
Pinetime::Drivers::St7789 lcd {lcdSpi};
7272

7373
Pinetime::Drivers::Spi flashSpi {spi, Pinetime::PinMap::SpiFlashCsn};
7474
Pinetime::Drivers::SpiNorFlash spiNorFlash {flashSpi};

src/recoveryLoader.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Pinetime::Drivers::Spi flashSpi {spi, Pinetime::PinMap::SpiFlashCsn};
4545
Pinetime::Drivers::SpiNorFlash spiNorFlash {flashSpi};
4646

4747
Pinetime::Drivers::Spi lcdSpi {spi, Pinetime::PinMap::SpiLcdCsn};
48-
Pinetime::Drivers::St7789 lcd {lcdSpi, Pinetime::PinMap::LcdDataCommand, Pinetime::PinMap::LcdReset};
48+
Pinetime::Drivers::St7789 lcd {lcdSpi};
4949

5050
Pinetime::Controllers::BrightnessController brightnessController;
5151

0 commit comments

Comments
 (0)