Skip to content

Commit dab7773

Browse files
committed
Add SPI bus mode support (controller/peripheral)
Signed-off-by: iabdalkader <[email protected]>
1 parent 4a02bfc commit dab7773

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

api/HardwareSPI.h

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,33 +34,42 @@ typedef enum {
3434
SPI_MODE3 = 3,
3535
} SPIMode;
3636

37+
// Platforms should define SPI_HAS_PERIPHERAL_MODE if SPI peripheral
38+
// mode is supported, to allow applications to check whether peripheral
39+
// mode is available or not.
40+
typedef enum {
41+
SPI_CONTROLLER = 0,
42+
SPI_PERIPHERAL = 1,
43+
} SPIBusMode;
44+
3745

3846
class SPISettings {
3947
public:
40-
SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
48+
SPISettings(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode = SPI_CONTROLLER) {
4149
if (__builtin_constant_p(clock)) {
42-
init_AlwaysInline(clock, bitOrder, dataMode);
50+
init_AlwaysInline(clock, bitOrder, dataMode, busMode);
4351
} else {
44-
init_MightInline(clock, bitOrder, dataMode);
52+
init_MightInline(clock, bitOrder, dataMode, busMode);
4553
}
4654
}
4755

48-
SPISettings(uint32_t clock, BitOrder bitOrder, int dataMode) {
56+
SPISettings(uint32_t clock, BitOrder bitOrder, int dataMode, SPIBusMode busMode = SPI_CONTROLLER) {
4957
if (__builtin_constant_p(clock)) {
50-
init_AlwaysInline(clock, bitOrder, (SPIMode)dataMode);
58+
init_AlwaysInline(clock, bitOrder, (SPIMode)dataMode, busMode);
5159
} else {
52-
init_MightInline(clock, bitOrder, (SPIMode)dataMode);
60+
init_MightInline(clock, bitOrder, (SPIMode)dataMode, busMode);
5361
}
5462
}
5563

5664
// Default speed set to 4MHz, SPI mode set to MODE 0 and Bit order set to MSB first.
57-
SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0); }
65+
SPISettings() { init_AlwaysInline(4000000, MSBFIRST, SPI_MODE0, SPI_CONTROLLER); }
5866

5967
bool operator==(const SPISettings& rhs) const
6068
{
6169
if ((this->clockFreq == rhs.clockFreq) &&
6270
(this->bitOrder == rhs.bitOrder) &&
63-
(this->dataMode == rhs.dataMode)) {
71+
(this->dataMode == rhs.dataMode) &&
72+
(this->busMode == rhs.busMode)) {
6473
return true;
6574
}
6675
return false;
@@ -80,22 +89,27 @@ class SPISettings {
8089
BitOrder getBitOrder() const {
8190
return (bitOrder);
8291
}
92+
SPIBusMode getBusMode() const {
93+
return busMode;
94+
}
8395

8496
private:
85-
void init_MightInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
86-
init_AlwaysInline(clock, bitOrder, dataMode);
97+
void init_MightInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode) {
98+
init_AlwaysInline(clock, bitOrder, dataMode, busMode);
8799
}
88100

89101
// Core developer MUST use an helper function in beginTransaction() to use this data
90-
void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode) __attribute__((__always_inline__)) {
102+
void init_AlwaysInline(uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode) __attribute__((__always_inline__)) {
91103
this->clockFreq = clock;
92104
this->dataMode = dataMode;
93105
this->bitOrder = bitOrder;
106+
this->busMode = busMode;
94107
}
95108

96109
uint32_t clockFreq;
97110
SPIMode dataMode;
98111
BitOrder bitOrder;
112+
SPIBusMode busMode;
99113

100114
friend class HardwareSPI;
101115
};

0 commit comments

Comments
 (0)