1232

Committer:
ganlikun
Date:
Mon Oct 24 15:19:39 2022 +0000
Revision:
0:06036f8bee2d
11

Who changed what in which revision?

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