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