Mouse code for the MacroRat
mbed-dev/targets/TARGET_Atmel/TARGET_SAM_CortexM0P/gpio_irq_api.c@46:b156ef445742, 2017-06-03 (annotated)
- Committer:
- sahilmgandhi
- Date:
- Sat Jun 03 00:22:44 2017 +0000
- Revision:
- 46:b156ef445742
- Parent:
- 18:6a4db94011d3
Final code for internal battlebot competition.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sahilmgandhi | 18:6a4db94011d3 | 1 | /* mbed Microcontroller Library |
sahilmgandhi | 18:6a4db94011d3 | 2 | * Copyright (c) 2006-2015 ARM Limited |
sahilmgandhi | 18:6a4db94011d3 | 3 | * |
sahilmgandhi | 18:6a4db94011d3 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
sahilmgandhi | 18:6a4db94011d3 | 5 | * you may not use this file except in compliance with the License. |
sahilmgandhi | 18:6a4db94011d3 | 6 | * You may obtain a copy of the License at |
sahilmgandhi | 18:6a4db94011d3 | 7 | * |
sahilmgandhi | 18:6a4db94011d3 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
sahilmgandhi | 18:6a4db94011d3 | 9 | * |
sahilmgandhi | 18:6a4db94011d3 | 10 | * Unless required by applicable law or agreed to in writing, software |
sahilmgandhi | 18:6a4db94011d3 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
sahilmgandhi | 18:6a4db94011d3 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
sahilmgandhi | 18:6a4db94011d3 | 13 | * See the License for the specific language governing permissions and |
sahilmgandhi | 18:6a4db94011d3 | 14 | * limitations under the License. |
sahilmgandhi | 18:6a4db94011d3 | 15 | */ |
sahilmgandhi | 18:6a4db94011d3 | 16 | #include <stddef.h> |
sahilmgandhi | 18:6a4db94011d3 | 17 | #include "cmsis.h" |
sahilmgandhi | 18:6a4db94011d3 | 18 | |
sahilmgandhi | 18:6a4db94011d3 | 19 | #include "gpio_irq_api.h" |
sahilmgandhi | 18:6a4db94011d3 | 20 | #include "gpio_api.h" |
sahilmgandhi | 18:6a4db94011d3 | 21 | #include "mbed_error.h" |
sahilmgandhi | 18:6a4db94011d3 | 22 | #include "extint.h" |
sahilmgandhi | 18:6a4db94011d3 | 23 | #include "pinmap.h" |
sahilmgandhi | 18:6a4db94011d3 | 24 | #include "PeripheralPins.h" |
sahilmgandhi | 18:6a4db94011d3 | 25 | #include "port.h" |
sahilmgandhi | 18:6a4db94011d3 | 26 | |
sahilmgandhi | 18:6a4db94011d3 | 27 | #define IRQ_RISE_POSITION 1 |
sahilmgandhi | 18:6a4db94011d3 | 28 | #define IRQ_FALL_POSITION 2 |
sahilmgandhi | 18:6a4db94011d3 | 29 | #define CHANNEL_NUM 16 |
sahilmgandhi | 18:6a4db94011d3 | 30 | #define pEXT_CONF(obj) (obj->config_extint_chan) |
sahilmgandhi | 18:6a4db94011d3 | 31 | static uint32_t channel_ids[CHANNEL_NUM] = {0}; |
sahilmgandhi | 18:6a4db94011d3 | 32 | static gpio_irq_handler irq_handler; |
sahilmgandhi | 18:6a4db94011d3 | 33 | uint8_t ext_int_pins[EIC_NUMBER_OF_INTERRUPTS] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; |
sahilmgandhi | 18:6a4db94011d3 | 34 | |
sahilmgandhi | 18:6a4db94011d3 | 35 | void gpio_irq(void) |
sahilmgandhi | 18:6a4db94011d3 | 36 | { |
sahilmgandhi | 18:6a4db94011d3 | 37 | uint32_t current_channel; |
sahilmgandhi | 18:6a4db94011d3 | 38 | uint32_t mask; |
sahilmgandhi | 18:6a4db94011d3 | 39 | gpio_irq_event event; |
sahilmgandhi | 18:6a4db94011d3 | 40 | PortGroup *port_base; |
sahilmgandhi | 18:6a4db94011d3 | 41 | |
sahilmgandhi | 18:6a4db94011d3 | 42 | for (current_channel = 0; current_channel < EIC_NUMBER_OF_INTERRUPTS ; current_channel++) { |
sahilmgandhi | 18:6a4db94011d3 | 43 | if (extint_chan_is_detected(current_channel)) { |
sahilmgandhi | 18:6a4db94011d3 | 44 | extint_chan_clear_detected(current_channel); |
sahilmgandhi | 18:6a4db94011d3 | 45 | port_base = (PortGroup*)port_get_group_from_gpio_pin(ext_int_pins[current_channel]); |
sahilmgandhi | 18:6a4db94011d3 | 46 | mask = gpio_set((PinName)ext_int_pins[current_channel]); |
sahilmgandhi | 18:6a4db94011d3 | 47 | if ((port_base->IN.reg & mask) != 0) { |
sahilmgandhi | 18:6a4db94011d3 | 48 | event = IRQ_RISE; |
sahilmgandhi | 18:6a4db94011d3 | 49 | } else { |
sahilmgandhi | 18:6a4db94011d3 | 50 | event = IRQ_FALL; |
sahilmgandhi | 18:6a4db94011d3 | 51 | } |
sahilmgandhi | 18:6a4db94011d3 | 52 | if(irq_handler) { |
sahilmgandhi | 18:6a4db94011d3 | 53 | irq_handler(channel_ids[current_channel], event); |
sahilmgandhi | 18:6a4db94011d3 | 54 | } |
sahilmgandhi | 18:6a4db94011d3 | 55 | } |
sahilmgandhi | 18:6a4db94011d3 | 56 | } |
sahilmgandhi | 18:6a4db94011d3 | 57 | } |
sahilmgandhi | 18:6a4db94011d3 | 58 | |
sahilmgandhi | 18:6a4db94011d3 | 59 | int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id) |
sahilmgandhi | 18:6a4db94011d3 | 60 | { |
sahilmgandhi | 18:6a4db94011d3 | 61 | MBED_ASSERT(obj); |
sahilmgandhi | 18:6a4db94011d3 | 62 | if (pin == NC) |
sahilmgandhi | 18:6a4db94011d3 | 63 | return -1; |
sahilmgandhi | 18:6a4db94011d3 | 64 | |
sahilmgandhi | 18:6a4db94011d3 | 65 | IRQn_Type irq_n = (IRQn_Type)0; |
sahilmgandhi | 18:6a4db94011d3 | 66 | uint32_t vector = 0; |
sahilmgandhi | 18:6a4db94011d3 | 67 | int int_channel = 0; |
sahilmgandhi | 18:6a4db94011d3 | 68 | irq_handler = handler; // assuming the usage of these apis in mbed layer only |
sahilmgandhi | 18:6a4db94011d3 | 69 | |
sahilmgandhi | 18:6a4db94011d3 | 70 | obj->pin = pin; |
sahilmgandhi | 18:6a4db94011d3 | 71 | |
sahilmgandhi | 18:6a4db94011d3 | 72 | extint_chan_get_config_defaults(&pEXT_CONF(obj)); |
sahilmgandhi | 18:6a4db94011d3 | 73 | pEXT_CONF(obj).gpio_pin = (uint32_t)pin; |
sahilmgandhi | 18:6a4db94011d3 | 74 | pEXT_CONF(obj).gpio_pin_mux = 0; // mux setting for ext int is 0 |
sahilmgandhi | 18:6a4db94011d3 | 75 | pEXT_CONF(obj).gpio_pin_pull = EXTINT_PULL_UP; |
sahilmgandhi | 18:6a4db94011d3 | 76 | pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_NONE; |
sahilmgandhi | 18:6a4db94011d3 | 77 | |
sahilmgandhi | 18:6a4db94011d3 | 78 | int_channel = pinmap_find_peripheral(pin, PinMap_EXTINT); |
sahilmgandhi | 18:6a4db94011d3 | 79 | if (int_channel == NC) { |
sahilmgandhi | 18:6a4db94011d3 | 80 | return -1; |
sahilmgandhi | 18:6a4db94011d3 | 81 | } |
sahilmgandhi | 18:6a4db94011d3 | 82 | extint_chan_set_config(int_channel, &pEXT_CONF(obj)); |
sahilmgandhi | 18:6a4db94011d3 | 83 | ext_int_pins[int_channel] = pin; |
sahilmgandhi | 18:6a4db94011d3 | 84 | |
sahilmgandhi | 18:6a4db94011d3 | 85 | irq_n = EIC_IRQn; |
sahilmgandhi | 18:6a4db94011d3 | 86 | vector = (uint32_t)gpio_irq; |
sahilmgandhi | 18:6a4db94011d3 | 87 | NVIC_SetVector(irq_n, vector); |
sahilmgandhi | 18:6a4db94011d3 | 88 | NVIC_EnableIRQ(irq_n); |
sahilmgandhi | 18:6a4db94011d3 | 89 | obj->ch = int_channel; |
sahilmgandhi | 18:6a4db94011d3 | 90 | channel_ids[int_channel] = id; |
sahilmgandhi | 18:6a4db94011d3 | 91 | obj->irqmask = 0; |
sahilmgandhi | 18:6a4db94011d3 | 92 | |
sahilmgandhi | 18:6a4db94011d3 | 93 | return 0; |
sahilmgandhi | 18:6a4db94011d3 | 94 | } |
sahilmgandhi | 18:6a4db94011d3 | 95 | |
sahilmgandhi | 18:6a4db94011d3 | 96 | void gpio_irq_free(gpio_irq_t *obj) |
sahilmgandhi | 18:6a4db94011d3 | 97 | { |
sahilmgandhi | 18:6a4db94011d3 | 98 | MBED_ASSERT(obj); |
sahilmgandhi | 18:6a4db94011d3 | 99 | Eic *const eic = _extint_get_eic_from_channel(obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 100 | channel_ids[obj->ch] = 0; |
sahilmgandhi | 18:6a4db94011d3 | 101 | eic->INTENCLR.reg = (1UL << obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 102 | } |
sahilmgandhi | 18:6a4db94011d3 | 103 | |
sahilmgandhi | 18:6a4db94011d3 | 104 | void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable) |
sahilmgandhi | 18:6a4db94011d3 | 105 | { |
sahilmgandhi | 18:6a4db94011d3 | 106 | MBED_ASSERT(obj); |
sahilmgandhi | 18:6a4db94011d3 | 107 | Eic *const eic = _extint_get_eic_from_channel(obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 108 | if (enable) { |
sahilmgandhi | 18:6a4db94011d3 | 109 | if (event == IRQ_RISE) { |
sahilmgandhi | 18:6a4db94011d3 | 110 | obj->irqmask |= IRQ_RISE_POSITION; |
sahilmgandhi | 18:6a4db94011d3 | 111 | } else if (event == IRQ_FALL) { |
sahilmgandhi | 18:6a4db94011d3 | 112 | obj->irqmask |= IRQ_FALL_POSITION; |
sahilmgandhi | 18:6a4db94011d3 | 113 | } |
sahilmgandhi | 18:6a4db94011d3 | 114 | eic->INTENSET.reg = (1UL << obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 115 | } else { |
sahilmgandhi | 18:6a4db94011d3 | 116 | if (event == IRQ_RISE) { |
sahilmgandhi | 18:6a4db94011d3 | 117 | obj->irqmask &= ~IRQ_RISE_POSITION; |
sahilmgandhi | 18:6a4db94011d3 | 118 | } else if (event == IRQ_FALL) { |
sahilmgandhi | 18:6a4db94011d3 | 119 | obj->irqmask &= ~IRQ_FALL_POSITION; |
sahilmgandhi | 18:6a4db94011d3 | 120 | } |
sahilmgandhi | 18:6a4db94011d3 | 121 | } |
sahilmgandhi | 18:6a4db94011d3 | 122 | |
sahilmgandhi | 18:6a4db94011d3 | 123 | if (obj->irqmask == (IRQ_RISE_POSITION | IRQ_FALL_POSITION)) { |
sahilmgandhi | 18:6a4db94011d3 | 124 | pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_BOTH; |
sahilmgandhi | 18:6a4db94011d3 | 125 | } else if (obj->irqmask == IRQ_RISE_POSITION) { |
sahilmgandhi | 18:6a4db94011d3 | 126 | pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_RISING; |
sahilmgandhi | 18:6a4db94011d3 | 127 | } else if (obj->irqmask == IRQ_FALL_POSITION) { |
sahilmgandhi | 18:6a4db94011d3 | 128 | pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_FALLING; |
sahilmgandhi | 18:6a4db94011d3 | 129 | } else { |
sahilmgandhi | 18:6a4db94011d3 | 130 | pEXT_CONF(obj).detection_criteria = EXTINT_DETECT_NONE; |
sahilmgandhi | 18:6a4db94011d3 | 131 | eic->INTENCLR.reg = (1UL << obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 132 | } |
sahilmgandhi | 18:6a4db94011d3 | 133 | |
sahilmgandhi | 18:6a4db94011d3 | 134 | extint_chan_set_config(obj->ch, &pEXT_CONF(obj)); |
sahilmgandhi | 18:6a4db94011d3 | 135 | } |
sahilmgandhi | 18:6a4db94011d3 | 136 | |
sahilmgandhi | 18:6a4db94011d3 | 137 | void gpio_irq_enable(gpio_irq_t *obj) |
sahilmgandhi | 18:6a4db94011d3 | 138 | { |
sahilmgandhi | 18:6a4db94011d3 | 139 | MBED_ASSERT(obj); |
sahilmgandhi | 18:6a4db94011d3 | 140 | Eic *const eic = _extint_get_eic_from_channel(obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 141 | NVIC_EnableIRQ(EIC_IRQn); |
sahilmgandhi | 18:6a4db94011d3 | 142 | eic->INTENSET.reg = (1UL << obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 143 | } |
sahilmgandhi | 18:6a4db94011d3 | 144 | |
sahilmgandhi | 18:6a4db94011d3 | 145 | void gpio_irq_disable(gpio_irq_t *obj) |
sahilmgandhi | 18:6a4db94011d3 | 146 | { |
sahilmgandhi | 18:6a4db94011d3 | 147 | MBED_ASSERT(obj); |
sahilmgandhi | 18:6a4db94011d3 | 148 | Eic *const eic = _extint_get_eic_from_channel(obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 149 | eic->INTENCLR.reg = (1UL << obj->ch); |
sahilmgandhi | 18:6a4db94011d3 | 150 | if (eic->INTENSET.reg == 0) { |
sahilmgandhi | 18:6a4db94011d3 | 151 | NVIC_DisableIRQ(EIC_IRQn); |
sahilmgandhi | 18:6a4db94011d3 | 152 | } |
sahilmgandhi | 18:6a4db94011d3 | 153 | } |