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-2015 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/I2C.h"
vipinranka 12:9a20164dcc47 17
vipinranka 12:9a20164dcc47 18 #if DEVICE_I2C
vipinranka 12:9a20164dcc47 19
vipinranka 12:9a20164dcc47 20 namespace mbed {
vipinranka 12:9a20164dcc47 21
vipinranka 12:9a20164dcc47 22 I2C *I2C::_owner = NULL;
vipinranka 12:9a20164dcc47 23 SingletonPtr<PlatformMutex> I2C::_mutex;
vipinranka 12:9a20164dcc47 24
vipinranka 12:9a20164dcc47 25 I2C::I2C(PinName sda, PinName scl) :
vipinranka 12:9a20164dcc47 26 #if DEVICE_I2C_ASYNCH
vipinranka 12:9a20164dcc47 27 _irq(this), _usage(DMA_USAGE_NEVER),
vipinranka 12:9a20164dcc47 28 #endif
vipinranka 12:9a20164dcc47 29 _i2c(), _hz(100000) {
vipinranka 12:9a20164dcc47 30 // No lock needed in the constructor
vipinranka 12:9a20164dcc47 31
vipinranka 12:9a20164dcc47 32 // The init function also set the frequency to 100000
vipinranka 12:9a20164dcc47 33 i2c_init(&_i2c, sda, scl);
vipinranka 12:9a20164dcc47 34
vipinranka 12:9a20164dcc47 35 // Used to avoid unnecessary frequency updates
vipinranka 12:9a20164dcc47 36 _owner = this;
vipinranka 12:9a20164dcc47 37 }
vipinranka 12:9a20164dcc47 38
vipinranka 12:9a20164dcc47 39 void I2C::frequency(int hz) {
vipinranka 12:9a20164dcc47 40 lock();
vipinranka 12:9a20164dcc47 41 _hz = hz;
vipinranka 12:9a20164dcc47 42
vipinranka 12:9a20164dcc47 43 // We want to update the frequency even if we are already the bus owners
vipinranka 12:9a20164dcc47 44 i2c_frequency(&_i2c, _hz);
vipinranka 12:9a20164dcc47 45
vipinranka 12:9a20164dcc47 46 // Updating the frequency of the bus we become the owners of it
vipinranka 12:9a20164dcc47 47 _owner = this;
vipinranka 12:9a20164dcc47 48 unlock();
vipinranka 12:9a20164dcc47 49 }
vipinranka 12:9a20164dcc47 50
vipinranka 12:9a20164dcc47 51 void I2C::aquire() {
vipinranka 12:9a20164dcc47 52 lock();
vipinranka 12:9a20164dcc47 53 if (_owner != this) {
vipinranka 12:9a20164dcc47 54 i2c_frequency(&_i2c, _hz);
vipinranka 12:9a20164dcc47 55 _owner = this;
vipinranka 12:9a20164dcc47 56 }
vipinranka 12:9a20164dcc47 57 unlock();
vipinranka 12:9a20164dcc47 58 }
vipinranka 12:9a20164dcc47 59
vipinranka 12:9a20164dcc47 60 // write - Master Transmitter Mode
vipinranka 12:9a20164dcc47 61 int I2C::write(int address, const char* data, int length, bool repeated) {
vipinranka 12:9a20164dcc47 62 lock();
vipinranka 12:9a20164dcc47 63 aquire();
vipinranka 12:9a20164dcc47 64
vipinranka 12:9a20164dcc47 65 int stop = (repeated) ? 0 : 1;
vipinranka 12:9a20164dcc47 66 int written = i2c_write(&_i2c, address, data, length, stop);
vipinranka 12:9a20164dcc47 67
vipinranka 12:9a20164dcc47 68 unlock();
vipinranka 12:9a20164dcc47 69 return length != written;
vipinranka 12:9a20164dcc47 70 }
vipinranka 12:9a20164dcc47 71
vipinranka 12:9a20164dcc47 72 int I2C::write(int data) {
vipinranka 12:9a20164dcc47 73 lock();
vipinranka 12:9a20164dcc47 74 int ret = i2c_byte_write(&_i2c, data);
vipinranka 12:9a20164dcc47 75 unlock();
vipinranka 12:9a20164dcc47 76 return ret;
vipinranka 12:9a20164dcc47 77 }
vipinranka 12:9a20164dcc47 78
vipinranka 12:9a20164dcc47 79 // read - Master Reciever Mode
vipinranka 12:9a20164dcc47 80 int I2C::read(int address, char* data, int length, bool repeated) {
vipinranka 12:9a20164dcc47 81 lock();
vipinranka 12:9a20164dcc47 82 aquire();
vipinranka 12:9a20164dcc47 83
vipinranka 12:9a20164dcc47 84 int stop = (repeated) ? 0 : 1;
vipinranka 12:9a20164dcc47 85 int read = i2c_read(&_i2c, address, data, length, stop);
vipinranka 12:9a20164dcc47 86
vipinranka 12:9a20164dcc47 87 unlock();
vipinranka 12:9a20164dcc47 88 return length != read;
vipinranka 12:9a20164dcc47 89 }
vipinranka 12:9a20164dcc47 90
vipinranka 12:9a20164dcc47 91 int I2C::read(int ack) {
vipinranka 12:9a20164dcc47 92 lock();
vipinranka 12:9a20164dcc47 93 int ret;
vipinranka 12:9a20164dcc47 94 if (ack) {
vipinranka 12:9a20164dcc47 95 ret = i2c_byte_read(&_i2c, 0);
vipinranka 12:9a20164dcc47 96 } else {
vipinranka 12:9a20164dcc47 97 ret = i2c_byte_read(&_i2c, 1);
vipinranka 12:9a20164dcc47 98 }
vipinranka 12:9a20164dcc47 99 unlock();
vipinranka 12:9a20164dcc47 100 return ret;
vipinranka 12:9a20164dcc47 101 }
vipinranka 12:9a20164dcc47 102
vipinranka 12:9a20164dcc47 103 void I2C::start(void) {
vipinranka 12:9a20164dcc47 104 lock();
vipinranka 12:9a20164dcc47 105 i2c_start(&_i2c);
vipinranka 12:9a20164dcc47 106 unlock();
vipinranka 12:9a20164dcc47 107 }
vipinranka 12:9a20164dcc47 108
vipinranka 12:9a20164dcc47 109 void I2C::stop(void) {
vipinranka 12:9a20164dcc47 110 lock();
vipinranka 12:9a20164dcc47 111 i2c_stop(&_i2c);
vipinranka 12:9a20164dcc47 112 unlock();
vipinranka 12:9a20164dcc47 113 }
vipinranka 12:9a20164dcc47 114
vipinranka 12:9a20164dcc47 115 void I2C::lock() {
vipinranka 12:9a20164dcc47 116 _mutex->lock();
vipinranka 12:9a20164dcc47 117 }
vipinranka 12:9a20164dcc47 118
vipinranka 12:9a20164dcc47 119 void I2C::unlock() {
vipinranka 12:9a20164dcc47 120 _mutex->unlock();
vipinranka 12:9a20164dcc47 121 }
vipinranka 12:9a20164dcc47 122
vipinranka 12:9a20164dcc47 123 #if DEVICE_I2C_ASYNCH
vipinranka 12:9a20164dcc47 124
vipinranka 12:9a20164dcc47 125 int I2C::transfer(int address, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t& callback, int event, bool repeated)
vipinranka 12:9a20164dcc47 126 {
vipinranka 12:9a20164dcc47 127 lock();
vipinranka 12:9a20164dcc47 128 if (i2c_active(&_i2c)) {
vipinranka 12:9a20164dcc47 129 unlock();
vipinranka 12:9a20164dcc47 130 return -1; // transaction ongoing
vipinranka 12:9a20164dcc47 131 }
vipinranka 12:9a20164dcc47 132 aquire();
vipinranka 12:9a20164dcc47 133
vipinranka 12:9a20164dcc47 134 _callback = callback;
vipinranka 12:9a20164dcc47 135 int stop = (repeated) ? 0 : 1;
vipinranka 12:9a20164dcc47 136 _irq.callback(&I2C::irq_handler_asynch);
vipinranka 12:9a20164dcc47 137 i2c_transfer_asynch(&_i2c, (void *)tx_buffer, tx_length, (void *)rx_buffer, rx_length, address, stop, _irq.entry(), event, _usage);
vipinranka 12:9a20164dcc47 138 unlock();
vipinranka 12:9a20164dcc47 139 return 0;
vipinranka 12:9a20164dcc47 140 }
vipinranka 12:9a20164dcc47 141
vipinranka 12:9a20164dcc47 142 void I2C::abort_transfer(void)
vipinranka 12:9a20164dcc47 143 {
vipinranka 12:9a20164dcc47 144 lock();
vipinranka 12:9a20164dcc47 145 i2c_abort_asynch(&_i2c);
vipinranka 12:9a20164dcc47 146 unlock();
vipinranka 12:9a20164dcc47 147 }
vipinranka 12:9a20164dcc47 148
vipinranka 12:9a20164dcc47 149 void I2C::irq_handler_asynch(void)
vipinranka 12:9a20164dcc47 150 {
vipinranka 12:9a20164dcc47 151 int event = i2c_irq_handler_asynch(&_i2c);
vipinranka 12:9a20164dcc47 152 if (_callback && event) {
vipinranka 12:9a20164dcc47 153 _callback.call(event);
vipinranka 12:9a20164dcc47 154 }
vipinranka 12:9a20164dcc47 155
vipinranka 12:9a20164dcc47 156 }
vipinranka 12:9a20164dcc47 157
vipinranka 12:9a20164dcc47 158
vipinranka 12:9a20164dcc47 159 #endif
vipinranka 12:9a20164dcc47 160
vipinranka 12:9a20164dcc47 161 } // namespace mbed
vipinranka 12:9a20164dcc47 162
vipinranka 12:9a20164dcc47 163 #endif