Skip to content

Commit dee5b72

Browse files
committed
Implement dynamic map to handle usingInterrupt() only if needed
1 parent c8c30d5 commit dee5b72

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

libraries/SPI/src/SPI.cpp

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ void SPIClass::usingInterrupt(int interruptNumber)
8787
interruptMode = SPI_IMODE_GLOBAL;
8888
else
8989
{
90+
if (irqMap == NULL) {
91+
irqMap = (uint8_t*)malloc(EXTERNAL_NUM_INTERRUPTS);
92+
}
9093
interruptMode |= SPI_IMODE_EXTINT;
9194
interruptMask |= (1 << interruptNumber);
9295
}
@@ -102,16 +105,38 @@ void SPIClass::notUsingInterrupt(int interruptNumber)
102105

103106
interruptMask &= ~(1 << interruptNumber);
104107

105-
if (interruptMask == 0)
108+
if (interruptMask == 0) {
106109
interruptMode = SPI_IMODE_NONE;
110+
free(irqMap);
111+
irqMap = NULL;
112+
}
107113
}
108114

109-
110115
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+
}
111127
}
112128

113129
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+
}
115140
}
116141

117142
void SPIClass::beginTransaction(SPISettings settings)

libraries/SPI/src/SPI.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,8 @@ class SPIClass {
182182
bool initialized;
183183
uint8_t interruptMode;
184184
char interruptSave;
185-
uint32_t interruptMask;
185+
unsigned long long interruptMask;
186+
uint8_t* irqMap = NULL;
186187
};
187188

188189
#if SPI_INTERFACES_COUNT > 0

0 commit comments

Comments
 (0)