Christopher Haster / mbed-hal

Dependencies:   target-freescale

Fork of mbed-hal by Morpheus

Committer:
Christopher Haster
Date:
Thu Mar 31 20:10:32 2016 -0500
Revision:
13:d6551a5dcbbf
Parent:
7:4fdb3a44f646
Child:
16:086d28575041
Adopted FunctionPointer for the common function interfaces

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:9c59db1fbc9e 1 /* mbed Microcontroller Library
screamer 0:9c59db1fbc9e 2 * Copyright (c) 2006-2013 ARM Limited
screamer 0:9c59db1fbc9e 3 *
screamer 0:9c59db1fbc9e 4 * Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:9c59db1fbc9e 5 * you may not use this file except in compliance with the License.
screamer 0:9c59db1fbc9e 6 * You may obtain a copy of the License at
screamer 0:9c59db1fbc9e 7 *
screamer 0:9c59db1fbc9e 8 * http://www.apache.org/licenses/LICENSE-2.0
screamer 0:9c59db1fbc9e 9 *
screamer 0:9c59db1fbc9e 10 * Unless required by applicable law or agreed to in writing, software
screamer 0:9c59db1fbc9e 11 * distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:9c59db1fbc9e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:9c59db1fbc9e 13 * See the License for the specific language governing permissions and
screamer 0:9c59db1fbc9e 14 * limitations under the License.
screamer 0:9c59db1fbc9e 15 */
screamer 0:9c59db1fbc9e 16 #ifndef MBED_SERIALBASE_H
screamer 0:9c59db1fbc9e 17 #define MBED_SERIALBASE_H
screamer 0:9c59db1fbc9e 18
screamer 0:9c59db1fbc9e 19 #include "platform.h"
screamer 0:9c59db1fbc9e 20
screamer 0:9c59db1fbc9e 21 #if DEVICE_SERIAL
screamer 0:9c59db1fbc9e 22
screamer 0:9c59db1fbc9e 23 #include "Stream.h"
Christopher Haster 13:d6551a5dcbbf 24 #include "FunctionPointer.h"
screamer 0:9c59db1fbc9e 25 #include "serial_api.h"
screamer 0:9c59db1fbc9e 26
screamer 0:9c59db1fbc9e 27 #if DEVICE_SERIAL_ASYNCH
screamer 0:9c59db1fbc9e 28 #include "CThunk.h"
screamer 0:9c59db1fbc9e 29 #include "dma_api.h"
screamer 0:9c59db1fbc9e 30 #endif
screamer 0:9c59db1fbc9e 31
screamer 0:9c59db1fbc9e 32 namespace mbed {
screamer 0:9c59db1fbc9e 33
screamer 0:9c59db1fbc9e 34 /** A base class for serial port implementations
screamer 0:9c59db1fbc9e 35 * Can't be instantiated directly (use Serial or RawSerial)
screamer 0:9c59db1fbc9e 36 */
screamer 0:9c59db1fbc9e 37 class SerialBase {
screamer 0:9c59db1fbc9e 38
screamer 0:9c59db1fbc9e 39 public:
screamer 0:9c59db1fbc9e 40 /** Set the baud rate of the serial port
screamer 0:9c59db1fbc9e 41 *
screamer 0:9c59db1fbc9e 42 * @param baudrate The baudrate of the serial port (default = 9600).
screamer 0:9c59db1fbc9e 43 */
screamer 0:9c59db1fbc9e 44 void baud(int baudrate);
screamer 0:9c59db1fbc9e 45
screamer 0:9c59db1fbc9e 46 enum Parity {
screamer 0:9c59db1fbc9e 47 None = 0,
screamer 0:9c59db1fbc9e 48 Odd,
screamer 0:9c59db1fbc9e 49 Even,
screamer 0:9c59db1fbc9e 50 Forced1,
screamer 0:9c59db1fbc9e 51 Forced0
screamer 0:9c59db1fbc9e 52 };
screamer 0:9c59db1fbc9e 53
screamer 0:9c59db1fbc9e 54 enum IrqType {
screamer 0:9c59db1fbc9e 55 RxIrq = 0,
screamer 0:9c59db1fbc9e 56 TxIrq
screamer 0:9c59db1fbc9e 57 };
screamer 0:9c59db1fbc9e 58
screamer 0:9c59db1fbc9e 59 enum Flow {
screamer 0:9c59db1fbc9e 60 Disabled = 0,
screamer 0:9c59db1fbc9e 61 RTS,
screamer 0:9c59db1fbc9e 62 CTS,
screamer 0:9c59db1fbc9e 63 RTSCTS
screamer 0:9c59db1fbc9e 64 };
screamer 0:9c59db1fbc9e 65
screamer 0:9c59db1fbc9e 66 /** Set the transmission format used by the serial port
screamer 0:9c59db1fbc9e 67 *
screamer 0:9c59db1fbc9e 68 * @param bits The number of bits in a word (5-8; default = 8)
screamer 0:9c59db1fbc9e 69 * @param parity The parity used (SerialBase::None, SerialBase::Odd, SerialBase::Even, SerialBase::Forced1, SerialBase::Forced0; default = SerialBase::None)
screamer 0:9c59db1fbc9e 70 * @param stop The number of stop bits (1 or 2; default = 1)
screamer 0:9c59db1fbc9e 71 */
screamer 0:9c59db1fbc9e 72 void format(int bits=8, Parity parity=SerialBase::None, int stop_bits=1);
screamer 0:9c59db1fbc9e 73
screamer 0:9c59db1fbc9e 74 /** Determine if there is a character available to read
screamer 0:9c59db1fbc9e 75 *
screamer 0:9c59db1fbc9e 76 * @returns
screamer 0:9c59db1fbc9e 77 * 1 if there is a character available to read,
screamer 0:9c59db1fbc9e 78 * 0 otherwise
screamer 0:9c59db1fbc9e 79 */
screamer 0:9c59db1fbc9e 80 int readable();
screamer 0:9c59db1fbc9e 81
screamer 0:9c59db1fbc9e 82 /** Determine if there is space available to write a character
screamer 0:9c59db1fbc9e 83 *
screamer 0:9c59db1fbc9e 84 * @returns
screamer 0:9c59db1fbc9e 85 * 1 if there is space to write a character,
screamer 0:9c59db1fbc9e 86 * 0 otherwise
screamer 0:9c59db1fbc9e 87 */
screamer 0:9c59db1fbc9e 88 int writeable();
screamer 0:9c59db1fbc9e 89
screamer 0:9c59db1fbc9e 90 /** Attach a function to call whenever a serial interrupt is generated
screamer 0:9c59db1fbc9e 91 *
screamer 0:9c59db1fbc9e 92 * @param fptr A pointer to a void function, or 0 to set as none
screamer 0:9c59db1fbc9e 93 * @param type Which serial interrupt to attach the member function to (Seriall::RxIrq for receive, TxIrq for transmit buffer empty)
screamer 0:9c59db1fbc9e 94 */
screamer 0:9c59db1fbc9e 95 void attach(void (*fptr)(void), IrqType type=RxIrq);
screamer 0:9c59db1fbc9e 96
screamer 0:9c59db1fbc9e 97 /** Attach a member function to call whenever a serial interrupt is generated
screamer 0:9c59db1fbc9e 98 *
screamer 0:9c59db1fbc9e 99 * @param tptr pointer to the object to call the member function on
screamer 0:9c59db1fbc9e 100 * @param mptr pointer to the member function to be called
screamer 0:9c59db1fbc9e 101 * @param type Which serial interrupt to attach the member function to (Seriall::RxIrq for receive, TxIrq for transmit buffer empty)
screamer 0:9c59db1fbc9e 102 */
screamer 0:9c59db1fbc9e 103 template<typename T>
screamer 0:9c59db1fbc9e 104 void attach(T* tptr, void (T::*mptr)(void), IrqType type=RxIrq) {
screamer 0:9c59db1fbc9e 105 if((mptr != NULL) && (tptr != NULL)) {
screamer 0:9c59db1fbc9e 106 _irq[type].attach(tptr, mptr);
screamer 0:9c59db1fbc9e 107 serial_irq_set(&_serial, (SerialIrq)type, 1);
screamer 0:9c59db1fbc9e 108 } else {
screamer 0:9c59db1fbc9e 109 serial_irq_set(&_serial, (SerialIrq)type, 0);
screamer 0:9c59db1fbc9e 110 }
screamer 0:9c59db1fbc9e 111 }
screamer 0:9c59db1fbc9e 112
screamer 0:9c59db1fbc9e 113 /** Generate a break condition on the serial line
screamer 0:9c59db1fbc9e 114 */
screamer 0:9c59db1fbc9e 115 void send_break();
screamer 0:9c59db1fbc9e 116
screamer 0:9c59db1fbc9e 117 #if DEVICE_SERIAL_FC
screamer 0:9c59db1fbc9e 118 /** Set the flow control type on the serial port
screamer 0:9c59db1fbc9e 119 *
screamer 0:9c59db1fbc9e 120 * @param type the flow control type (Disabled, RTS, CTS, RTSCTS)
screamer 0:9c59db1fbc9e 121 * @param flow1 the first flow control pin (RTS for RTS or RTSCTS, CTS for CTS)
screamer 0:9c59db1fbc9e 122 * @param flow2 the second flow control pin (CTS for RTSCTS)
screamer 0:9c59db1fbc9e 123 */
screamer 0:9c59db1fbc9e 124 void set_flow_control(Flow type, PinName flow1=NC, PinName flow2=NC);
screamer 0:9c59db1fbc9e 125 #endif
screamer 0:9c59db1fbc9e 126
screamer 0:9c59db1fbc9e 127 static void _irq_handler(uint32_t id, SerialIrq irq_type);
screamer 0:9c59db1fbc9e 128
screamer 0:9c59db1fbc9e 129 #if DEVICE_SERIAL_ASYNCH
screamer 0:9c59db1fbc9e 130
screamer 0:9c59db1fbc9e 131 /** Begin asynchronous write using 8bit buffer. The completition invokes registered TX event callback
screamer 0:9c59db1fbc9e 132 *
screamer 0:9c59db1fbc9e 133 * @param buffer The buffer where received data will be stored
screamer 0:9c59db1fbc9e 134 * @param length The buffer length in bytes
screamer 0:9c59db1fbc9e 135 * @param callback The event callback function
screamer 0:9c59db1fbc9e 136 * @param event The logical OR of TX events
screamer 0:9c59db1fbc9e 137 */
screamer 0:9c59db1fbc9e 138 int write(const uint8_t *buffer, int length, const event_callback_t& callback, int event = SERIAL_EVENT_TX_COMPLETE);
screamer 0:9c59db1fbc9e 139
screamer 0:9c59db1fbc9e 140 /** Begin asynchronous write using 16bit buffer. The completition invokes registered TX event callback
screamer 0:9c59db1fbc9e 141 *
screamer 0:9c59db1fbc9e 142 * @param buffer The buffer where received data will be stored
screamer 0:9c59db1fbc9e 143 * @param length The buffer length in bytes
screamer 0:9c59db1fbc9e 144 * @param callback The event callback function
screamer 0:9c59db1fbc9e 145 * @param event The logical OR of TX events
screamer 0:9c59db1fbc9e 146 */
screamer 0:9c59db1fbc9e 147 int write(const uint16_t *buffer, int length, const event_callback_t& callback, int event = SERIAL_EVENT_TX_COMPLETE);
screamer 0:9c59db1fbc9e 148
screamer 0:9c59db1fbc9e 149 /** Abort the on-going write transfer
screamer 0:9c59db1fbc9e 150 */
screamer 0:9c59db1fbc9e 151 void abort_write();
screamer 0:9c59db1fbc9e 152
screamer 0:9c59db1fbc9e 153 /** Begin asynchronous reading using 8bit buffer. The completition invokes registred RX event callback.
screamer 0:9c59db1fbc9e 154 *
screamer 0:9c59db1fbc9e 155 * @param buffer The buffer where received data will be stored
screamer 0:9c59db1fbc9e 156 * @param length The buffer length in bytes
screamer 0:9c59db1fbc9e 157 * @param callback The event callback function
screamer 0:9c59db1fbc9e 158 * @param event The logical OR of RX events
screamer 0:9c59db1fbc9e 159 * @param char_match The matching character
screamer 0:9c59db1fbc9e 160 */
screamer 0:9c59db1fbc9e 161 int read(uint8_t *buffer, int length, const event_callback_t& callback, int event = SERIAL_EVENT_RX_COMPLETE, unsigned char char_match = SERIAL_RESERVED_CHAR_MATCH);
screamer 0:9c59db1fbc9e 162
screamer 0:9c59db1fbc9e 163 /** Begin asynchronous reading using 16bit buffer. The completition invokes registred RX event callback.
screamer 0:9c59db1fbc9e 164 *
screamer 0:9c59db1fbc9e 165 * @param buffer The buffer where received data will be stored
screamer 0:9c59db1fbc9e 166 * @param length The buffer length in bytes
screamer 0:9c59db1fbc9e 167 * @param callback The event callback function
screamer 0:9c59db1fbc9e 168 * @param event The logical OR of RX events
screamer 0:9c59db1fbc9e 169 * @param char_match The matching character
screamer 0:9c59db1fbc9e 170 */
screamer 0:9c59db1fbc9e 171 int read(uint16_t *buffer, int length, const event_callback_t& callback, int event = SERIAL_EVENT_RX_COMPLETE, unsigned char char_match = SERIAL_RESERVED_CHAR_MATCH);
screamer 0:9c59db1fbc9e 172
screamer 0:9c59db1fbc9e 173 /** Abort the on-going read transfer
screamer 0:9c59db1fbc9e 174 */
screamer 0:9c59db1fbc9e 175 void abort_read();
screamer 0:9c59db1fbc9e 176
screamer 0:9c59db1fbc9e 177 /** Configure DMA usage suggestion for non-blocking TX transfers
screamer 0:9c59db1fbc9e 178 *
screamer 0:9c59db1fbc9e 179 * @param usage The usage DMA hint for peripheral
screamer 0:9c59db1fbc9e 180 * @return Zero if the usage was set, -1 if a transaction is on-going
screamer 0:9c59db1fbc9e 181 */
screamer 0:9c59db1fbc9e 182 int set_dma_usage_tx(DMAUsage usage);
screamer 0:9c59db1fbc9e 183
screamer 0:9c59db1fbc9e 184 /** Configure DMA usage suggestion for non-blocking RX transfers
screamer 0:9c59db1fbc9e 185 *
screamer 0:9c59db1fbc9e 186 * @param usage The usage DMA hint for peripheral
screamer 0:9c59db1fbc9e 187 * @return Zero if the usage was set, -1 if a transaction is on-going
screamer 0:9c59db1fbc9e 188 */
screamer 0:9c59db1fbc9e 189 int set_dma_usage_rx(DMAUsage usage);
screamer 0:9c59db1fbc9e 190
screamer 0:9c59db1fbc9e 191 protected:
screamer 0:9c59db1fbc9e 192 void start_read(void *buffer, int buffer_size, char buffer_width, const event_callback_t& callback, int event, unsigned char char_match);
screamer 0:9c59db1fbc9e 193 void start_write(const void *buffer, int buffer_size, char buffer_width, const event_callback_t& callback, int event);
screamer 0:9c59db1fbc9e 194 void interrupt_handler_asynch(void);
screamer 0:9c59db1fbc9e 195 #endif
screamer 0:9c59db1fbc9e 196
screamer 0:9c59db1fbc9e 197 protected:
screamer 0:9c59db1fbc9e 198 SerialBase(PinName tx, PinName rx);
screamer 0:9c59db1fbc9e 199 virtual ~SerialBase() {
screamer 0:9c59db1fbc9e 200 }
screamer 0:9c59db1fbc9e 201
screamer 0:9c59db1fbc9e 202 int _base_getc();
screamer 0:9c59db1fbc9e 203 int _base_putc(int c);
screamer 0:9c59db1fbc9e 204
screamer 0:9c59db1fbc9e 205 #if DEVICE_SERIAL_ASYNCH
screamer 0:9c59db1fbc9e 206 CThunk<SerialBase> _thunk_irq;
screamer 0:9c59db1fbc9e 207 event_callback_t _tx_callback;
screamer 0:9c59db1fbc9e 208 event_callback_t _rx_callback;
screamer 0:9c59db1fbc9e 209 DMAUsage _tx_usage;
screamer 0:9c59db1fbc9e 210 DMAUsage _rx_usage;
screamer 0:9c59db1fbc9e 211 #endif
screamer 0:9c59db1fbc9e 212
Christopher Haster 7:4fdb3a44f646 213 serial_t _serial;
Christopher Haster 13:d6551a5dcbbf 214 FunctionPointer _irq[2];
Christopher Haster 7:4fdb3a44f646 215 int _baud;
screamer 0:9c59db1fbc9e 216
screamer 0:9c59db1fbc9e 217 };
screamer 0:9c59db1fbc9e 218
screamer 0:9c59db1fbc9e 219 } // namespace mbed
screamer 0:9c59db1fbc9e 220
screamer 0:9c59db1fbc9e 221 #endif
screamer 0:9c59db1fbc9e 222
screamer 0:9c59db1fbc9e 223 #endif
screamer 0:9c59db1fbc9e 224