@@ -34,33 +34,42 @@ typedef enum {
34
34
SPI_MODE3 = 3 ,
35
35
} SPIMode;
36
36
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
+
37
45
38
46
class SPISettings {
39
47
public:
40
- SPISettings (uint32_t clock, BitOrder bitOrder, SPIMode dataMode) {
48
+ SPISettings (uint32_t clock, BitOrder bitOrder, SPIMode dataMode, SPIBusMode busMode = SPI_CONTROLLER ) {
41
49
if (__builtin_constant_p (clock)) {
42
- init_AlwaysInline (clock, bitOrder, dataMode);
50
+ init_AlwaysInline (clock, bitOrder, dataMode, busMode );
43
51
} else {
44
- init_MightInline (clock, bitOrder, dataMode);
52
+ init_MightInline (clock, bitOrder, dataMode, busMode );
45
53
}
46
54
}
47
55
48
- SPISettings (uint32_t clock, BitOrder bitOrder, int dataMode) {
56
+ SPISettings (uint32_t clock, BitOrder bitOrder, int dataMode, SPIBusMode busMode = SPI_CONTROLLER ) {
49
57
if (__builtin_constant_p (clock)) {
50
- init_AlwaysInline (clock, bitOrder, (SPIMode)dataMode);
58
+ init_AlwaysInline (clock, bitOrder, (SPIMode)dataMode, busMode );
51
59
} else {
52
- init_MightInline (clock, bitOrder, (SPIMode)dataMode);
60
+ init_MightInline (clock, bitOrder, (SPIMode)dataMode, busMode );
53
61
}
54
62
}
55
63
56
64
// 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 ); }
58
66
59
67
bool operator ==(const SPISettings& rhs) const
60
68
{
61
69
if ((this ->clockFreq == rhs.clockFreq ) &&
62
70
(this ->bitOrder == rhs.bitOrder ) &&
63
- (this ->dataMode == rhs.dataMode )) {
71
+ (this ->dataMode == rhs.dataMode ) &&
72
+ (this ->busMode == rhs.busMode )) {
64
73
return true ;
65
74
}
66
75
return false ;
@@ -80,22 +89,27 @@ class SPISettings {
80
89
BitOrder getBitOrder () const {
81
90
return (bitOrder);
82
91
}
92
+ SPIBusMode getBusMode () const {
93
+ return busMode;
94
+ }
83
95
84
96
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 );
87
99
}
88
100
89
101
// 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__)) {
91
103
this ->clockFreq = clock;
92
104
this ->dataMode = dataMode;
93
105
this ->bitOrder = bitOrder;
106
+ this ->busMode = busMode;
94
107
}
95
108
96
109
uint32_t clockFreq;
97
110
SPIMode dataMode;
98
111
BitOrder bitOrder;
112
+ SPIBusMode busMode;
99
113
100
114
friend class HardwareSPI ;
101
115
};
0 commit comments