This is the final version of Mini Gateway for Automation and Security desgined for Renesas GR Peach Design Contest

Dependencies:   GR-PEACH_video GraphicsFramework HTTPServer R_BSP mbed-rpc mbed-rtos Socket lwip-eth lwip-sys lwip FATFileSystem

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Committer:
vipinranka
Date:
Wed Jan 11 11:41:30 2017 +0000
Revision:
12:9a20164dcc47
This is the final version MGAS Project for Renesas GR Peach Design Contest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vipinranka 12:9a20164dcc47 1 /* mbed Microcontroller Library
vipinranka 12:9a20164dcc47 2 * Copyright (c) 2006-2013 ARM Limited
vipinranka 12:9a20164dcc47 3 *
vipinranka 12:9a20164dcc47 4 * Licensed under the Apache License, Version 2.0 (the "License");
vipinranka 12:9a20164dcc47 5 * you may not use this file except in compliance with the License.
vipinranka 12:9a20164dcc47 6 * You may obtain a copy of the License at
vipinranka 12:9a20164dcc47 7 *
vipinranka 12:9a20164dcc47 8 * http://www.apache.org/licenses/LICENSE-2.0
vipinranka 12:9a20164dcc47 9 *
vipinranka 12:9a20164dcc47 10 * Unless required by applicable law or agreed to in writing, software
vipinranka 12:9a20164dcc47 11 * distributed under the License is distributed on an "AS IS" BASIS,
vipinranka 12:9a20164dcc47 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vipinranka 12:9a20164dcc47 13 * See the License for the specific language governing permissions and
vipinranka 12:9a20164dcc47 14 * limitations under the License.
vipinranka 12:9a20164dcc47 15 */
vipinranka 12:9a20164dcc47 16 #include "drivers/InterruptIn.h"
vipinranka 12:9a20164dcc47 17
vipinranka 12:9a20164dcc47 18 #if DEVICE_INTERRUPTIN
vipinranka 12:9a20164dcc47 19
vipinranka 12:9a20164dcc47 20 namespace mbed {
vipinranka 12:9a20164dcc47 21
vipinranka 12:9a20164dcc47 22 static void donothing() {}
vipinranka 12:9a20164dcc47 23
vipinranka 12:9a20164dcc47 24 InterruptIn::InterruptIn(PinName pin) : gpio(),
vipinranka 12:9a20164dcc47 25 gpio_irq(),
vipinranka 12:9a20164dcc47 26 _rise(),
vipinranka 12:9a20164dcc47 27 _fall() {
vipinranka 12:9a20164dcc47 28 // No lock needed in the constructor
vipinranka 12:9a20164dcc47 29
vipinranka 12:9a20164dcc47 30 _rise.attach(donothing);
vipinranka 12:9a20164dcc47 31 _fall.attach(donothing);
vipinranka 12:9a20164dcc47 32
vipinranka 12:9a20164dcc47 33 gpio_irq_init(&gpio_irq, pin, (&InterruptIn::_irq_handler), (uint32_t)this);
vipinranka 12:9a20164dcc47 34 gpio_init_in(&gpio, pin);
vipinranka 12:9a20164dcc47 35 }
vipinranka 12:9a20164dcc47 36
vipinranka 12:9a20164dcc47 37 InterruptIn::~InterruptIn() {
vipinranka 12:9a20164dcc47 38 // No lock needed in the destructor
vipinranka 12:9a20164dcc47 39 gpio_irq_free(&gpio_irq);
vipinranka 12:9a20164dcc47 40 }
vipinranka 12:9a20164dcc47 41
vipinranka 12:9a20164dcc47 42 int InterruptIn::read() {
vipinranka 12:9a20164dcc47 43 // Read only
vipinranka 12:9a20164dcc47 44 return gpio_read(&gpio);
vipinranka 12:9a20164dcc47 45 }
vipinranka 12:9a20164dcc47 46
vipinranka 12:9a20164dcc47 47 void InterruptIn::mode(PinMode pull) {
vipinranka 12:9a20164dcc47 48 core_util_critical_section_enter();
vipinranka 12:9a20164dcc47 49 gpio_mode(&gpio, pull);
vipinranka 12:9a20164dcc47 50 core_util_critical_section_exit();
vipinranka 12:9a20164dcc47 51 }
vipinranka 12:9a20164dcc47 52
vipinranka 12:9a20164dcc47 53 void InterruptIn::rise(Callback<void()> func) {
vipinranka 12:9a20164dcc47 54 core_util_critical_section_enter();
vipinranka 12:9a20164dcc47 55 if (func) {
vipinranka 12:9a20164dcc47 56 _rise.attach(func);
vipinranka 12:9a20164dcc47 57 gpio_irq_set(&gpio_irq, IRQ_RISE, 1);
vipinranka 12:9a20164dcc47 58 } else {
vipinranka 12:9a20164dcc47 59 _rise.attach(donothing);
vipinranka 12:9a20164dcc47 60 gpio_irq_set(&gpio_irq, IRQ_RISE, 0);
vipinranka 12:9a20164dcc47 61 }
vipinranka 12:9a20164dcc47 62 core_util_critical_section_exit();
vipinranka 12:9a20164dcc47 63 }
vipinranka 12:9a20164dcc47 64
vipinranka 12:9a20164dcc47 65 void InterruptIn::fall(Callback<void()> func) {
vipinranka 12:9a20164dcc47 66 core_util_critical_section_enter();
vipinranka 12:9a20164dcc47 67 if (func) {
vipinranka 12:9a20164dcc47 68 _fall.attach(func);
vipinranka 12:9a20164dcc47 69 gpio_irq_set(&gpio_irq, IRQ_FALL, 1);
vipinranka 12:9a20164dcc47 70 } else {
vipinranka 12:9a20164dcc47 71 _fall.attach(donothing);
vipinranka 12:9a20164dcc47 72 gpio_irq_set(&gpio_irq, IRQ_FALL, 0);
vipinranka 12:9a20164dcc47 73 }
vipinranka 12:9a20164dcc47 74 core_util_critical_section_exit();
vipinranka 12:9a20164dcc47 75 }
vipinranka 12:9a20164dcc47 76
vipinranka 12:9a20164dcc47 77 void InterruptIn::_irq_handler(uint32_t id, gpio_irq_event event) {
vipinranka 12:9a20164dcc47 78 InterruptIn *handler = (InterruptIn*)id;
vipinranka 12:9a20164dcc47 79 switch (event) {
vipinranka 12:9a20164dcc47 80 case IRQ_RISE: handler->_rise.call(); break;
vipinranka 12:9a20164dcc47 81 case IRQ_FALL: handler->_fall.call(); break;
vipinranka 12:9a20164dcc47 82 case IRQ_NONE: break;
vipinranka 12:9a20164dcc47 83 }
vipinranka 12:9a20164dcc47 84 }
vipinranka 12:9a20164dcc47 85
vipinranka 12:9a20164dcc47 86 void InterruptIn::enable_irq() {
vipinranka 12:9a20164dcc47 87 core_util_critical_section_enter();
vipinranka 12:9a20164dcc47 88 gpio_irq_enable(&gpio_irq);
vipinranka 12:9a20164dcc47 89 core_util_critical_section_exit();
vipinranka 12:9a20164dcc47 90 }
vipinranka 12:9a20164dcc47 91
vipinranka 12:9a20164dcc47 92 void InterruptIn::disable_irq() {
vipinranka 12:9a20164dcc47 93 core_util_critical_section_enter();
vipinranka 12:9a20164dcc47 94 gpio_irq_disable(&gpio_irq);
vipinranka 12:9a20164dcc47 95 core_util_critical_section_exit();
vipinranka 12:9a20164dcc47 96 }
vipinranka 12:9a20164dcc47 97
vipinranka 12:9a20164dcc47 98 InterruptIn::operator int() {
vipinranka 12:9a20164dcc47 99 // Underlying call is atomic
vipinranka 12:9a20164dcc47 100 return read();
vipinranka 12:9a20164dcc47 101 }
vipinranka 12:9a20164dcc47 102
vipinranka 12:9a20164dcc47 103 } // namespace mbed
vipinranka 12:9a20164dcc47 104
vipinranka 12:9a20164dcc47 105 #endif