@@ -120,104 +120,7 @@ void common_hal_mcu_pin_reset_number(uint8_t pin_no) {
120
120
common_hal_reset_pin ((mcu_pin_obj_t * )(mcu_pin_globals .map .table [pin_no ].value ));
121
121
}
122
122
123
- /* Array of GPIO peripheral base address. */
124
- static GPIO_Type * const s_gpioBases [] = GPIO_BASE_PTRS ;
125
- static uint32_t GPIO_GetInstance (GPIO_Type * base ) {
126
- uint32_t instance ;
127
-
128
- /* Find the instance index from base address mappings. */
129
- for (instance = 0U ; instance < ARRAY_SIZE (s_gpioBases ); instance ++ )
130
- {
131
- if (s_gpioBases [instance ] == base ) {
132
- break ;
133
- }
134
- }
135
-
136
- assert (instance < ARRAY_SIZE (s_gpioBases ));
137
-
138
- return instance ;
139
- }
140
-
141
- /* to find IRQ based on GPIO */
142
- static const IRQn_Type low_irqs [] = GPIO_COMBINED_LOW_IRQS ;
143
- static const IRQn_Type high_irqs [] = GPIO_COMBINED_HIGH_IRQS ;
144
-
145
- typedef struct {
146
- gpio_change_interrupt_t * func ;
147
- void * data ;
148
- } pin_change_interrupt_data ;
149
-
150
- volatile static pin_change_interrupt_data pcid [MP_ARRAY_SIZE (s_gpioBases )][32 ];
151
-
152
123
// The 'data' pointers may be to gc objects, they must be kept alive.
153
124
void pin_gc_collect () {
154
125
gc_collect_root ((void * * )& pcid , sizeof (pcid ) / sizeof (void * ));
155
126
}
156
-
157
- void enable_pin_change_interrupt (const mcu_pin_obj_t * pin , gpio_change_interrupt_t func , void * data ) {
158
- int instance = GPIO_GetInstance (pin -> gpio );
159
- volatile pin_change_interrupt_data * pci = & pcid [instance ][pin -> number ];
160
- common_hal_mcu_disable_interrupts ();
161
- pci -> data = data ;
162
- pci -> func = func ;
163
- IRQn_Type irq = pin -> number < 16 ? low_irqs [instance ] : high_irqs [instance ];
164
- if (irq != NotAvail_IRQn ) {
165
- EnableIRQ (irq );
166
- }
167
- pin -> gpio -> IMR |= (1 << pin -> number );
168
- common_hal_mcu_enable_interrupts ();
169
- }
170
-
171
- void disable_pin_change_interrupt (const mcu_pin_obj_t * pin ) {
172
- volatile pin_change_interrupt_data * pci = & pcid [GPIO_GetInstance (pin -> gpio )][pin -> number ];
173
- common_hal_mcu_disable_interrupts ();
174
- pin -> gpio -> IMR &= ~(1 << pin -> number );
175
- pci -> data = NULL ;
176
- pci -> func = NULL ;
177
- pin -> gpio -> ISR = (1 << pin -> number ); // acknowledge any pending interrupt
178
- common_hal_mcu_enable_interrupts ();
179
- }
180
-
181
- static void pin_change_interrupt_common (uint32_t isr , volatile pin_change_interrupt_data * pcr ) {
182
- for (uint32_t i = 0 ; i < 32 ; i ++ ) {
183
- if (isr & (1 << i )) {
184
- pin_change_interrupt_data cb = pcr [i ];
185
- if (cb .func ) {
186
- cb .func (cb .data );
187
- }
188
- }
189
- }
190
- }
191
-
192
- #define GPIO_INTERRUPT_HANDLER (name , ptr , instance , offset ) \
193
- void name(void); \
194
- __attribute__((used)) void name(void) { \
195
- uint32_t isr = ptr->ISR; \
196
- ptr->ISR = isr; \
197
- pin_change_interrupt_common(isr, pcid[instance]); \
198
- }
199
-
200
- #if defined(GPIO1 )
201
- GPIO_INTERRUPT_HANDLER (GPIO1_Combined_0_15_IRQHandler , GPIO1 , 1 , 0 );
202
- GPIO_INTERRUPT_HANDLER (GPIO1_Combined_16_31_IRQHandler , GPIO1 , 1 , 16 );
203
- #endif
204
- #if defined(GPIO2 )
205
- GPIO_INTERRUPT_HANDLER (GPIO2_Combined_0_15_IRQHandler , GPIO2 , 2 , 0 );
206
- GPIO_INTERRUPT_HANDLER (GPIO2_Combined_16_31_IRQHandler , GPIO2 , 2 , 16 );
207
- #endif
208
- #if defined(GPIO3 )
209
- GPIO_INTERRUPT_HANDLER (GPIO3_Combined_0_15_IRQHandler , GPIO3 , 3 , 0 );
210
- GPIO_INTERRUPT_HANDLER (GPIO3_Combined_16_31_IRQHandler , GPIO3 , 3 , 16 );
211
- #endif
212
- #if defined(GPIO4 )
213
- GPIO_INTERRUPT_HANDLER (GPIO4_Combined_0_15_IRQHandler , GPIO4 , 4 , 0 );
214
- GPIO_INTERRUPT_HANDLER (GPIO4_Combined_16_31_IRQHandler , GPIO4 , 4 , 16 );
215
- #endif
216
- #if defined(GPIO5 )
217
- GPIO_INTERRUPT_HANDLER (GPIO5_Combined_0_15_IRQHandler , GPIO5 , 5 , 0 );
218
- GPIO_INTERRUPT_HANDLER (GPIO5_Combined_16_31_IRQHandler , GPIO5 , 5 , 16 );
219
- #endif
220
- #if defined(GPIO6 )
221
- GPIO_INTERRUPT_HANDLER (GPIO6_Combined_0_15_IRQHandler , GPIO6 , 6 , 0 );
222
- GPIO_INTERRUPT_HANDLER (GPIO6_Combined_16_31_IRQHandler , GPIO6 , 6 , 16 );
223
- #endif
0 commit comments