1 /** mbed Microcontroller Library
2 ******************************************************************************
3 * @file gpio_irq_api.c
4 * @author
5 * @version V1.0.0
6 * @date 2016-08-01
7 * @brief This file provides mbed API for GPIO IRQ.
8 ******************************************************************************
9 * @attention
10 *
11 * This module is a confidential and proprietary property of RealTek and
12 * possession or use of this module requires written permission of RealTek.
13 *
14 * Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
15 ******************************************************************************
16 */
17
18 #include "objects.h"
19 #include "pinmap.h"
20
21 #include "gpio_irq_api.h"
22 #include "gpio_irq_ex_api.h"
23
24 /** @addtogroup AmebaD_Mbed_API
25 * @{
26 */
27
28 /** @defgroup MBED_GPIOIRQ
29 * @brief MBED_GPIOIRQ driver modules.
30 * @{
31 */
32
33 /** @defgroup MBED_GPIOIRQ_Exported_Functions MBED_GPIOIRQ Exported Functions
34 * @{
35 */
36
37 /**
38 * @brief Initializes the GPIO device interrupt mode, include mode/trigger/polarity registers.
39 * @param obj: gpio irq object define in application software.
40 * @param pin: PinName according to pinmux spec.
41 * @param handler: Interrupt handler to be assigned to the specified pin.
42 * @param id: handler parameter.
43 * @retval none
44 */
gpio_irq_init(gpio_irq_t * obj,PinName pin,gpio_irq_handler handler,uint32_t id)45 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
46 {
47 GPIO_InitTypeDef GPIO_InitStruct;
48 u8 port_num;
49
50 if (pin == NC) return -1;
51
52 obj->pin = pin;
53
54 port_num = PORT_NUM(pin);
55
56 GPIO_INTConfig(pin, DISABLE);
57
58 GPIO_InitStruct.GPIO_Pin = obj->pin;
59 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_INT;
60 GPIO_InitStruct.GPIO_ITTrigger = GPIO_INT_Trigger_EDGE;
61 GPIO_InitStruct.GPIO_ITPolarity = GPIO_INT_POLARITY_ACTIVE_LOW;
62
63 GPIO_Init(&GPIO_InitStruct);
64
65 if (port_num == GPIO_PORT_A) {
66 InterruptRegister(GPIO_INTHandler, GPIOA_IRQ, (u32)GPIOA_BASE, 5);
67 InterruptEn(GPIOA_IRQ, 5);
68 } else if (port_num == GPIO_PORT_B) {
69 InterruptRegister(GPIO_INTHandler, GPIOB_IRQ, (u32)GPIOB_BASE, 5);
70 InterruptEn(GPIOB_IRQ, 5);
71 }
72
73 GPIO_UserRegIrq(GPIO_InitStruct.GPIO_Pin, (VOID*) handler, (VOID*) id);
74
75 return 0;
76 }
77
78 /**
79 * @brief Deinitializes the GPIO device interrupt mode, include mode/trigger/polarity registers.
80 * @param obj: gpio irq object define in application software.
81 * @retval none
82 */
gpio_irq_free(gpio_irq_t * obj)83 void gpio_irq_free(gpio_irq_t *obj)
84 {
85 GPIO_DeInit(obj->pin);
86 }
87
88 /**
89 * @brief Enable/Disable gpio interrupt.
90 * @param obj: gpio irq object define in application software.
91 * @param event: gpio interrupt event, this parameter can be one of the following values:
92 * @arg IRQ_RISE: rising edge interrupt event
93 * @arg IRQ_FALL: falling edge interrupt event
94 * @arg IRQ_LOW: low level interrupt event
95 * @arg IRQ_HIGH: high level interrupt event
96 * @arg IRQ_NONE: no interrupt event
97 * @param enable: this parameter can be one of the following values:
98 * @arg 0 disable gpio interrupt
99 * @arg 1 enable gpio interrupt
100 * @retval none
101 */
gpio_irq_set(gpio_irq_t * obj,gpio_irq_event event,uint32_t enable)102 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
103 {
104 u32 GPIO_ITTrigger;
105 u32 GPIO_ITPolarity;
106
107 switch((uint8_t)event) {
108 case IRQ_RISE:
109 GPIO_ITTrigger = GPIO_INT_Trigger_EDGE;
110 GPIO_ITPolarity = GPIO_INT_POLARITY_ACTIVE_HIGH;
111 break;
112
113 case IRQ_FALL:
114 GPIO_ITTrigger = GPIO_INT_Trigger_EDGE;
115 GPIO_ITPolarity = GPIO_INT_POLARITY_ACTIVE_LOW;
116 break;
117
118 case IRQ_LOW:
119 GPIO_ITTrigger = GPIO_INT_Trigger_LEVEL;
120 GPIO_ITPolarity = GPIO_INT_POLARITY_ACTIVE_LOW;
121 break;
122
123 case IRQ_HIGH:
124 GPIO_ITTrigger = GPIO_INT_Trigger_LEVEL;
125 GPIO_ITPolarity = GPIO_INT_POLARITY_ACTIVE_HIGH;
126 break;
127
128 case IRQ_NONE:
129 // ?
130 break;
131
132 default:
133 break;
134 }
135
136 if (enable) {
137 GPIO_INTMode(obj->pin, ENABLE, GPIO_ITTrigger, GPIO_ITPolarity, GPIO_INT_DEBOUNCE_ENABLE);
138 } else {
139 GPIO_INTMode(obj->pin, DISABLE, 0, 0, 0);
140 }
141 }
142
143 /**
144 * @brief Enable gpio interrupt.
145 * @param obj: gpio irq object define in application software.
146 * @retval none
147 */
gpio_irq_enable(gpio_irq_t * obj)148 void gpio_irq_enable(gpio_irq_t *obj)
149 {
150 GPIO_INTConfig(obj->pin, ENABLE);
151 }
152
153 /**
154 * @brief Disable gpio interrupt.
155 * @param obj: gpio irq object define in application software.
156 * @retval none
157 */
gpio_irq_disable(gpio_irq_t * obj)158 void gpio_irq_disable(gpio_irq_t *obj)
159 {
160 GPIO_INTConfig(obj->pin, DISABLE);
161 }
162
163 /**
164 * @brief Deinitializes the GPIO device interrupt mode, include mode/trigger/polarity registers.
165 * @param obj: gpio irq object define in application software.
166 * @retval none
167 */
gpio_irq_deinit(gpio_irq_t * obj)168 void gpio_irq_deinit(gpio_irq_t *obj)
169 {
170 GPIO_DeInit(obj->pin);
171 }
172
173 /**
174 * @brief Sets pull type to the selected interrupt pin.
175 * @param obj: gpio irq object define in application software.
176 * @param pull_type: this parameter can be one of the following values:
177 * @arg PullNone: HighZ, user can input high or low use this pin
178 * @arg PullDown: pull down
179 * @arg PullUp: pull up
180 * @retval none
181 */
gpio_irq_pull_ctrl(gpio_irq_t * obj,PinMode pull_type)182 void gpio_irq_pull_ctrl(gpio_irq_t *obj, PinMode pull_type)
183 {
184 u32 GPIO_PuPd;
185
186 switch (pull_type) {
187 case PullNone:/* No driver -> Input & High Impendance */
188 GPIO_PuPd = GPIO_PuPd_NOPULL;
189 break;
190
191 case PullDown:
192 GPIO_PuPd = GPIO_PuPd_DOWN;
193 break;
194
195 case PullUp:
196 GPIO_PuPd = GPIO_PuPd_UP;
197 break;
198
199 default:
200 GPIO_PuPd = GPIO_PuPd_NOPULL;
201 break;
202 }
203
204 PAD_PullCtrl(obj->pin, GPIO_PuPd);
205 }
206
207 /**
208 * @brief Enable the specified gpio interrupt event.
209 * @param obj: gpio irq object define in application software.
210 * @param event: gpio interrupt event, this parameter can be one of the following values:
211 * @arg IRQ_RISE: rising edge interrupt event
212 * @arg IRQ_FALL: falling edge interrupt event
213 * @arg IRQ_LOW: low level interrupt event
214 * @arg IRQ_HIGH: high level interrupt event
215 * @arg IRQ_NONE: no interrupt event
216 * @retval none
217 */
gpio_irq_set_event(gpio_irq_t * obj,gpio_irq_event event)218 void gpio_irq_set_event(gpio_irq_t *obj, gpio_irq_event event)
219 {
220 gpio_irq_set(obj, event, ENABLE);
221 }
222 /**
223 * @}
224 */
225
226 /**
227 * @}
228 */
229
230 /**
231 * @}
232 */
233 /******************* (C) COPYRIGHT 2016 Realtek Semiconductor *****END OF FILE****/
234