Skip to content

Commit 792c7f2

Browse files
committed
Merge pull request #88 from 0xc0170/dev_gpio_irq_endis
Dev gpio irq endis
2 parents 1bb844c + 5129cd0 commit 792c7f2

File tree

14 files changed

+174
-1
lines changed

14 files changed

+174
-1
lines changed

libraries/mbed/api/InterruptIn.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ class InterruptIn {
167167
*
168168
* @returns
169169
* The function object created for 'fptr'
170-
*/
170+
*/
171171
pFunctionPointer_t fall_add(void (*fptr)(void)) {
172172
return fall_add_common(fptr);
173173
}
@@ -240,6 +240,14 @@ class InterruptIn {
240240
*/
241241
void mode(PinMode pull);
242242

243+
/** Enable IRQ
244+
*/
245+
void enable_irq();
246+
247+
/** Disable IRQ
248+
*/
249+
void disable_irq();
250+
243251
static void _irq_handler(uint32_t id, gpio_irq_event event);
244252

245253
protected:

libraries/mbed/common/InterruptIn.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,14 @@ void InterruptIn::_irq_handler(uint32_t id, gpio_irq_event event) {
9999
}
100100
}
101101

102+
void InterruptIn::enable_irq() {
103+
gpio_irq_enable(&gpio_irq);
104+
}
105+
106+
void InterruptIn::disable_irq() {
107+
gpio_irq_disable(&gpio_irq);
108+
}
109+
102110
#ifdef MBED_OPERATORS
103111
InterruptIn::operator int() {
104112
return read();

libraries/mbed/hal/gpio_irq_api.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ typedef void (*gpio_irq_handler)(uint32_t id, gpio_irq_event event);
3737
int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id);
3838
void gpio_irq_free(gpio_irq_t *obj);
3939
void gpio_irq_set (gpio_irq_t *obj, gpio_irq_event event, uint32_t enable);
40+
void gpio_irq_enable(gpio_irq_t *obj);
41+
void gpio_irq_disable(gpio_irq_t *obj);
4042

4143
#ifdef __cplusplus
4244
}

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL05Z/gpio_irq_api.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,19 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
154154
// Interrupt configuration and clear interrupt
155155
port->PCR[obj->pin] = (port->PCR[obj->pin] & ~PORT_PCR_IRQC_MASK) | irq_settings | PORT_PCR_ISF_MASK;
156156
}
157+
158+
void gpio_irq_enable(gpio_irq_t *obj) {
159+
if (obj->port == PortA) {
160+
NVIC_EnableIRQ(PORTA_IRQn);
161+
} else if (obj->port == PortB) {
162+
NVIC_EnableIRQ(PORTB_IRQn);
163+
}
164+
}
165+
166+
void gpio_irq_disable(gpio_irq_t *obj) {
167+
if (obj->port == PortA) {
168+
NVIC_DisableIRQ(PORTA_IRQn);
169+
} else if (obj->port == PortB) {
170+
NVIC_DisableIRQ(PORTB_IRQn);
171+
}
172+
}

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL25Z/gpio_irq_api.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,19 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
143143
// Interrupt configuration and clear interrupt
144144
port->PCR[obj->pin] = (port->PCR[obj->pin] & ~PORT_PCR_IRQC_MASK) | irq_settings | PORT_PCR_ISF_MASK;
145145
}
146+
147+
void gpio_irq_enable(gpio_irq_t *obj) {
148+
if (obj->port == PortA) {
149+
NVIC_EnableIRQ(PORTA_IRQn);
150+
} else if (obj->port == PortD) {
151+
NVIC_EnableIRQ(PORTD_IRQn);
152+
}
153+
}
154+
155+
void gpio_irq_disable(gpio_irq_t *obj) {
156+
if (obj->port == PortA) {
157+
NVIC_DisableIRQ(PORTA_IRQn);
158+
} else if (obj->port == PortD) {
159+
NVIC_DisableIRQ(PORTD_IRQn);
160+
}
161+
}

libraries/mbed/targets/hal/TARGET_Freescale/TARGET_KL46Z/gpio_irq_api.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,19 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
143143
// Interrupt configuration and clear interrupt
144144
port->PCR[obj->pin] = (port->PCR[obj->pin] & ~PORT_PCR_IRQC_MASK) | irq_settings | PORT_PCR_ISF_MASK;
145145
}
146+
147+
void gpio_irq_enable(gpio_irq_t *obj) {
148+
if (obj->port == PortA) {
149+
NVIC_EnableIRQ(PORTA_IRQn);
150+
} else if (obj->port == PortD) {
151+
NVIC_EnableIRQ(PORTD_IRQn);
152+
}
153+
}
154+
155+
void gpio_irq_disable(gpio_irq_t *obj) {
156+
if (obj->port == PortA) {
157+
NVIC_DisableIRQ(PORTA_IRQn);
158+
} else if (obj->port == PortD) {
159+
NVIC_DisableIRQ(PORTD_IRQn);
160+
}
161+
}

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11UXX/gpio_irq_api.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,11 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
131131
}
132132
}
133133
}
134+
135+
void gpio_irq_enable(gpio_irq_t *obj) {
136+
NVIC_EnableIRQ((IRQn_Type)(PININT_IRQ + obj->ch));
137+
}
138+
139+
void gpio_irq_disable(gpio_irq_t *obj) {
140+
NVIC_DisableIRQ((IRQn_Type)(PININT_IRQ + obj->ch));
141+
}

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC11XX_11CXX/gpio_irq_api.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,3 +174,43 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
174174
}
175175

176176
}
177+
178+
void gpio_irq_enable(gpio_irq_t *obj) {
179+
uint32_t port_num = ((obj->pin & 0xF000) >> PORT_SHIFT);
180+
switch (port_num) {
181+
case 0:
182+
NVIC_EnableIRQ(EINT0_IRQn);
183+
break;
184+
case 1:
185+
NVIC_EnableIRQ(EINT1_IRQn);
186+
break;
187+
case 2:
188+
NVIC_EnableIRQ(EINT2_IRQn);
189+
break;
190+
case 3:
191+
NVIC_EnableIRQ(EINT3_IRQn);
192+
break;
193+
default:
194+
break;
195+
}
196+
}
197+
198+
void gpio_irq_disable(gpio_irq_t *obj) {
199+
uint32_t port_num = ((obj->pin & 0xF000) >> PORT_SHIFT);
200+
switch (port_num) {
201+
case 0:
202+
NVIC_DisableIRQ(EINT0_IRQn);
203+
break;
204+
case 1:
205+
NVIC_DisableIRQ(EINT1_IRQn);
206+
break;
207+
case 2:
208+
NVIC_DisableIRQ(EINT2_IRQn);
209+
break;
210+
case 3:
211+
NVIC_DisableIRQ(EINT3_IRQn);
212+
break;
213+
default:
214+
break;
215+
}
216+
}

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC13XX/gpio_irq_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,3 +131,12 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
131131
}
132132
}
133133
}
134+
135+
void gpio_irq_enable(gpio_irq_t *obj) {
136+
NVIC_EnableIRQ((IRQn_Type)(PININT_IRQ + obj->ch));
137+
}
138+
139+
void gpio_irq_disable(gpio_irq_t *obj) {
140+
NVIC_DisableIRQ((IRQn_Type)(PININT_IRQ + obj->ch));
141+
}
142+

libraries/mbed/targets/hal/TARGET_NXP/TARGET_LPC176X/gpio_irq_api.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,12 @@ void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) {
150150
}
151151
}
152152
}
153+
154+
void gpio_irq_enable(gpio_irq_t *obj) {
155+
NVIC_EnableIRQ(EINT3_IRQn);
156+
}
157+
158+
void gpio_irq_disable(gpio_irq_t *obj) {
159+
NVIC_DisableIRQ(EINT3_IRQn);
160+
}
161+

0 commit comments

Comments
 (0)