Committer:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4
Date:
Tue Jun 14 09:21:18 2022 +0000
Revision:
0:bdf663c61a82
lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 1 /* mbed Microcontroller Library
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 2 * Copyright (c) 2006-2013 ARM Limited
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 3 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 4 * Licensed under the Apache License, Version 2.0 (the "License");
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 5 * you may not use this file except in compliance with the License.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 6 * You may obtain a copy of the License at
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 7 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 8 * http://www.apache.org/licenses/LICENSE-2.0
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 9 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 10 * Unless required by applicable law or agreed to in writing, software
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 11 * distributed under the License is distributed on an "AS IS" BASIS,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 13 * See the License for the specific language governing permissions and
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 14 * limitations under the License.
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 15 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 16 #ifndef MBED_DIGITALINOUT_H
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 17 #define MBED_DIGITALINOUT_H
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 18
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 19 #include "platform/platform.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 20
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 21 #include "hal/gpio_api.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 22 #include "platform/mbed_critical.h"
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 23
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 24 namespace mbed {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 25 /** \addtogroup drivers */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 26
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 27 /** A digital input/output, used for setting or reading a bi-directional pin
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 28 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 29 * @note Synchronization level: Interrupt safe
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 30 * @ingroup drivers
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 31 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 32 class DigitalInOut {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 33
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 34 public:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 35 /** Create a DigitalInOut connected to the specified pin
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 36 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 37 * @param pin DigitalInOut pin to connect to
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 38 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 39 DigitalInOut(PinName pin) : gpio() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 40 // No lock needed in the constructor
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 41 gpio_init_in(&gpio, pin);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 42 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 43
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 44 /** Create a DigitalInOut connected to the specified pin
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 45 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 46 * @param pin DigitalInOut pin to connect to
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 47 * @param direction the initial direction of the pin
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 48 * @param mode the initial mode of the pin
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 49 * @param value the initial value of the pin if is an output
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 50 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 51 DigitalInOut(PinName pin, PinDirection direction, PinMode mode, int value) : gpio() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 52 // No lock needed in the constructor
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 53 gpio_init_inout(&gpio, pin, direction, mode, value);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 54 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 55
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 56 /** Set the output, specified as 0 or 1 (int)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 57 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 58 * @param value An integer specifying the pin output value,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 59 * 0 for logical 0, 1 (or any other non-zero value) for logical 1
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 60 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 61 void write(int value) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 62 // Thread safe / atomic HAL call
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 63 gpio_write(&gpio, value);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 64 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 65
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 66 /** Return the output setting, represented as 0 or 1 (int)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 67 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 68 * @returns
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 69 * an integer representing the output setting of the pin if it is an output,
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 70 * or read the input if set as an input
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 71 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 72 int read() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 73 // Thread safe / atomic HAL call
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 74 return gpio_read(&gpio);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 75 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 76
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 77 /** Set as an output
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 78 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 79 void output() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 80 core_util_critical_section_enter();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 81 gpio_dir(&gpio, PIN_OUTPUT);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 82 core_util_critical_section_exit();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 83 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 84
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 85 /** Set as an input
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 86 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 87 void input() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 88 core_util_critical_section_enter();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 89 gpio_dir(&gpio, PIN_INPUT);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 90 core_util_critical_section_exit();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 91 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 92
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 93 /** Set the input pin mode
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 94 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 95 * @param pull PullUp, PullDown, PullNone, OpenDrain
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 96 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 97 void mode(PinMode pull) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 98 core_util_critical_section_enter();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 99 gpio_mode(&gpio, pull);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 100 core_util_critical_section_exit();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 101 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 102
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 103 /** Return the output setting, represented as 0 or 1 (int)
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 104 *
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 105 * @returns
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 106 * Non zero value if pin is connected to uc GPIO
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 107 * 0 if gpio object was initialized with NC
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 108 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 109 int is_connected() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 110 // Thread safe / atomic HAL call
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 111 return gpio_is_connected(&gpio);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 112 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 113
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 114 /** A shorthand for write()
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 115 * \sa DigitalInOut::write()
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 116 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 117 DigitalInOut& operator= (int value) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 118 // Underlying write is thread safe
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 119 write(value);
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 120 return *this;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 121 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 122
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 123 /** A shorthand for write()
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 124 * \sa DigitalInOut::write()
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 125 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 126 DigitalInOut& operator= (DigitalInOut& rhs) {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 127 core_util_critical_section_enter();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 128 write(rhs.read());
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 129 core_util_critical_section_exit();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 130 return *this;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 131 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 132
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 133 /** A shorthand for read()
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 134 * \sa DigitalInOut::read()
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 135 */
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 136 operator int() {
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 137 // Underlying call is thread safe
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 138 return read();
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 139 }
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 140
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 141 protected:
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 142 gpio_t gpio;
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 143 };
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 144
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 145 } // namespace mbed
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 146
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 147 #endif
abe5b02d-a2d4-4fe9-818e-c4e57c809ea4 0:bdf663c61a82 148