Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sun May 14 23:18:57 2017 +0000
Revision:
18:6a4db94011d3
Publishing again

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /* mbed Microcontroller Library
sahilmgandhi 18:6a4db94011d3 2 * Copyright (c) 2006-2013 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 "mbed_assert.h"
sahilmgandhi 18:6a4db94011d3 17 #include "gpio_api.h"
sahilmgandhi 18:6a4db94011d3 18 #include "gpio_irq_api.h"
sahilmgandhi 18:6a4db94011d3 19 #include "pinmap.h"
sahilmgandhi 18:6a4db94011d3 20 #include "nrf_drv_gpiote.h"
sahilmgandhi 18:6a4db94011d3 21
sahilmgandhi 18:6a4db94011d3 22
sahilmgandhi 18:6a4db94011d3 23 #if defined(TARGET_MCU_NRF51822)
sahilmgandhi 18:6a4db94011d3 24 #define GPIO_PIN_COUNT 31
sahilmgandhi 18:6a4db94011d3 25 #else
sahilmgandhi 18:6a4db94011d3 26 #define GPIO_PIN_COUNT 32
sahilmgandhi 18:6a4db94011d3 27 #endif
sahilmgandhi 18:6a4db94011d3 28
sahilmgandhi 18:6a4db94011d3 29 typedef struct {
sahilmgandhi 18:6a4db94011d3 30 bool used_as_gpio : 1;
sahilmgandhi 18:6a4db94011d3 31 PinDirection direction : 1;
sahilmgandhi 18:6a4db94011d3 32 bool init_high : 1;
sahilmgandhi 18:6a4db94011d3 33 PinMode pull : 2;
sahilmgandhi 18:6a4db94011d3 34 bool used_as_irq : 1;
sahilmgandhi 18:6a4db94011d3 35 bool irq_fall : 1;
sahilmgandhi 18:6a4db94011d3 36 bool irq_rise : 1;
sahilmgandhi 18:6a4db94011d3 37 } gpio_cfg_t;
sahilmgandhi 18:6a4db94011d3 38
sahilmgandhi 18:6a4db94011d3 39 uint32_t m_gpio_initialized;
sahilmgandhi 18:6a4db94011d3 40 gpio_cfg_t m_gpio_cfg[GPIO_PIN_COUNT];
sahilmgandhi 18:6a4db94011d3 41
sahilmgandhi 18:6a4db94011d3 42
sahilmgandhi 18:6a4db94011d3 43 /***********
sahilmgandhi 18:6a4db94011d3 44 GPIO IRQ
sahilmgandhi 18:6a4db94011d3 45 ***********/
sahilmgandhi 18:6a4db94011d3 46
sahilmgandhi 18:6a4db94011d3 47 static gpio_irq_handler m_irq_handler;
sahilmgandhi 18:6a4db94011d3 48 static uint32_t m_channel_ids[GPIO_PIN_COUNT] = {0};
sahilmgandhi 18:6a4db94011d3 49 uint32_t m_gpio_irq_enabled;
sahilmgandhi 18:6a4db94011d3 50
sahilmgandhi 18:6a4db94011d3 51
sahilmgandhi 18:6a4db94011d3 52 static void gpiote_irq_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action)
sahilmgandhi 18:6a4db94011d3 53 {
sahilmgandhi 18:6a4db94011d3 54 nrf_gpio_pin_sense_t sense = nrf_gpio_pin_sense_get(pin);
sahilmgandhi 18:6a4db94011d3 55 gpio_irq_event event = (sense == NRF_GPIO_PIN_SENSE_LOW) ? IRQ_RISE : IRQ_FALL;
sahilmgandhi 18:6a4db94011d3 56
sahilmgandhi 18:6a4db94011d3 57 if (m_gpio_irq_enabled & (1UL << pin)) {
sahilmgandhi 18:6a4db94011d3 58 if (((event == IRQ_RISE) && m_gpio_cfg[pin].irq_rise)
sahilmgandhi 18:6a4db94011d3 59 || ((event == IRQ_FALL) && m_gpio_cfg[pin].irq_fall)) {
sahilmgandhi 18:6a4db94011d3 60 m_irq_handler(m_channel_ids[pin], event);
sahilmgandhi 18:6a4db94011d3 61 }
sahilmgandhi 18:6a4db94011d3 62 }
sahilmgandhi 18:6a4db94011d3 63 }
sahilmgandhi 18:6a4db94011d3 64
sahilmgandhi 18:6a4db94011d3 65 void GPIOTE_IRQHandler(void);// exported from nrf_drv_gpiote.c
sahilmgandhi 18:6a4db94011d3 66
sahilmgandhi 18:6a4db94011d3 67 void gpio_init(gpio_t *obj, PinName pin)
sahilmgandhi 18:6a4db94011d3 68 {
sahilmgandhi 18:6a4db94011d3 69 obj->pin = pin;
sahilmgandhi 18:6a4db94011d3 70 if (pin == (PinName)NC) {
sahilmgandhi 18:6a4db94011d3 71 return;
sahilmgandhi 18:6a4db94011d3 72 }
sahilmgandhi 18:6a4db94011d3 73 MBED_ASSERT((uint32_t)pin < GPIO_PIN_COUNT);
sahilmgandhi 18:6a4db94011d3 74
sahilmgandhi 18:6a4db94011d3 75 NVIC_SetVector(GPIOTE_IRQn, (uint32_t) GPIOTE_IRQHandler);
sahilmgandhi 18:6a4db94011d3 76
sahilmgandhi 18:6a4db94011d3 77 (void) nrf_drv_gpiote_init();
sahilmgandhi 18:6a4db94011d3 78
sahilmgandhi 18:6a4db94011d3 79 m_gpio_cfg[obj->pin].used_as_gpio = true;
sahilmgandhi 18:6a4db94011d3 80 }
sahilmgandhi 18:6a4db94011d3 81
sahilmgandhi 18:6a4db94011d3 82
sahilmgandhi 18:6a4db94011d3 83 int gpio_read(gpio_t *obj)
sahilmgandhi 18:6a4db94011d3 84 {
sahilmgandhi 18:6a4db94011d3 85 MBED_ASSERT(obj->pin != (PinName)NC);
sahilmgandhi 18:6a4db94011d3 86 if (m_gpio_cfg[obj->pin].direction == PIN_OUTPUT) {
sahilmgandhi 18:6a4db94011d3 87 return ((NRF_GPIO->OUTSET & (1UL << obj->pin)) ? 1 : 0);
sahilmgandhi 18:6a4db94011d3 88 } else {
sahilmgandhi 18:6a4db94011d3 89 return nrf_gpio_pin_read(obj->pin);
sahilmgandhi 18:6a4db94011d3 90 }
sahilmgandhi 18:6a4db94011d3 91 }
sahilmgandhi 18:6a4db94011d3 92
sahilmgandhi 18:6a4db94011d3 93 static void gpiote_pin_uninit(uint8_t pin)
sahilmgandhi 18:6a4db94011d3 94 {
sahilmgandhi 18:6a4db94011d3 95 if (m_gpio_initialized & (1UL << pin)) {
sahilmgandhi 18:6a4db94011d3 96 if ((m_gpio_cfg[pin].direction == PIN_OUTPUT) && (!m_gpio_cfg[pin].used_as_irq)) {
sahilmgandhi 18:6a4db94011d3 97 nrf_drv_gpiote_out_uninit(pin);
sahilmgandhi 18:6a4db94011d3 98 }
sahilmgandhi 18:6a4db94011d3 99 else {
sahilmgandhi 18:6a4db94011d3 100 nrf_drv_gpiote_in_uninit(pin);
sahilmgandhi 18:6a4db94011d3 101 }
sahilmgandhi 18:6a4db94011d3 102 }
sahilmgandhi 18:6a4db94011d3 103 }
sahilmgandhi 18:6a4db94011d3 104
sahilmgandhi 18:6a4db94011d3 105 static void gpio_apply_config(uint8_t pin)
sahilmgandhi 18:6a4db94011d3 106 {
sahilmgandhi 18:6a4db94011d3 107 if (m_gpio_cfg[pin].used_as_gpio || m_gpio_cfg[pin].used_as_irq) {
sahilmgandhi 18:6a4db94011d3 108 if ((m_gpio_cfg[pin].direction == PIN_INPUT)
sahilmgandhi 18:6a4db94011d3 109 || (m_gpio_cfg[pin].used_as_irq)) {
sahilmgandhi 18:6a4db94011d3 110 //Configure as input.
sahilmgandhi 18:6a4db94011d3 111 nrf_drv_gpiote_in_config_t cfg;
sahilmgandhi 18:6a4db94011d3 112
sahilmgandhi 18:6a4db94011d3 113 cfg.hi_accuracy = false;
sahilmgandhi 18:6a4db94011d3 114 cfg.is_watcher = false;
sahilmgandhi 18:6a4db94011d3 115 cfg.sense = NRF_GPIOTE_POLARITY_TOGGLE;
sahilmgandhi 18:6a4db94011d3 116 if (m_gpio_cfg[pin].used_as_irq) {
sahilmgandhi 18:6a4db94011d3 117 cfg.pull = NRF_GPIO_PIN_PULLUP;
sahilmgandhi 18:6a4db94011d3 118 nrf_drv_gpiote_in_init(pin, &cfg, gpiote_irq_handler);
sahilmgandhi 18:6a4db94011d3 119 if ((m_gpio_irq_enabled & (1 << pin))
sahilmgandhi 18:6a4db94011d3 120 && (m_gpio_cfg[pin].irq_rise || m_gpio_cfg[pin].irq_fall))
sahilmgandhi 18:6a4db94011d3 121 {
sahilmgandhi 18:6a4db94011d3 122 nrf_drv_gpiote_in_event_enable(pin, true);
sahilmgandhi 18:6a4db94011d3 123 }
sahilmgandhi 18:6a4db94011d3 124 }
sahilmgandhi 18:6a4db94011d3 125 else {
sahilmgandhi 18:6a4db94011d3 126 switch(m_gpio_cfg[pin].pull) {
sahilmgandhi 18:6a4db94011d3 127 case PullUp:
sahilmgandhi 18:6a4db94011d3 128 cfg.pull = NRF_GPIO_PIN_PULLUP;
sahilmgandhi 18:6a4db94011d3 129 break;
sahilmgandhi 18:6a4db94011d3 130 case PullDown:
sahilmgandhi 18:6a4db94011d3 131 cfg.pull = NRF_GPIO_PIN_PULLDOWN;
sahilmgandhi 18:6a4db94011d3 132 break;
sahilmgandhi 18:6a4db94011d3 133 default:
sahilmgandhi 18:6a4db94011d3 134 cfg.pull = NRF_GPIO_PIN_NOPULL;
sahilmgandhi 18:6a4db94011d3 135 break;
sahilmgandhi 18:6a4db94011d3 136 }
sahilmgandhi 18:6a4db94011d3 137 nrf_drv_gpiote_in_init(pin, &cfg, NULL);
sahilmgandhi 18:6a4db94011d3 138 }
sahilmgandhi 18:6a4db94011d3 139 }
sahilmgandhi 18:6a4db94011d3 140 else {
sahilmgandhi 18:6a4db94011d3 141 // Configure as output.
sahilmgandhi 18:6a4db94011d3 142 nrf_drv_gpiote_out_config_t cfg = GPIOTE_CONFIG_OUT_SIMPLE(m_gpio_cfg[pin].init_high);
sahilmgandhi 18:6a4db94011d3 143 nrf_drv_gpiote_out_init(pin, &cfg);
sahilmgandhi 18:6a4db94011d3 144 }
sahilmgandhi 18:6a4db94011d3 145 m_gpio_initialized |= (1UL << pin);
sahilmgandhi 18:6a4db94011d3 146 }
sahilmgandhi 18:6a4db94011d3 147 else {
sahilmgandhi 18:6a4db94011d3 148 m_gpio_initialized &= ~(1UL << pin);
sahilmgandhi 18:6a4db94011d3 149 }
sahilmgandhi 18:6a4db94011d3 150 }
sahilmgandhi 18:6a4db94011d3 151
sahilmgandhi 18:6a4db94011d3 152
sahilmgandhi 18:6a4db94011d3 153 void gpio_mode(gpio_t *obj, PinMode mode)
sahilmgandhi 18:6a4db94011d3 154 {
sahilmgandhi 18:6a4db94011d3 155 MBED_ASSERT(obj->pin <= GPIO_PIN_COUNT);
sahilmgandhi 18:6a4db94011d3 156
sahilmgandhi 18:6a4db94011d3 157 gpiote_pin_uninit(obj->pin); // try to uninitialize gpio before a change.
sahilmgandhi 18:6a4db94011d3 158
sahilmgandhi 18:6a4db94011d3 159 m_gpio_cfg[obj->pin].pull = mode;
sahilmgandhi 18:6a4db94011d3 160 gpio_apply_config(obj->pin);
sahilmgandhi 18:6a4db94011d3 161 }
sahilmgandhi 18:6a4db94011d3 162
sahilmgandhi 18:6a4db94011d3 163
sahilmgandhi 18:6a4db94011d3 164 void gpio_dir(gpio_t *obj, PinDirection direction)
sahilmgandhi 18:6a4db94011d3 165 {
sahilmgandhi 18:6a4db94011d3 166 MBED_ASSERT(obj->pin <= GPIO_PIN_COUNT);
sahilmgandhi 18:6a4db94011d3 167
sahilmgandhi 18:6a4db94011d3 168 gpiote_pin_uninit(obj->pin); // try to uninitialize gpio before a change.
sahilmgandhi 18:6a4db94011d3 169
sahilmgandhi 18:6a4db94011d3 170 m_gpio_cfg[obj->pin].direction = direction;
sahilmgandhi 18:6a4db94011d3 171 gpio_apply_config(obj->pin);
sahilmgandhi 18:6a4db94011d3 172 }
sahilmgandhi 18:6a4db94011d3 173
sahilmgandhi 18:6a4db94011d3 174
sahilmgandhi 18:6a4db94011d3 175 /***********
sahilmgandhi 18:6a4db94011d3 176 GPIO IRQ
sahilmgandhi 18:6a4db94011d3 177 ***********/
sahilmgandhi 18:6a4db94011d3 178
sahilmgandhi 18:6a4db94011d3 179 int gpio_irq_init(gpio_irq_t *obj, PinName pin, gpio_irq_handler handler, uint32_t id)
sahilmgandhi 18:6a4db94011d3 180 {
sahilmgandhi 18:6a4db94011d3 181 if (pin == NC) {
sahilmgandhi 18:6a4db94011d3 182 return -1;
sahilmgandhi 18:6a4db94011d3 183 }
sahilmgandhi 18:6a4db94011d3 184 MBED_ASSERT((uint32_t)pin < GPIO_PIN_COUNT);
sahilmgandhi 18:6a4db94011d3 185 (void) nrf_drv_gpiote_init();
sahilmgandhi 18:6a4db94011d3 186
sahilmgandhi 18:6a4db94011d3 187 gpiote_pin_uninit(pin); // try to uninitialize gpio before a change.
sahilmgandhi 18:6a4db94011d3 188
sahilmgandhi 18:6a4db94011d3 189 m_gpio_cfg[pin].used_as_irq = true;
sahilmgandhi 18:6a4db94011d3 190 m_channel_ids[pin] = id;
sahilmgandhi 18:6a4db94011d3 191 obj->ch = pin;
sahilmgandhi 18:6a4db94011d3 192 m_irq_handler = handler;
sahilmgandhi 18:6a4db94011d3 193 m_channel_ids[pin] = id;
sahilmgandhi 18:6a4db94011d3 194
sahilmgandhi 18:6a4db94011d3 195 gpio_apply_config(pin);
sahilmgandhi 18:6a4db94011d3 196 return 1;
sahilmgandhi 18:6a4db94011d3 197 }
sahilmgandhi 18:6a4db94011d3 198
sahilmgandhi 18:6a4db94011d3 199
sahilmgandhi 18:6a4db94011d3 200 void gpio_irq_free(gpio_irq_t *obj)
sahilmgandhi 18:6a4db94011d3 201 {
sahilmgandhi 18:6a4db94011d3 202 nrf_drv_gpiote_in_uninit(obj->ch);
sahilmgandhi 18:6a4db94011d3 203 m_gpio_cfg[obj->ch].used_as_irq = false;
sahilmgandhi 18:6a4db94011d3 204 m_channel_ids[obj->ch] = 0;
sahilmgandhi 18:6a4db94011d3 205
sahilmgandhi 18:6a4db94011d3 206 gpio_apply_config(obj->ch);
sahilmgandhi 18:6a4db94011d3 207 }
sahilmgandhi 18:6a4db94011d3 208
sahilmgandhi 18:6a4db94011d3 209
sahilmgandhi 18:6a4db94011d3 210 void gpio_irq_set(gpio_irq_t *obj, gpio_irq_event event, uint32_t enable)
sahilmgandhi 18:6a4db94011d3 211 {
sahilmgandhi 18:6a4db94011d3 212 gpio_cfg_t* cfg = &m_gpio_cfg[obj->ch];
sahilmgandhi 18:6a4db94011d3 213 bool irq_enabled_before =
sahilmgandhi 18:6a4db94011d3 214 (m_gpio_irq_enabled & (1 << obj->ch)) &&
sahilmgandhi 18:6a4db94011d3 215 (cfg->irq_rise || cfg->irq_fall);
sahilmgandhi 18:6a4db94011d3 216
sahilmgandhi 18:6a4db94011d3 217 if (event == IRQ_RISE) {
sahilmgandhi 18:6a4db94011d3 218 cfg->irq_rise = enable ? true : false;
sahilmgandhi 18:6a4db94011d3 219 }
sahilmgandhi 18:6a4db94011d3 220 else if (event == IRQ_FALL) {
sahilmgandhi 18:6a4db94011d3 221 cfg->irq_fall = enable ? true : false;
sahilmgandhi 18:6a4db94011d3 222 }
sahilmgandhi 18:6a4db94011d3 223
sahilmgandhi 18:6a4db94011d3 224 bool irq_enabled_after = cfg->irq_rise || cfg->irq_fall;
sahilmgandhi 18:6a4db94011d3 225
sahilmgandhi 18:6a4db94011d3 226 if (irq_enabled_before != irq_enabled_after) {
sahilmgandhi 18:6a4db94011d3 227 if (irq_enabled_after) {
sahilmgandhi 18:6a4db94011d3 228 gpio_irq_enable(obj);
sahilmgandhi 18:6a4db94011d3 229 } else {
sahilmgandhi 18:6a4db94011d3 230 gpio_irq_disable(obj);
sahilmgandhi 18:6a4db94011d3 231 }
sahilmgandhi 18:6a4db94011d3 232 }
sahilmgandhi 18:6a4db94011d3 233 }
sahilmgandhi 18:6a4db94011d3 234
sahilmgandhi 18:6a4db94011d3 235
sahilmgandhi 18:6a4db94011d3 236 void gpio_irq_enable(gpio_irq_t *obj)
sahilmgandhi 18:6a4db94011d3 237 {
sahilmgandhi 18:6a4db94011d3 238 m_gpio_irq_enabled |= (1 << obj->ch);
sahilmgandhi 18:6a4db94011d3 239 if (m_gpio_cfg[obj->ch].irq_rise || m_gpio_cfg[obj->ch].irq_fall) {
sahilmgandhi 18:6a4db94011d3 240 nrf_drv_gpiote_in_event_enable(obj->ch, true);
sahilmgandhi 18:6a4db94011d3 241 }
sahilmgandhi 18:6a4db94011d3 242 }
sahilmgandhi 18:6a4db94011d3 243
sahilmgandhi 18:6a4db94011d3 244
sahilmgandhi 18:6a4db94011d3 245 void gpio_irq_disable(gpio_irq_t *obj)
sahilmgandhi 18:6a4db94011d3 246 {
sahilmgandhi 18:6a4db94011d3 247 m_gpio_irq_enabled &= ~(1 << obj->ch);
sahilmgandhi 18:6a4db94011d3 248 nrf_drv_gpiote_in_event_disable(obj->ch);
sahilmgandhi 18:6a4db94011d3 249 }