File tree Expand file tree Collapse file tree 2 files changed +30
-4
lines changed Expand file tree Collapse file tree 2 files changed +30
-4
lines changed Original file line number Diff line number Diff line change @@ -87,6 +87,9 @@ void SPIClass::usingInterrupt(int interruptNumber)
87
87
interruptMode = SPI_IMODE_GLOBAL;
88
88
else
89
89
{
90
+ if (irqMap == NULL ) {
91
+ irqMap = (uint8_t *)malloc (EXTERNAL_NUM_INTERRUPTS);
92
+ }
90
93
interruptMode |= SPI_IMODE_EXTINT;
91
94
interruptMask |= (1 << interruptNumber);
92
95
}
@@ -102,16 +105,38 @@ void SPIClass::notUsingInterrupt(int interruptNumber)
102
105
103
106
interruptMask &= ~(1 << interruptNumber);
104
107
105
- if (interruptMask == 0 )
108
+ if (interruptMask == 0 ) {
106
109
interruptMode = SPI_IMODE_NONE;
110
+ free (irqMap);
111
+ irqMap = NULL ;
112
+ }
107
113
}
108
114
109
-
110
115
void SPIClass::detachMaskedInterrupts () {
116
+ unsigned long long temp = interruptMask;
117
+ uint8_t shift = 0 ;
118
+ while (temp != 0 ) {
119
+ if (temp & 1 ) {
120
+ uint8_t * pin_ctrl_reg = getPINnCTRLregister (portToPortStruct (shift/8 ), shift%8 );
121
+ irqMap[shift] = *pin_ctrl_reg;
122
+ *pin_ctrl_reg &= ~(PORT_ISC_gm);
123
+ }
124
+ temp = temp >> 1 ;
125
+ shift++;
126
+ }
111
127
}
112
128
113
129
void SPIClass::reattachMaskedInterrupts () {
114
-
130
+ unsigned long long temp = interruptMask;
131
+ uint8_t shift = 0 ;
132
+ while (temp != 0 ) {
133
+ if (temp & 1 ) {
134
+ uint8_t * pin_ctrl_reg = getPINnCTRLregister (portToPortStruct (shift/8 ), shift%8 );
135
+ *pin_ctrl_reg |= irqMap[shift];
136
+ }
137
+ temp = temp >> 1 ;
138
+ shift++;
139
+ }
115
140
}
116
141
117
142
void SPIClass::beginTransaction (SPISettings settings)
Original file line number Diff line number Diff line change @@ -182,7 +182,8 @@ class SPIClass {
182
182
bool initialized;
183
183
uint8_t interruptMode;
184
184
char interruptSave;
185
- uint32_t interruptMask;
185
+ unsigned long long interruptMask;
186
+ uint8_t * irqMap = NULL ;
186
187
};
187
188
188
189
#if SPI_INTERFACES_COUNT > 0
You can’t perform that action at this time.
0 commit comments