@@ -62,7 +62,8 @@ void SPIClass::init()
62
62
return ;
63
63
interruptMode = SPI_IMODE_NONE;
64
64
interruptSave = 0 ;
65
- interruptMask = 0 ;
65
+ interruptMask_lo = 0 ;
66
+ interruptMask_hi = 0 ;
66
67
initialized = true ;
67
68
}
68
69
@@ -91,7 +92,11 @@ void SPIClass::usingInterrupt(int interruptNumber)
91
92
irqMap = (uint8_t *)malloc (EXTERNAL_NUM_INTERRUPTS);
92
93
}
93
94
interruptMode |= SPI_IMODE_EXTINT;
94
- interruptMask |= (1 << interruptNumber);
95
+ if (interruptNumber < 32 ) {
96
+ interruptMask_lo |= 1 << interruptNumber;
97
+ } else {
98
+ interruptMask_hi |= 1 << (interruptNumber - 32 );
99
+ }
95
100
}
96
101
}
97
102
@@ -103,17 +108,21 @@ void SPIClass::notUsingInterrupt(int interruptNumber)
103
108
if (interruptMode & SPI_IMODE_GLOBAL)
104
109
return ; // can't go back, as there is no reference count
105
110
106
- interruptMask &= ~(1 << interruptNumber);
111
+ if (interruptNumber < 32 ) {
112
+ interruptMask_lo &= ~(1 << interruptNumber);
113
+ } else {
114
+ interruptMask_hi &= ~(1 << (interruptNumber - 32 ));
115
+ }
107
116
108
- if (interruptMask == 0 ) {
117
+ if (interruptMask_lo == 0 && interruptMask_hi == 0 ) {
109
118
interruptMode = SPI_IMODE_NONE;
110
119
free (irqMap);
111
120
irqMap = NULL ;
112
121
}
113
122
}
114
123
115
124
void SPIClass::detachMaskedInterrupts () {
116
- unsigned long long temp = interruptMask ;
125
+ uint64_t temp = interruptMask_lo ;
117
126
uint8_t shift = 0 ;
118
127
while (temp != 0 ) {
119
128
if (temp & 1 ) {
@@ -124,10 +133,21 @@ void SPIClass::detachMaskedInterrupts() {
124
133
temp = temp >> 1 ;
125
134
shift++;
126
135
}
136
+ temp = interruptMask_hi;
137
+ shift = 32 ;
138
+ while (temp != 0 ) {
139
+ if (temp & 1 ) {
140
+ uint8_t * pin_ctrl_reg = getPINnCTRLregister (portToPortStruct (shift/8 ), shift%8 );
141
+ irqMap[shift] = *pin_ctrl_reg;
142
+ *pin_ctrl_reg &= ~(PORT_ISC_gm);
143
+ }
144
+ temp = temp >> 1 ;
145
+ shift++;
146
+ }
127
147
}
128
148
129
149
void SPIClass::reattachMaskedInterrupts () {
130
- unsigned long long temp = interruptMask ;
150
+ uint64_t temp = interruptMask_lo ;
131
151
uint8_t shift = 0 ;
132
152
while (temp != 0 ) {
133
153
if (temp & 1 ) {
@@ -137,6 +157,16 @@ void SPIClass::reattachMaskedInterrupts() {
137
157
temp = temp >> 1 ;
138
158
shift++;
139
159
}
160
+ temp = interruptMask_hi;
161
+ shift = 32 ;
162
+ while (temp != 0 ) {
163
+ if (temp & 1 ) {
164
+ uint8_t * pin_ctrl_reg = getPINnCTRLregister (portToPortStruct (shift/8 ), shift%8 );
165
+ *pin_ctrl_reg |= irqMap[shift];
166
+ }
167
+ temp = temp >> 1 ;
168
+ shift++;
169
+ }
140
170
}
141
171
142
172
void SPIClass::beginTransaction (SPISettings settings)
0 commit comments