@@ -120,104 +120,7 @@ void common_hal_mcu_pin_reset_number(uint8_t pin_no) {
120120 common_hal_reset_pin ((mcu_pin_obj_t * )(mcu_pin_globals .map .table [pin_no ].value ));
121121}
122122
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-
152123// The 'data' pointers may be to gc objects, they must be kept alive.
153124void pin_gc_collect () {
154125 gc_collect_root ((void * * )& pcid , sizeof (pcid ) / sizeof (void * ));
155126}
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