001

Committer:
ganlikun
Date:
Sun Jun 12 14:02:44 2022 +0000
Revision:
0:13413ea9a877
00

Who changed what in which revision?

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