mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Wed Jun 21 17:46:44 2017 +0100
Revision:
167:e84263d55307
Child:
184:08ed48f1de7f
This updates the lib to the mbed lib v 145

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2006-2017 ARM Limited
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16 #include <stddef.h>
AnnaBridge 167:e84263d55307 17 #include "cmsis.h"
AnnaBridge 167:e84263d55307 18 #include "gpio_irq_api.h"
AnnaBridge 167:e84263d55307 19 #include "mbed_error.h"
AnnaBridge 167:e84263d55307 20
AnnaBridge 167:e84263d55307 21 #define CHANNEL_NUM 32
AnnaBridge 167:e84263d55307 22 #define CMSDK_GPIO_0 CMSDK_GPIO0
AnnaBridge 167:e84263d55307 23 #define CMSDK_GPIO_1 CMSDK_GPIO1
AnnaBridge 167:e84263d55307 24 #define PININT_IRQ 0
AnnaBridge 167:e84263d55307 25
AnnaBridge 167:e84263d55307 26 static uint32_t channel_ids[CHANNEL_NUM] = {0};
AnnaBridge 167:e84263d55307 27 static gpio_irq_handler irq_handler;
AnnaBridge 167:e84263d55307 28
AnnaBridge 167:e84263d55307 29 static inline void handle_interrupt_in(uint32_t channel)
AnnaBridge 167:e84263d55307 30 {
AnnaBridge 167:e84263d55307 31 uint32_t ch_bit = (1 << channel);
AnnaBridge 167:e84263d55307 32 // Return immediately if:
AnnaBridge 167:e84263d55307 33 // * The interrupt was already served
AnnaBridge 167:e84263d55307 34 // * There is no user handler
AnnaBridge 167:e84263d55307 35 // * It is a level interrupt, not an edge interrupt
AnnaBridge 167:e84263d55307 36 if (ch_bit < 16) {
AnnaBridge 167:e84263d55307 37 if (((CMSDK_GPIO_0->INTSTATUS) == 0)
AnnaBridge 167:e84263d55307 38 || (channel_ids[channel] == 0)
AnnaBridge 167:e84263d55307 39 || ((CMSDK_GPIO_0->INTTYPESET) == 0) ) {
AnnaBridge 167:e84263d55307 40 return;
AnnaBridge 167:e84263d55307 41 }
AnnaBridge 167:e84263d55307 42
AnnaBridge 167:e84263d55307 43 if ((CMSDK_GPIO_0->INTTYPESET & ch_bit) && (CMSDK_GPIO_0->INTPOLSET & ch_bit)) {
AnnaBridge 167:e84263d55307 44 irq_handler(channel_ids[channel], IRQ_RISE);
AnnaBridge 167:e84263d55307 45 CMSDK_GPIO_0->INTPOLSET = ch_bit;
AnnaBridge 167:e84263d55307 46 }
AnnaBridge 167:e84263d55307 47 if ((CMSDK_GPIO_0->INTTYPESET & ch_bit) && ~(CMSDK_GPIO_0->INTPOLSET & ch_bit)) {
AnnaBridge 167:e84263d55307 48 irq_handler(channel_ids[channel], IRQ_FALL);
AnnaBridge 167:e84263d55307 49 }
AnnaBridge 167:e84263d55307 50
AnnaBridge 167:e84263d55307 51 CMSDK_GPIO_0->INTCLEAR = ch_bit;
AnnaBridge 167:e84263d55307 52 } else {
AnnaBridge 167:e84263d55307 53 if (((CMSDK_GPIO_1->INTSTATUS) == 0)
AnnaBridge 167:e84263d55307 54 || (channel_ids[channel] == 0)
AnnaBridge 167:e84263d55307 55 || ((CMSDK_GPIO_1->INTTYPESET) == 0)) {
AnnaBridge 167:e84263d55307 56 return;
AnnaBridge 167:e84263d55307 57 }
AnnaBridge 167:e84263d55307 58
AnnaBridge 167:e84263d55307 59 if ((CMSDK_GPIO_1->INTTYPESET & ch_bit) && (CMSDK_GPIO_1->INTPOLSET & ch_bit)) {
AnnaBridge 167:e84263d55307 60 irq_handler(channel_ids[channel], IRQ_RISE);
AnnaBridge 167:e84263d55307 61 CMSDK_GPIO_1->INTPOLSET = ch_bit;
AnnaBridge 167:e84263d55307 62 }
AnnaBridge 167:e84263d55307 63 if ((CMSDK_GPIO_1->INTTYPESET & ch_bit) && ~(CMSDK_GPIO_1->INTPOLSET & ch_bit)) {
AnnaBridge 167:e84263d55307 64 irq_handler(channel_ids[channel], IRQ_FALL);
AnnaBridge 167:e84263d55307 65 }
AnnaBridge 167:e84263d55307 66 CMSDK_GPIO_1->INTCLEAR = ch_bit;
AnnaBridge 167:e84263d55307 67 }
AnnaBridge 167:e84263d55307 68 }
AnnaBridge 167:e84263d55307 69
AnnaBridge 167:e84263d55307 70 void gpio0_irq0(void)
AnnaBridge 167:e84263d55307 71 {
AnnaBridge 167:e84263d55307 72 handle_interrupt_in(0);
AnnaBridge 167:e84263d55307 73 }
AnnaBridge 167:e84263d55307 74
AnnaBridge 167:e84263d55307 75 void gpio0_irq1(void)
AnnaBridge 167:e84263d55307 76 {
AnnaBridge 167:e84263d55307 77 handle_interrupt_in(1);
AnnaBridge 167:e84263d55307 78 }
AnnaBridge 167:e84263d55307 79
AnnaBridge 167:e84263d55307 80 void gpio0_irq2(void)
AnnaBridge 167:e84263d55307 81 {
AnnaBridge 167:e84263d55307 82 handle_interrupt_in(2);
AnnaBridge 167:e84263d55307 83 }
AnnaBridge 167:e84263d55307 84
AnnaBridge 167:e84263d55307 85 void gpio0_irq3(void)
AnnaBridge 167:e84263d55307 86 {
AnnaBridge 167:e84263d55307 87 handle_interrupt_in(3);
AnnaBridge 167:e84263d55307 88 }
AnnaBridge 167:e84263d55307 89
AnnaBridge 167:e84263d55307 90 void gpio0_irq4(void)
AnnaBridge 167:e84263d55307 91 {
AnnaBridge 167:e84263d55307 92 handle_interrupt_in(4);
AnnaBridge 167:e84263d55307 93 }
AnnaBridge 167:e84263d55307 94
AnnaBridge 167:e84263d55307 95 void gpio0_irq5(void)
AnnaBridge 167:e84263d55307 96 {
AnnaBridge 167:e84263d55307 97 handle_interrupt_in(5);
AnnaBridge 167:e84263d55307 98 }
AnnaBridge 167:e84263d55307 99
AnnaBridge 167:e84263d55307 100 void gpio0_irq6(void)
AnnaBridge 167:e84263d55307 101 {
AnnaBridge 167:e84263d55307 102 handle_interrupt_in(6);
AnnaBridge 167:e84263d55307 103 }
AnnaBridge 167:e84263d55307 104
AnnaBridge 167:e84263d55307 105 void gpio0_irq7(void)
AnnaBridge 167:e84263d55307 106 {
AnnaBridge 167:e84263d55307 107 handle_interrupt_in(7);
AnnaBridge 167:e84263d55307 108 }
AnnaBridge 167:e84263d55307 109
AnnaBridge 167:e84263d55307 110 void gpio0_irq8(void)
AnnaBridge 167:e84263d55307 111 {
AnnaBridge 167:e84263d55307 112 handle_interrupt_in(8);
AnnaBridge 167:e84263d55307 113 }
AnnaBridge 167:e84263d55307 114
AnnaBridge 167:e84263d55307 115 void gpio0_irq9(void)
AnnaBridge 167:e84263d55307 116 {
AnnaBridge 167:e84263d55307 117 handle_interrupt_in(9);
AnnaBridge 167:e84263d55307 118 }
AnnaBridge 167:e84263d55307 119
AnnaBridge 167:e84263d55307 120 void gpio0_irq10(void)
AnnaBridge 167:e84263d55307 121 {
AnnaBridge 167:e84263d55307 122 handle_interrupt_in(10);
AnnaBridge 167:e84263d55307 123 }
AnnaBridge 167:e84263d55307 124
AnnaBridge 167:e84263d55307 125 void gpio0_irq11(void)
AnnaBridge 167:e84263d55307 126 {
AnnaBridge 167:e84263d55307 127 handle_interrupt_in(11);
AnnaBridge 167:e84263d55307 128 }
AnnaBridge 167:e84263d55307 129
AnnaBridge 167:e84263d55307 130 void gpio0_irq12(void)
AnnaBridge 167:e84263d55307 131 {
AnnaBridge 167:e84263d55307 132 handle_interrupt_in(12);
AnnaBridge 167:e84263d55307 133 }
AnnaBridge 167:e84263d55307 134
AnnaBridge 167:e84263d55307 135 void gpio0_irq13(void)
AnnaBridge 167:e84263d55307 136 {
AnnaBridge 167:e84263d55307 137 handle_interrupt_in(13);
AnnaBridge 167:e84263d55307 138 }
AnnaBridge 167:e84263d55307 139
AnnaBridge 167:e84263d55307 140 void gpio0_irq14(void)
AnnaBridge 167:e84263d55307 141 {
AnnaBridge 167:e84263d55307 142 handle_interrupt_in(14);
AnnaBridge 167:e84263d55307 143 }
AnnaBridge 167:e84263d55307 144
AnnaBridge 167:e84263d55307 145 void gpio0_irq15(void)
AnnaBridge 167:e84263d55307 146 {
AnnaBridge 167:e84263d55307 147 handle_interrupt_in(15);
AnnaBridge 167:e84263d55307 148 }
AnnaBridge 167:e84263d55307 149
AnnaBridge 167:e84263d55307 150 void gpio1_irq0(void)
AnnaBridge 167:e84263d55307 151 {
AnnaBridge 167:e84263d55307 152 handle_interrupt_in(16);
AnnaBridge 167:e84263d55307 153 }
AnnaBridge 167:e84263d55307 154
AnnaBridge 167:e84263d55307 155 void gpio1_irq1(void)
AnnaBridge 167:e84263d55307 156 {
AnnaBridge 167:e84263d55307 157 handle_interrupt_in(17);
AnnaBridge 167:e84263d55307 158 }
AnnaBridge 167:e84263d55307 159 void gpio1_irq2(void)
AnnaBridge 167:e84263d55307 160 {
AnnaBridge 167:e84263d55307 161 handle_interrupt_in(18);
AnnaBridge 167:e84263d55307 162 }
AnnaBridge 167:e84263d55307 163
AnnaBridge 167:e84263d55307 164 void gpio1_irq3(void)
AnnaBridge 167:e84263d55307 165 {
AnnaBridge 167:e84263d55307 166 handle_interrupt_in(19);
AnnaBridge 167:e84263d55307 167 }
AnnaBridge 167:e84263d55307 168
AnnaBridge 167:e84263d55307 169 void gpio1_irq4(void)
AnnaBridge 167:e84263d55307 170 {
AnnaBridge 167:e84263d55307 171 handle_interrupt_in(20);
AnnaBridge 167:e84263d55307 172 }
AnnaBridge 167:e84263d55307 173
AnnaBridge 167:e84263d55307 174 void gpio1_irq5(void)
AnnaBridge 167:e84263d55307 175 {
AnnaBridge 167:e84263d55307 176 handle_interrupt_in(21);
AnnaBridge 167:e84263d55307 177 }
AnnaBridge 167:e84263d55307 178
AnnaBridge 167:e84263d55307 179 void gpio1_irq6(void)
AnnaBridge 167:e84263d55307 180 {
AnnaBridge 167:e84263d55307 181 handle_interrupt_in(22);
AnnaBridge 167:e84263d55307 182 }
AnnaBridge 167:e84263d55307 183
AnnaBridge 167:e84263d55307 184 void gpio1_irq7(void)
AnnaBridge 167:e84263d55307 185 {
AnnaBridge 167:e84263d55307 186 handle_interrupt_in(23);
AnnaBridge 167:e84263d55307 187 }
AnnaBridge 167:e84263d55307 188
AnnaBridge 167:e84263d55307 189 void gpio1_irq8(void)
AnnaBridge 167:e84263d55307 190 {
AnnaBridge 167:e84263d55307 191 handle_interrupt_in(24);
AnnaBridge 167:e84263d55307 192 }
AnnaBridge 167:e84263d55307 193
AnnaBridge 167:e84263d55307 194 void gpio1_irq9(void)
AnnaBridge 167:e84263d55307 195 {
AnnaBridge 167:e84263d55307 196 handle_interrupt_in(25);
AnnaBridge 167:e84263d55307 197 }
AnnaBridge 167:e84263d55307 198
AnnaBridge 167:e84263d55307 199 void gpio1_irq10(void)
AnnaBridge 167:e84263d55307 200 {
AnnaBridge 167:e84263d55307 201 handle_interrupt_in(26);
AnnaBridge 167:e84263d55307 202 }
AnnaBridge 167:e84263d55307 203
AnnaBridge 167:e84263d55307 204 void gpio1_irq11(void)
AnnaBridge 167:e84263d55307 205 {
AnnaBridge 167:e84263d55307 206 handle_interrupt_in(27);
AnnaBridge 167:e84263d55307 207 }
AnnaBridge 167:e84263d55307 208
AnnaBridge 167:e84263d55307 209 void gpio1_irq12(void)
AnnaBridge 167:e84263d55307 210 {
AnnaBridge 167:e84263d55307 211 handle_interrupt_in(28);
AnnaBridge 167:e84263d55307 212 }
AnnaBridge 167:e84263d55307 213
AnnaBridge 167:e84263d55307 214 void gpio1_irq13(void)
AnnaBridge 167:e84263d55307 215 {
AnnaBridge 167:e84263d55307 216 handle_interrupt_in(29);
AnnaBridge 167:e84263d55307 217 }
AnnaBridge 167:e84263d55307 218
AnnaBridge 167:e84263d55307 219 void gpio1_irq14(void)
AnnaBridge 167:e84263d55307 220 {
AnnaBridge 167:e84263d55307 221 handle_interrupt_in(30);
AnnaBridge 167:e84263d55307 222 }
AnnaBridge 167:e84263d55307 223
AnnaBridge 167:e84263d55307 224 void gpio1_irq15(void)
AnnaBridge 167:e84263d55307 225 {
AnnaBridge 167:e84263d55307 226 handle_interrupt_in(31);
AnnaBridge 167:e84263d55307 227 }
AnnaBridge 167:e84263d55307 228
AnnaBridge 167:e84263d55307 229 int gpio_irq_init(gpio_irq_t *obj, PinName pin,
AnnaBridge 167:e84263d55307 230 gpio_irq_handler handler, uint32_t id)
AnnaBridge 167:e84263d55307 231 {
AnnaBridge 167:e84263d55307 232 int found_free_channel = 0;
AnnaBridge 167:e84263d55307 233 int i = 0;
AnnaBridge 167:e84263d55307 234
AnnaBridge 167:e84263d55307 235 if (pin == NC) {
AnnaBridge 167:e84263d55307 236 return -1;
AnnaBridge 167:e84263d55307 237 }
AnnaBridge 167:e84263d55307 238
AnnaBridge 167:e84263d55307 239 irq_handler = handler;
AnnaBridge 167:e84263d55307 240
AnnaBridge 167:e84263d55307 241 for (i=0; i<CHANNEL_NUM; i++) {
AnnaBridge 167:e84263d55307 242 if (channel_ids[i] == 0) {
AnnaBridge 167:e84263d55307 243 channel_ids[i] = id;
AnnaBridge 167:e84263d55307 244 obj->ch = i;
AnnaBridge 167:e84263d55307 245 found_free_channel = 1;
AnnaBridge 167:e84263d55307 246 break;
AnnaBridge 167:e84263d55307 247 }
AnnaBridge 167:e84263d55307 248 }
AnnaBridge 167:e84263d55307 249
AnnaBridge 167:e84263d55307 250 if (!found_free_channel) {
AnnaBridge 167:e84263d55307 251 return -1;
AnnaBridge 167:e84263d55307 252 }
AnnaBridge 167:e84263d55307 253
AnnaBridge 167:e84263d55307 254 /* To select a pin for any of the eight pin interrupts, write the pin number
AnnaBridge 167:e84263d55307 255 * as 0 to 23 for pins PIO0_0 to PIO0_23 and 24 to 55.
AnnaBridge 167:e84263d55307 256 * @see: mbed_capi/PinNames.h
AnnaBridge 167:e84263d55307 257 */
AnnaBridge 167:e84263d55307 258 if (pin <16) {
AnnaBridge 167:e84263d55307 259 CMSDK_GPIO_0->INTENSET |= (0x1 << pin);
AnnaBridge 167:e84263d55307 260 }
AnnaBridge 167:e84263d55307 261
AnnaBridge 167:e84263d55307 262 if (pin >= 16) {
AnnaBridge 167:e84263d55307 263 CMSDK_GPIO_1->INTENSET |= (0x1 << pin);
AnnaBridge 167:e84263d55307 264 }
AnnaBridge 167:e84263d55307 265
AnnaBridge 167:e84263d55307 266 void (*channels_irq)(void) = NULL;
AnnaBridge 167:e84263d55307 267 switch (obj->ch) {
AnnaBridge 167:e84263d55307 268 case 0:
AnnaBridge 167:e84263d55307 269 channels_irq = &gpio0_irq0;
AnnaBridge 167:e84263d55307 270 break;
AnnaBridge 167:e84263d55307 271 case 1:
AnnaBridge 167:e84263d55307 272 channels_irq = &gpio0_irq1;
AnnaBridge 167:e84263d55307 273 break;
AnnaBridge 167:e84263d55307 274 case 2:
AnnaBridge 167:e84263d55307 275 channels_irq = &gpio0_irq2;
AnnaBridge 167:e84263d55307 276 break;
AnnaBridge 167:e84263d55307 277 case 3:
AnnaBridge 167:e84263d55307 278 channels_irq = &gpio0_irq3;
AnnaBridge 167:e84263d55307 279 break;
AnnaBridge 167:e84263d55307 280 case 4:
AnnaBridge 167:e84263d55307 281 channels_irq = &gpio0_irq4;
AnnaBridge 167:e84263d55307 282 break;
AnnaBridge 167:e84263d55307 283 case 5:
AnnaBridge 167:e84263d55307 284 channels_irq = &gpio0_irq5;
AnnaBridge 167:e84263d55307 285 break;
AnnaBridge 167:e84263d55307 286 case 6:
AnnaBridge 167:e84263d55307 287 channels_irq = &gpio0_irq6;
AnnaBridge 167:e84263d55307 288 break;
AnnaBridge 167:e84263d55307 289 case 7:
AnnaBridge 167:e84263d55307 290 channels_irq = &gpio0_irq7;
AnnaBridge 167:e84263d55307 291 break;
AnnaBridge 167:e84263d55307 292 case 8:
AnnaBridge 167:e84263d55307 293 channels_irq = &gpio0_irq8;
AnnaBridge 167:e84263d55307 294 break;
AnnaBridge 167:e84263d55307 295 case 9:
AnnaBridge 167:e84263d55307 296 channels_irq = &gpio0_irq9;
AnnaBridge 167:e84263d55307 297 break;
AnnaBridge 167:e84263d55307 298 case 10:
AnnaBridge 167:e84263d55307 299 channels_irq = &gpio0_irq10;
AnnaBridge 167:e84263d55307 300 break;
AnnaBridge 167:e84263d55307 301 case 11:
AnnaBridge 167:e84263d55307 302 channels_irq = &gpio0_irq11;
AnnaBridge 167:e84263d55307 303 break;
AnnaBridge 167:e84263d55307 304 case 12:
AnnaBridge 167:e84263d55307 305 channels_irq = &gpio0_irq12;
AnnaBridge 167:e84263d55307 306 break;
AnnaBridge 167:e84263d55307 307 case 13:
AnnaBridge 167:e84263d55307 308 channels_irq = &gpio0_irq13;
AnnaBridge 167:e84263d55307 309 break;
AnnaBridge 167:e84263d55307 310 case 14:
AnnaBridge 167:e84263d55307 311 channels_irq = &gpio0_irq14;
AnnaBridge 167:e84263d55307 312 break;
AnnaBridge 167:e84263d55307 313 case 15:
AnnaBridge 167:e84263d55307 314 channels_irq = &gpio0_irq15;
AnnaBridge 167:e84263d55307 315 break;
AnnaBridge 167:e84263d55307 316 case 16:
AnnaBridge 167:e84263d55307 317 channels_irq = &gpio1_irq0;
AnnaBridge 167:e84263d55307 318 break;
AnnaBridge 167:e84263d55307 319 case 17:
AnnaBridge 167:e84263d55307 320 channels_irq = &gpio1_irq1;
AnnaBridge 167:e84263d55307 321 break;
AnnaBridge 167:e84263d55307 322 case 18:
AnnaBridge 167:e84263d55307 323 channels_irq = &gpio1_irq2;
AnnaBridge 167:e84263d55307 324 break;
AnnaBridge 167:e84263d55307 325 case 19:
AnnaBridge 167:e84263d55307 326 channels_irq = &gpio1_irq3;
AnnaBridge 167:e84263d55307 327 break;
AnnaBridge 167:e84263d55307 328 case 20:
AnnaBridge 167:e84263d55307 329 channels_irq = &gpio1_irq4;
AnnaBridge 167:e84263d55307 330 break;
AnnaBridge 167:e84263d55307 331 case 21:
AnnaBridge 167:e84263d55307 332 channels_irq = &gpio1_irq5;
AnnaBridge 167:e84263d55307 333 break;
AnnaBridge 167:e84263d55307 334 case 22:
AnnaBridge 167:e84263d55307 335 channels_irq = &gpio1_irq6;
AnnaBridge 167:e84263d55307 336 break;
AnnaBridge 167:e84263d55307 337 case 23:
AnnaBridge 167:e84263d55307 338 channels_irq = &gpio1_irq7;
AnnaBridge 167:e84263d55307 339 break;
AnnaBridge 167:e84263d55307 340 case 24:
AnnaBridge 167:e84263d55307 341 channels_irq = &gpio1_irq8;
AnnaBridge 167:e84263d55307 342 break;
AnnaBridge 167:e84263d55307 343 case 25:
AnnaBridge 167:e84263d55307 344 channels_irq = &gpio1_irq9;
AnnaBridge 167:e84263d55307 345 break;
AnnaBridge 167:e84263d55307 346 case 26:
AnnaBridge 167:e84263d55307 347 channels_irq = &gpio1_irq10;
AnnaBridge 167:e84263d55307 348 break;
AnnaBridge 167:e84263d55307 349 case 27:
AnnaBridge 167:e84263d55307 350 channels_irq = &gpio1_irq11;
AnnaBridge 167:e84263d55307 351 break;
AnnaBridge 167:e84263d55307 352 case 28:
AnnaBridge 167:e84263d55307 353 channels_irq = &gpio1_irq12;
AnnaBridge 167:e84263d55307 354 break;
AnnaBridge 167:e84263d55307 355 case 29:
AnnaBridge 167:e84263d55307 356 channels_irq = &gpio1_irq13;
AnnaBridge 167:e84263d55307 357 break;
AnnaBridge 167:e84263d55307 358 case 30:
AnnaBridge 167:e84263d55307 359 channels_irq = &gpio1_irq14;
AnnaBridge 167:e84263d55307 360 break;
AnnaBridge 167:e84263d55307 361 case 31:
AnnaBridge 167:e84263d55307 362 channels_irq = &gpio1_irq15;
AnnaBridge 167:e84263d55307 363 break;
AnnaBridge 167:e84263d55307 364 }
AnnaBridge 167:e84263d55307 365
AnnaBridge 167:e84263d55307 366 NVIC_SetVector((IRQn_Type)(PININT_IRQ + obj->ch), (uint32_t)channels_irq);
AnnaBridge 167:e84263d55307 367 NVIC_EnableIRQ((IRQn_Type)(PININT_IRQ + obj->ch));
AnnaBridge 167:e84263d55307 368
AnnaBridge 167:e84263d55307 369 return 0;
AnnaBridge 167:e84263d55307 370 }
AnnaBridge 167:e84263d55307 371
AnnaBridge 167:e84263d55307 372 void gpio_irq_free(gpio_irq_t *obj)
AnnaBridge 167:e84263d55307 373 {
AnnaBridge 167:e84263d55307 374 channel_ids[obj->ch] = 0;
AnnaBridge 167:e84263d55307 375 }
AnnaBridge 167:e84263d55307 376
AnnaBridge 167:e84263d55307 377 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
AnnaBridge 167:e84263d55307 378 {
AnnaBridge 167:e84263d55307 379 unsigned int ch_bit = (1 << obj->ch);
AnnaBridge 167:e84263d55307 380
AnnaBridge 167:e84263d55307 381 if (obj->ch <16) {
AnnaBridge 167:e84263d55307 382 /* Clear interrupt */
AnnaBridge 167:e84263d55307 383 if (!(CMSDK_GPIO_0->INTTYPESET & ch_bit)) {
AnnaBridge 167:e84263d55307 384 CMSDK_GPIO_0->INTCLEAR = ch_bit;
AnnaBridge 167:e84263d55307 385 }
AnnaBridge 167:e84263d55307 386 CMSDK_GPIO_0->INTTYPESET &= ch_bit;
AnnaBridge 167:e84263d55307 387
AnnaBridge 167:e84263d55307 388 /* Set interrupt */
AnnaBridge 167:e84263d55307 389 if (event == IRQ_RISE) {
AnnaBridge 167:e84263d55307 390 CMSDK_GPIO_0->INTPOLSET |= ch_bit;
AnnaBridge 167:e84263d55307 391 if (enable) {
AnnaBridge 167:e84263d55307 392 CMSDK_GPIO_0->INTENSET |= ch_bit;
AnnaBridge 167:e84263d55307 393 } else {
AnnaBridge 167:e84263d55307 394 CMSDK_GPIO_0->INTENCLR |= ch_bit;
AnnaBridge 167:e84263d55307 395 }
AnnaBridge 167:e84263d55307 396 } else {
AnnaBridge 167:e84263d55307 397 CMSDK_GPIO_0->INTPOLCLR |= ch_bit;
AnnaBridge 167:e84263d55307 398 if (enable) {
AnnaBridge 167:e84263d55307 399 CMSDK_GPIO_0->INTENSET |= ch_bit;
AnnaBridge 167:e84263d55307 400 } else {
AnnaBridge 167:e84263d55307 401 CMSDK_GPIO_0->INTENCLR |= ch_bit;
AnnaBridge 167:e84263d55307 402 }
AnnaBridge 167:e84263d55307 403 }
AnnaBridge 167:e84263d55307 404 } else {
AnnaBridge 167:e84263d55307 405 /* Clear interrupt */
AnnaBridge 167:e84263d55307 406 if (!(CMSDK_GPIO_1->INTTYPESET & ch_bit)) {
AnnaBridge 167:e84263d55307 407 CMSDK_GPIO_1->INTCLEAR = ch_bit;
AnnaBridge 167:e84263d55307 408 }
AnnaBridge 167:e84263d55307 409 CMSDK_GPIO_1->INTTYPESET &= ch_bit;
AnnaBridge 167:e84263d55307 410
AnnaBridge 167:e84263d55307 411 /* Set interrupt */
AnnaBridge 167:e84263d55307 412 if (event == IRQ_RISE) {
AnnaBridge 167:e84263d55307 413 CMSDK_GPIO_1->INTPOLSET |= ch_bit;
AnnaBridge 167:e84263d55307 414 if (enable) {
AnnaBridge 167:e84263d55307 415 CMSDK_GPIO_1->INTENSET |= ch_bit;
AnnaBridge 167:e84263d55307 416 } else {
AnnaBridge 167:e84263d55307 417 CMSDK_GPIO_1->INTENCLR |= ch_bit;
AnnaBridge 167:e84263d55307 418 }
AnnaBridge 167:e84263d55307 419 } else {
AnnaBridge 167:e84263d55307 420 CMSDK_GPIO_1->INTPOLCLR |= ch_bit;
AnnaBridge 167:e84263d55307 421 if (enable) {
AnnaBridge 167:e84263d55307 422 CMSDK_GPIO_1->INTENSET |= ch_bit;
AnnaBridge 167:e84263d55307 423 } else {
AnnaBridge 167:e84263d55307 424 CMSDK_GPIO_1->INTENCLR |= ch_bit;
AnnaBridge 167:e84263d55307 425 }
AnnaBridge 167:e84263d55307 426 }
AnnaBridge 167:e84263d55307 427 }
AnnaBridge 167:e84263d55307 428 }
AnnaBridge 167:e84263d55307 429
AnnaBridge 167:e84263d55307 430 void gpio_irq_enable(gpio_irq_t *obj)
AnnaBridge 167:e84263d55307 431 {
AnnaBridge 167:e84263d55307 432 NVIC_EnableIRQ((IRQn_Type)(PININT_IRQ + obj->ch));
AnnaBridge 167:e84263d55307 433 }
AnnaBridge 167:e84263d55307 434
AnnaBridge 167:e84263d55307 435 void gpio_irq_disable(gpio_irq_t *obj)
AnnaBridge 167:e84263d55307 436 {
AnnaBridge 167:e84263d55307 437 NVIC_DisableIRQ((IRQn_Type)(PININT_IRQ + obj->ch));
AnnaBridge 167:e84263d55307 438 }