1

Committer:
valeyev
Date:
Tue Mar 13 07:17:50 2018 +0000
Revision:
0:e056ac8fecf8
looking for...

Who changed what in which revision?

UserRevisionLine numberNew contents of line
valeyev 0:e056ac8fecf8 1 /* mbed Microcontroller Library
valeyev 0:e056ac8fecf8 2 * Copyright (c) 2006-2013 ARM Limited
valeyev 0:e056ac8fecf8 3 *
valeyev 0:e056ac8fecf8 4 * Licensed under the Apache License, Version 2.0 (the "License");
valeyev 0:e056ac8fecf8 5 * you may not use this file except in compliance with the License.
valeyev 0:e056ac8fecf8 6 * You may obtain a copy of the License at
valeyev 0:e056ac8fecf8 7 *
valeyev 0:e056ac8fecf8 8 * http://www.apache.org/licenses/LICENSE-2.0
valeyev 0:e056ac8fecf8 9 *
valeyev 0:e056ac8fecf8 10 * Unless required by applicable law or agreed to in writing, software
valeyev 0:e056ac8fecf8 11 * distributed under the License is distributed on an "AS IS" BASIS,
valeyev 0:e056ac8fecf8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
valeyev 0:e056ac8fecf8 13 * See the License for the specific language governing permissions and
valeyev 0:e056ac8fecf8 14 * limitations under the License.
valeyev 0:e056ac8fecf8 15 */
valeyev 0:e056ac8fecf8 16 #include "drivers/BusInOut.h"
valeyev 0:e056ac8fecf8 17 #include "platform/mbed_assert.h"
valeyev 0:e056ac8fecf8 18
valeyev 0:e056ac8fecf8 19 namespace mbed {
valeyev 0:e056ac8fecf8 20
valeyev 0:e056ac8fecf8 21 BusInOut::BusInOut(PinName p0, PinName p1, PinName p2, PinName p3, PinName p4, PinName p5, PinName p6, PinName p7, PinName p8, PinName p9, PinName p10, PinName p11, PinName p12, PinName p13, PinName p14, PinName p15) {
valeyev 0:e056ac8fecf8 22 PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15};
valeyev 0:e056ac8fecf8 23
valeyev 0:e056ac8fecf8 24 // No lock needed in the constructor
valeyev 0:e056ac8fecf8 25 _nc_mask = 0;
valeyev 0:e056ac8fecf8 26 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 27 _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0;
valeyev 0:e056ac8fecf8 28 if (pins[i] != NC) {
valeyev 0:e056ac8fecf8 29 _nc_mask |= (1 << i);
valeyev 0:e056ac8fecf8 30 }
valeyev 0:e056ac8fecf8 31 }
valeyev 0:e056ac8fecf8 32 }
valeyev 0:e056ac8fecf8 33
valeyev 0:e056ac8fecf8 34 BusInOut::BusInOut(PinName pins[16]) {
valeyev 0:e056ac8fecf8 35 // No lock needed in the constructor
valeyev 0:e056ac8fecf8 36 _nc_mask = 0;
valeyev 0:e056ac8fecf8 37 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 38 _pin[i] = (pins[i] != NC) ? new DigitalInOut(pins[i]) : 0;
valeyev 0:e056ac8fecf8 39 if (pins[i] != NC) {
valeyev 0:e056ac8fecf8 40 _nc_mask |= (1 << i);
valeyev 0:e056ac8fecf8 41 }
valeyev 0:e056ac8fecf8 42 }
valeyev 0:e056ac8fecf8 43 }
valeyev 0:e056ac8fecf8 44
valeyev 0:e056ac8fecf8 45 BusInOut::~BusInOut() {
valeyev 0:e056ac8fecf8 46 // No lock needed in the destructor
valeyev 0:e056ac8fecf8 47 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 48 if (_pin[i] != 0) {
valeyev 0:e056ac8fecf8 49 delete _pin[i];
valeyev 0:e056ac8fecf8 50 }
valeyev 0:e056ac8fecf8 51 }
valeyev 0:e056ac8fecf8 52 }
valeyev 0:e056ac8fecf8 53
valeyev 0:e056ac8fecf8 54 void BusInOut::write(int value) {
valeyev 0:e056ac8fecf8 55 lock();
valeyev 0:e056ac8fecf8 56 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 57 if (_pin[i] != 0) {
valeyev 0:e056ac8fecf8 58 _pin[i]->write((value >> i) & 1);
valeyev 0:e056ac8fecf8 59 }
valeyev 0:e056ac8fecf8 60 }
valeyev 0:e056ac8fecf8 61 unlock();
valeyev 0:e056ac8fecf8 62 }
valeyev 0:e056ac8fecf8 63
valeyev 0:e056ac8fecf8 64 int BusInOut::read() {
valeyev 0:e056ac8fecf8 65 lock();
valeyev 0:e056ac8fecf8 66 int v = 0;
valeyev 0:e056ac8fecf8 67 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 68 if (_pin[i] != 0) {
valeyev 0:e056ac8fecf8 69 v |= _pin[i]->read() << i;
valeyev 0:e056ac8fecf8 70 }
valeyev 0:e056ac8fecf8 71 }
valeyev 0:e056ac8fecf8 72 unlock();
valeyev 0:e056ac8fecf8 73 return v;
valeyev 0:e056ac8fecf8 74 }
valeyev 0:e056ac8fecf8 75
valeyev 0:e056ac8fecf8 76 void BusInOut::output() {
valeyev 0:e056ac8fecf8 77 lock();
valeyev 0:e056ac8fecf8 78 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 79 if (_pin[i] != 0) {
valeyev 0:e056ac8fecf8 80 _pin[i]->output();
valeyev 0:e056ac8fecf8 81 }
valeyev 0:e056ac8fecf8 82 }
valeyev 0:e056ac8fecf8 83 unlock();
valeyev 0:e056ac8fecf8 84 }
valeyev 0:e056ac8fecf8 85
valeyev 0:e056ac8fecf8 86 void BusInOut::input() {
valeyev 0:e056ac8fecf8 87 lock();
valeyev 0:e056ac8fecf8 88 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 89 if (_pin[i] != 0) {
valeyev 0:e056ac8fecf8 90 _pin[i]->input();
valeyev 0:e056ac8fecf8 91 }
valeyev 0:e056ac8fecf8 92 }
valeyev 0:e056ac8fecf8 93 unlock();
valeyev 0:e056ac8fecf8 94 }
valeyev 0:e056ac8fecf8 95
valeyev 0:e056ac8fecf8 96 void BusInOut::mode(PinMode pull) {
valeyev 0:e056ac8fecf8 97 lock();
valeyev 0:e056ac8fecf8 98 for (int i=0; i<16; i++) {
valeyev 0:e056ac8fecf8 99 if (_pin[i] != 0) {
valeyev 0:e056ac8fecf8 100 _pin[i]->mode(pull);
valeyev 0:e056ac8fecf8 101 }
valeyev 0:e056ac8fecf8 102 }
valeyev 0:e056ac8fecf8 103 unlock();
valeyev 0:e056ac8fecf8 104 }
valeyev 0:e056ac8fecf8 105
valeyev 0:e056ac8fecf8 106 BusInOut& BusInOut::operator= (int v) {
valeyev 0:e056ac8fecf8 107 // Underlying write is thread safe
valeyev 0:e056ac8fecf8 108 write(v);
valeyev 0:e056ac8fecf8 109 return *this;
valeyev 0:e056ac8fecf8 110 }
valeyev 0:e056ac8fecf8 111
valeyev 0:e056ac8fecf8 112 BusInOut& BusInOut::operator= (BusInOut& rhs) {
valeyev 0:e056ac8fecf8 113 // Underlying read is thread safe
valeyev 0:e056ac8fecf8 114 write(rhs.read());
valeyev 0:e056ac8fecf8 115 return *this;
valeyev 0:e056ac8fecf8 116 }
valeyev 0:e056ac8fecf8 117
valeyev 0:e056ac8fecf8 118 DigitalInOut& BusInOut::operator[] (int index) {
valeyev 0:e056ac8fecf8 119 // No lock needed since _pin is not modified outside the constructor
valeyev 0:e056ac8fecf8 120 MBED_ASSERT(index >= 0 && index <= 16);
valeyev 0:e056ac8fecf8 121 MBED_ASSERT(_pin[index]);
valeyev 0:e056ac8fecf8 122 return *_pin[index];
valeyev 0:e056ac8fecf8 123 }
valeyev 0:e056ac8fecf8 124
valeyev 0:e056ac8fecf8 125 BusInOut::operator int() {
valeyev 0:e056ac8fecf8 126 // Underlying read is thread safe
valeyev 0:e056ac8fecf8 127 return read();
valeyev 0:e056ac8fecf8 128 }
valeyev 0:e056ac8fecf8 129
valeyev 0:e056ac8fecf8 130 void BusInOut::lock() {
valeyev 0:e056ac8fecf8 131 _mutex.lock();
valeyev 0:e056ac8fecf8 132 }
valeyev 0:e056ac8fecf8 133
valeyev 0:e056ac8fecf8 134 void BusInOut::unlock() {
valeyev 0:e056ac8fecf8 135 _mutex.unlock();
valeyev 0:e056ac8fecf8 136 }
valeyev 0:e056ac8fecf8 137
valeyev 0:e056ac8fecf8 138 } // namespace mbed