Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Nucleo_F103RB_RTC_battery_bkup_pwr_off_okay
Fork of mbed-dev by
targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/gpio_irq_api.c@177:619788de047e, 2017-11-07 (annotated)
- Committer:
- maxxir
- Date:
- Tue Nov 07 16:46:29 2017 +0000
- Revision:
- 177:619788de047e
- Parent:
- 167:e84263d55307
To fix broken RTC on Nucleo_F103RB / STM32F103 BluePill etc..; Used direct RTC register manipulation for STM32F1xx; rtc_read() && rtc_write() (native rtc_init() - works good); also added stub for non-working on STM32F1xx rtc_read_subseconds().
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |
