Skip to content

Commit de74b63

Browse files
committed
move pin change interrupt stuff to peripherals
1 parent d247e5c commit de74b63

File tree

6 files changed

+106
-101
lines changed

6 files changed

+106
-101
lines changed

ports/mimxrt10xx/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ SRC_C += \
136136
peripherals/mimxrt10xx/$(CHIP_FAMILY)/clocks.c \
137137
peripherals/mimxrt10xx/$(CHIP_FAMILY)/periph.c \
138138
peripherals/mimxrt10xx/$(CHIP_FAMILY)/pins.c \
139+
peripherals/mimxrt10xx/pins.c \
139140
reset.c \
140141
supervisor/flexspi_nor_flash_ops.c
141142

ports/mimxrt10xx/common-hal/microcontroller/Pin.c

Lines changed: 0 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
153124
void 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

ports/mimxrt10xx/common-hal/microcontroller/Pin.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@ extern const mcu_pin_obj_t *mimxrt10xx_reset_forbidden_pins[];
4545
// the port-default reset behavior.
4646
extern bool mimxrt10xx_board_reset_pin_number(const mcu_pin_obj_t *pin);
4747

48-
typedef void (gpio_change_interrupt_t)(void *data);
49-
void disable_pin_change_interrupt(const mcu_pin_obj_t *pin);
50-
void enable_pin_change_interrupt(const mcu_pin_obj_t *pin, gpio_change_interrupt_t func, void *data);
5148
void pin_gc_collect(void);
5249

5350
#endif // MICROPY_INCLUDED_MIMXRT10XX_COMMON_HAL_MICROCONTROLLER_PIN_H

ports/mimxrt10xx/common-hal/rotaryio/IncrementalEncoder.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
#include "py/runtime.h"
3535

36-
#include "fsl_gpio.h"
36+
#include "sdk/drivers/igpio/fsl_gpio.h"
3737
static void encoder_change(void *self_in) {
3838
rotaryio_incrementalencoder_obj_t *self = self_in;
3939

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#include "peripherals/mimxrt10xx/pins.h"
2+
3+
/* Array of GPIO peripheral base address. */
4+
static GPIO_Type *const s_gpioBases[] = GPIO_BASE_PTRS;
5+
static uint32_t GPIO_GetInstance(GPIO_Type *base) {
6+
uint32_t instance;
7+
8+
/* Find the instance index from base address mappings. */
9+
for (instance = 0U; instance < ARRAY_SIZE(s_gpioBases); instance++)
10+
{
11+
if (s_gpioBases[instance] == base) {
12+
break;
13+
}
14+
}
15+
16+
assert(instance < ARRAY_SIZE(s_gpioBases));
17+
18+
return instance;
19+
}
20+
21+
22+
/* to find IRQ based on GPIO */
23+
static const IRQn_Type low_irqs[] = GPIO_COMBINED_LOW_IRQS;
24+
static const IRQn_Type high_irqs[] = GPIO_COMBINED_HIGH_IRQS;
25+
26+
volatile pin_change_interrupt_data pcid[MP_ARRAY_SIZE(s_gpioBases)][32];
27+
28+
void enable_pin_change_interrupt(const mcu_pin_obj_t *pin, gpio_change_interrupt_t func, void *data) {
29+
int instance = GPIO_GetInstance(pin->gpio);
30+
volatile pin_change_interrupt_data *pci = &pcid[instance][pin->number];
31+
common_hal_mcu_disable_interrupts();
32+
pci->data = data;
33+
pci->func = func;
34+
IRQn_Type irq = pin->number < 16 ? low_irqs[instance] : high_irqs[instance];
35+
if (irq != NotAvail_IRQn) {
36+
EnableIRQ(irq);
37+
}
38+
pin->gpio->IMR |= (1 << pin->number);
39+
common_hal_mcu_enable_interrupts();
40+
}
41+
42+
void disable_pin_change_interrupt(const mcu_pin_obj_t *pin) {
43+
volatile pin_change_interrupt_data *pci = &pcid[GPIO_GetInstance(pin->gpio)][pin->number];
44+
common_hal_mcu_disable_interrupts();
45+
pin->gpio->IMR &= ~(1 << pin->number);
46+
pci->data = NULL;
47+
pci->func = NULL;
48+
pin->gpio->ISR = (1 << pin->number); // acknowledge any pending interrupt
49+
common_hal_mcu_enable_interrupts();
50+
}
51+
52+
static void pin_change_interrupt_common(uint32_t isr, volatile pin_change_interrupt_data *pcr) {
53+
for (uint32_t i = 0; i < 32; i++) {
54+
if (isr & (1 << i)) {
55+
pin_change_interrupt_data cb = pcr[i];
56+
if (cb.func) {
57+
cb.func(cb.data);
58+
}
59+
}
60+
}
61+
}
62+
63+
#define GPIO_INTERRUPT_HANDLER(name, ptr, instance, offset) \
64+
void name(void); \
65+
__attribute__((used)) void name(void) { \
66+
uint32_t isr = ptr->ISR; \
67+
ptr->ISR = isr; \
68+
pin_change_interrupt_common(isr, pcid[instance]); \
69+
}
70+
71+
#if defined(GPIO1)
72+
GPIO_INTERRUPT_HANDLER(GPIO1_Combined_0_15_IRQHandler, GPIO1, 1, 0);
73+
GPIO_INTERRUPT_HANDLER(GPIO1_Combined_16_31_IRQHandler, GPIO1, 1, 16);
74+
#endif
75+
#if defined(GPIO2)
76+
GPIO_INTERRUPT_HANDLER(GPIO2_Combined_0_15_IRQHandler, GPIO2, 2, 0);
77+
GPIO_INTERRUPT_HANDLER(GPIO2_Combined_16_31_IRQHandler, GPIO2, 2, 16);
78+
#endif
79+
#if defined(GPIO3)
80+
GPIO_INTERRUPT_HANDLER(GPIO3_Combined_0_15_IRQHandler, GPIO3, 3, 0);
81+
GPIO_INTERRUPT_HANDLER(GPIO3_Combined_16_31_IRQHandler, GPIO3, 3, 16);
82+
#endif
83+
#if defined(GPIO4)
84+
GPIO_INTERRUPT_HANDLER(GPIO4_Combined_0_15_IRQHandler, GPIO4, 4, 0);
85+
GPIO_INTERRUPT_HANDLER(GPIO4_Combined_16_31_IRQHandler, GPIO4, 4, 16);
86+
#endif
87+
#if defined(GPIO5)
88+
GPIO_INTERRUPT_HANDLER(GPIO5_Combined_0_15_IRQHandler, GPIO5, 5, 0);
89+
GPIO_INTERRUPT_HANDLER(GPIO5_Combined_16_31_IRQHandler, GPIO5, 5, 16);
90+
#endif
91+
#if defined(GPIO6)
92+
GPIO_INTERRUPT_HANDLER(GPIO6_Combined_0_15_IRQHandler, GPIO6, 6, 0);
93+
GPIO_INTERRUPT_HANDLER(GPIO6_Combined_16_31_IRQHandler, GPIO6, 6, 16);
94+
#endif

ports/mimxrt10xx/peripherals/mimxrt10xx/pins.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,16 @@ typedef struct {
7272
.pad_reset = p_pad_reset, \
7373
}
7474

75+
typedef void (gpio_change_interrupt_t)(void *data);
76+
typedef struct {
77+
gpio_change_interrupt_t *func;
78+
void *data;
79+
} pin_change_interrupt_data;
80+
extern volatile pin_change_interrupt_data pcid[MP_ARRAY_SIZE((GPIO_Type *const[])GPIO_BASE_PTRS)][32];
81+
82+
void disable_pin_change_interrupt(const mcu_pin_obj_t *pin);
83+
void enable_pin_change_interrupt(const mcu_pin_obj_t *pin, gpio_change_interrupt_t func, void *data);
84+
7585
#ifdef MIMXRT1011_SERIES
7686
#include "MIMXRT1011/pins.h"
7787
#elif defined(MIMXRT1021_SERIES)

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy