@@ -34,33 +34,42 @@ typedef enum {
3434 SPI_MODE3 = 3 ,
3535} SPIMode;
3636
37+ // Platforms should add a define (eg. SPI_HAS_PERIPHERAL_MODE) if they
38+ // support SPI peripheral mode operation to allow applications to check
39+ // whether peripheral mode is available or not.
40+ typedef enum {
41+ SPI_CONTROLLER = 0 ,
42+ SPI_PERIPHERAL = 1 ,
43+ } SPIBusMode;
44+
3745
3846class 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