Mouse code for the MacroRat

Dependencies:   ITG3200 QEI

Committer:
sahilmgandhi
Date:
Sat Jun 03 00:22:44 2017 +0000
Revision:
46:b156ef445742
Parent:
18:6a4db94011d3
Final code for internal battlebot competition.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sahilmgandhi 18:6a4db94011d3 1 /*
sahilmgandhi 18:6a4db94011d3 2 * Copyright (c) 2013 Nordic Semiconductor ASA
sahilmgandhi 18:6a4db94011d3 3 * All rights reserved.
sahilmgandhi 18:6a4db94011d3 4 *
sahilmgandhi 18:6a4db94011d3 5 * Redistribution and use in source and binary forms, with or without modification,
sahilmgandhi 18:6a4db94011d3 6 * are permitted provided that the following conditions are met:
sahilmgandhi 18:6a4db94011d3 7 *
sahilmgandhi 18:6a4db94011d3 8 * 1. Redistributions of source code must retain the above copyright notice, this list
sahilmgandhi 18:6a4db94011d3 9 * of conditions and the following disclaimer.
sahilmgandhi 18:6a4db94011d3 10 *
sahilmgandhi 18:6a4db94011d3 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
sahilmgandhi 18:6a4db94011d3 12 * integrated circuit in a product or a software update for such product, must reproduce
sahilmgandhi 18:6a4db94011d3 13 * the above copyright notice, this list of conditions and the following disclaimer in
sahilmgandhi 18:6a4db94011d3 14 * the documentation and/or other materials provided with the distribution.
sahilmgandhi 18:6a4db94011d3 15 *
sahilmgandhi 18:6a4db94011d3 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
sahilmgandhi 18:6a4db94011d3 17 * used to endorse or promote products derived from this software without specific prior
sahilmgandhi 18:6a4db94011d3 18 * written permission.
sahilmgandhi 18:6a4db94011d3 19 *
sahilmgandhi 18:6a4db94011d3 20 * 4. This software, with or without modification, must only be used with a
sahilmgandhi 18:6a4db94011d3 21 * Nordic Semiconductor ASA integrated circuit.
sahilmgandhi 18:6a4db94011d3 22 *
sahilmgandhi 18:6a4db94011d3 23 * 5. Any software provided in binary or object form under this license must not be reverse
sahilmgandhi 18:6a4db94011d3 24 * engineered, decompiled, modified and/or disassembled.
sahilmgandhi 18:6a4db94011d3 25 *
sahilmgandhi 18:6a4db94011d3 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
sahilmgandhi 18:6a4db94011d3 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
sahilmgandhi 18:6a4db94011d3 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
sahilmgandhi 18:6a4db94011d3 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
sahilmgandhi 18:6a4db94011d3 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
sahilmgandhi 18:6a4db94011d3 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
sahilmgandhi 18:6a4db94011d3 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
sahilmgandhi 18:6a4db94011d3 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
sahilmgandhi 18:6a4db94011d3 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
sahilmgandhi 18:6a4db94011d3 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
sahilmgandhi 18:6a4db94011d3 36 *
sahilmgandhi 18:6a4db94011d3 37 */
sahilmgandhi 18:6a4db94011d3 38
sahilmgandhi 18:6a4db94011d3 39 #include "serial_api.h"
sahilmgandhi 18:6a4db94011d3 40
sahilmgandhi 18:6a4db94011d3 41 #if DEVICE_SERIAL
sahilmgandhi 18:6a4db94011d3 42
sahilmgandhi 18:6a4db94011d3 43 #include <string.h>
sahilmgandhi 18:6a4db94011d3 44 #include "mbed_assert.h"
sahilmgandhi 18:6a4db94011d3 45 #include "mbed_error.h"
sahilmgandhi 18:6a4db94011d3 46 #include "nrf_uart.h"
sahilmgandhi 18:6a4db94011d3 47 #include "nrf_drv_common.h"
sahilmgandhi 18:6a4db94011d3 48 #include "nrf_drv_config.h"
sahilmgandhi 18:6a4db94011d3 49 #include "app_util_platform.h"
sahilmgandhi 18:6a4db94011d3 50 #include "nrf_gpio.h"
sahilmgandhi 18:6a4db94011d3 51
sahilmgandhi 18:6a4db94011d3 52 #define UART_INSTANCE_COUNT 1
sahilmgandhi 18:6a4db94011d3 53 #define UART_INSTANCE NRF_UART0
sahilmgandhi 18:6a4db94011d3 54 #define UART_IRQn UART0_IRQn
sahilmgandhi 18:6a4db94011d3 55 #define UART_IRQ_HANDLER UART0_IRQHandler
sahilmgandhi 18:6a4db94011d3 56 #define UART_INSTANCE_ID 0
sahilmgandhi 18:6a4db94011d3 57 #define UART_CB uart_cb[UART_INSTANCE_ID]
sahilmgandhi 18:6a4db94011d3 58
sahilmgandhi 18:6a4db94011d3 59 #define UART_DEFAULT_BAUDRATE UART0_CONFIG_BAUDRATE
sahilmgandhi 18:6a4db94011d3 60 #define UART_DEFAULT_PARITY UART0_CONFIG_PARITY
sahilmgandhi 18:6a4db94011d3 61
sahilmgandhi 18:6a4db94011d3 62 // expected the macro from mbed configuration system
sahilmgandhi 18:6a4db94011d3 63 #ifndef MBED_CONF_NORDIC_UART_HWFC
sahilmgandhi 18:6a4db94011d3 64 #define MBED_CONF_NORDIC_UART_HWFC 1
sahilmgandhi 18:6a4db94011d3 65 #warning None of UART flow control configuration (expected macro MBED_CONF_NORDIC_UART_HWFC). The RTSCTS flow control is used by default .
sahilmgandhi 18:6a4db94011d3 66 #endif
sahilmgandhi 18:6a4db94011d3 67
sahilmgandhi 18:6a4db94011d3 68 #if MBED_CONF_NORDIC_UART_HWFC == 1
sahilmgandhi 18:6a4db94011d3 69 #define UART_DEFAULT_HWFC UART0_CONFIG_HWFC
sahilmgandhi 18:6a4db94011d3 70 #else
sahilmgandhi 18:6a4db94011d3 71 #define UART_DEFAULT_HWFC NRF_UART_HWFC_DISABLED
sahilmgandhi 18:6a4db94011d3 72 #endif
sahilmgandhi 18:6a4db94011d3 73
sahilmgandhi 18:6a4db94011d3 74 #define UART_DEFAULT_CTS UART0_CONFIG_PSEL_CTS
sahilmgandhi 18:6a4db94011d3 75 #define UART_DEFAULT_RTS UART0_CONFIG_PSEL_RTS
sahilmgandhi 18:6a4db94011d3 76
sahilmgandhi 18:6a4db94011d3 77 #ifdef NRF51
sahilmgandhi 18:6a4db94011d3 78 #define NRFx_MBED_UART_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW
sahilmgandhi 18:6a4db94011d3 79 #elif defined(NRF52)
sahilmgandhi 18:6a4db94011d3 80 #define NRFx_MBED_UART_IRQ_PRIORITY APP_IRQ_PRIORITY_LOWEST
sahilmgandhi 18:6a4db94011d3 81 #endif
sahilmgandhi 18:6a4db94011d3 82
sahilmgandhi 18:6a4db94011d3 83 // Required by "retarget.cpp".
sahilmgandhi 18:6a4db94011d3 84 int stdio_uart_inited = 0;
sahilmgandhi 18:6a4db94011d3 85 serial_t stdio_uart;
sahilmgandhi 18:6a4db94011d3 86
sahilmgandhi 18:6a4db94011d3 87 typedef struct {
sahilmgandhi 18:6a4db94011d3 88 bool initialized;
sahilmgandhi 18:6a4db94011d3 89 uint32_t irq_context;
sahilmgandhi 18:6a4db94011d3 90 uart_irq_handler irq_handler;
sahilmgandhi 18:6a4db94011d3 91
sahilmgandhi 18:6a4db94011d3 92 uint32_t pselrxd;
sahilmgandhi 18:6a4db94011d3 93 uint32_t pseltxd;
sahilmgandhi 18:6a4db94011d3 94 uint32_t pselcts;
sahilmgandhi 18:6a4db94011d3 95 uint32_t pselrts;
sahilmgandhi 18:6a4db94011d3 96 nrf_uart_hwfc_t hwfc;
sahilmgandhi 18:6a4db94011d3 97 nrf_uart_parity_t parity;
sahilmgandhi 18:6a4db94011d3 98 nrf_uart_baudrate_t baudrate;
sahilmgandhi 18:6a4db94011d3 99
sahilmgandhi 18:6a4db94011d3 100 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 101 bool volatile rx_active;
sahilmgandhi 18:6a4db94011d3 102 uint8_t *rx_buffer;
sahilmgandhi 18:6a4db94011d3 103 size_t rx_length;
sahilmgandhi 18:6a4db94011d3 104 size_t rx_pos;
sahilmgandhi 18:6a4db94011d3 105 void (*rx_asynch_handler)();
sahilmgandhi 18:6a4db94011d3 106 uint8_t char_match;
sahilmgandhi 18:6a4db94011d3 107
sahilmgandhi 18:6a4db94011d3 108 bool volatile tx_active;
sahilmgandhi 18:6a4db94011d3 109 const uint8_t *tx_buffer;
sahilmgandhi 18:6a4db94011d3 110 size_t tx_length;
sahilmgandhi 18:6a4db94011d3 111 size_t tx_pos;
sahilmgandhi 18:6a4db94011d3 112 void (*tx_asynch_handler)();
sahilmgandhi 18:6a4db94011d3 113
sahilmgandhi 18:6a4db94011d3 114 uint32_t events_wanted;
sahilmgandhi 18:6a4db94011d3 115 uint32_t events_occured;
sahilmgandhi 18:6a4db94011d3 116
sahilmgandhi 18:6a4db94011d3 117 #define UART_IRQ_TX 1
sahilmgandhi 18:6a4db94011d3 118 #define UART_IRQ_RX 2
sahilmgandhi 18:6a4db94011d3 119 uint8_t irq_enabled;
sahilmgandhi 18:6a4db94011d3 120 #endif // DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 121 } uart_ctlblock_t;
sahilmgandhi 18:6a4db94011d3 122
sahilmgandhi 18:6a4db94011d3 123 static uart_ctlblock_t uart_cb[UART_INSTANCE_COUNT];
sahilmgandhi 18:6a4db94011d3 124
sahilmgandhi 18:6a4db94011d3 125 static void internal_set_hwfc(FlowControl type,
sahilmgandhi 18:6a4db94011d3 126 PinName rxflow, PinName txflow);
sahilmgandhi 18:6a4db94011d3 127
sahilmgandhi 18:6a4db94011d3 128
sahilmgandhi 18:6a4db94011d3 129 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 130 static void end_asynch_rx(void)
sahilmgandhi 18:6a4db94011d3 131 {
sahilmgandhi 18:6a4db94011d3 132 // If RX interrupt is activated for synchronous operations,
sahilmgandhi 18:6a4db94011d3 133 // don't disable it, just stop handling it here.
sahilmgandhi 18:6a4db94011d3 134 if (!(UART_CB.irq_enabled & UART_IRQ_RX)) {
sahilmgandhi 18:6a4db94011d3 135 nrf_uart_int_disable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY);
sahilmgandhi 18:6a4db94011d3 136 }
sahilmgandhi 18:6a4db94011d3 137 UART_CB.rx_active = false;
sahilmgandhi 18:6a4db94011d3 138 }
sahilmgandhi 18:6a4db94011d3 139 static void end_asynch_tx(void)
sahilmgandhi 18:6a4db94011d3 140 {
sahilmgandhi 18:6a4db94011d3 141 // If TX interrupt is activated for synchronous operations,
sahilmgandhi 18:6a4db94011d3 142 // don't disable it, just stop handling it here.
sahilmgandhi 18:6a4db94011d3 143 if (!(UART_CB.irq_enabled & UART_IRQ_TX)) {
sahilmgandhi 18:6a4db94011d3 144 nrf_uart_int_disable(UART_INSTANCE, NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 145 }
sahilmgandhi 18:6a4db94011d3 146 UART_CB.tx_active = false;
sahilmgandhi 18:6a4db94011d3 147 }
sahilmgandhi 18:6a4db94011d3 148 #endif // DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 149
sahilmgandhi 18:6a4db94011d3 150 void UART_IRQ_HANDLER(void)
sahilmgandhi 18:6a4db94011d3 151 {
sahilmgandhi 18:6a4db94011d3 152 if (nrf_uart_int_enable_check(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY) &&
sahilmgandhi 18:6a4db94011d3 153 nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_RXDRDY)) {
sahilmgandhi 18:6a4db94011d3 154
sahilmgandhi 18:6a4db94011d3 155 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 156 if (UART_CB.rx_active) {
sahilmgandhi 18:6a4db94011d3 157 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_RXDRDY);
sahilmgandhi 18:6a4db94011d3 158
sahilmgandhi 18:6a4db94011d3 159 uint8_t rx_data = nrf_uart_rxd_get(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 160 UART_CB.rx_buffer[UART_CB.rx_pos] = rx_data;
sahilmgandhi 18:6a4db94011d3 161
sahilmgandhi 18:6a4db94011d3 162 bool end_rx = false;
sahilmgandhi 18:6a4db94011d3 163 // If character matching should be performed, check if the current
sahilmgandhi 18:6a4db94011d3 164 // data matches the given one.
sahilmgandhi 18:6a4db94011d3 165 if (UART_CB.char_match != SERIAL_RESERVED_CHAR_MATCH &&
sahilmgandhi 18:6a4db94011d3 166 rx_data == UART_CB.char_match) {
sahilmgandhi 18:6a4db94011d3 167 // If it does, report the match and abort further receiving.
sahilmgandhi 18:6a4db94011d3 168 UART_CB.events_occured |= SERIAL_EVENT_RX_CHARACTER_MATCH;
sahilmgandhi 18:6a4db94011d3 169 if (UART_CB.events_wanted & SERIAL_EVENT_RX_CHARACTER_MATCH) {
sahilmgandhi 18:6a4db94011d3 170 end_rx = true;
sahilmgandhi 18:6a4db94011d3 171 }
sahilmgandhi 18:6a4db94011d3 172 }
sahilmgandhi 18:6a4db94011d3 173 if (++UART_CB.rx_pos >= UART_CB.rx_length) {
sahilmgandhi 18:6a4db94011d3 174 UART_CB.events_occured |= SERIAL_EVENT_RX_COMPLETE;
sahilmgandhi 18:6a4db94011d3 175 end_rx = true;
sahilmgandhi 18:6a4db94011d3 176 }
sahilmgandhi 18:6a4db94011d3 177 if (end_rx) {
sahilmgandhi 18:6a4db94011d3 178 end_asynch_rx();
sahilmgandhi 18:6a4db94011d3 179
sahilmgandhi 18:6a4db94011d3 180 if (UART_CB.rx_asynch_handler) {
sahilmgandhi 18:6a4db94011d3 181 // Use local variable to make it possible to start a next
sahilmgandhi 18:6a4db94011d3 182 // transfer from callback routine.
sahilmgandhi 18:6a4db94011d3 183 void (*handler)() = UART_CB.rx_asynch_handler;
sahilmgandhi 18:6a4db94011d3 184 UART_CB.rx_asynch_handler = NULL;
sahilmgandhi 18:6a4db94011d3 185 handler();
sahilmgandhi 18:6a4db94011d3 186 }
sahilmgandhi 18:6a4db94011d3 187 }
sahilmgandhi 18:6a4db94011d3 188 }
sahilmgandhi 18:6a4db94011d3 189 else
sahilmgandhi 18:6a4db94011d3 190 #endif
sahilmgandhi 18:6a4db94011d3 191
sahilmgandhi 18:6a4db94011d3 192 if (UART_CB.irq_handler) {
sahilmgandhi 18:6a4db94011d3 193 UART_CB.irq_handler(UART_CB.irq_context, RxIrq);
sahilmgandhi 18:6a4db94011d3 194 }
sahilmgandhi 18:6a4db94011d3 195 }
sahilmgandhi 18:6a4db94011d3 196
sahilmgandhi 18:6a4db94011d3 197 if (nrf_uart_int_enable_check(UART_INSTANCE, NRF_UART_INT_MASK_TXDRDY) &&
sahilmgandhi 18:6a4db94011d3 198 nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_TXDRDY)) {
sahilmgandhi 18:6a4db94011d3 199
sahilmgandhi 18:6a4db94011d3 200 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 201 if (UART_CB.tx_active) {
sahilmgandhi 18:6a4db94011d3 202 if (UART_CB.tx_pos < UART_CB.tx_length) {
sahilmgandhi 18:6a4db94011d3 203 // When there is still something to send, clear the TXDRDY event
sahilmgandhi 18:6a4db94011d3 204 // and put next byte to transmitter.
sahilmgandhi 18:6a4db94011d3 205 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_TXDRDY);
sahilmgandhi 18:6a4db94011d3 206 nrf_uart_txd_set(UART_INSTANCE,
sahilmgandhi 18:6a4db94011d3 207 UART_CB.tx_buffer[UART_CB.tx_pos]);
sahilmgandhi 18:6a4db94011d3 208 UART_CB.tx_pos++;
sahilmgandhi 18:6a4db94011d3 209 }
sahilmgandhi 18:6a4db94011d3 210 else {
sahilmgandhi 18:6a4db94011d3 211 // When the TXDRDY event is set after the last byte to be sent
sahilmgandhi 18:6a4db94011d3 212 // has been passed to the transmitter, the job is done and TX
sahilmgandhi 18:6a4db94011d3 213 // complete can be indicated.
sahilmgandhi 18:6a4db94011d3 214 // Don't clear the TXDRDY event, it needs to remain set for the
sahilmgandhi 18:6a4db94011d3 215 // 'serial_writable' function to work properly.
sahilmgandhi 18:6a4db94011d3 216 end_asynch_tx();
sahilmgandhi 18:6a4db94011d3 217
sahilmgandhi 18:6a4db94011d3 218 UART_CB.events_occured |= SERIAL_EVENT_TX_COMPLETE;
sahilmgandhi 18:6a4db94011d3 219 if (UART_CB.tx_asynch_handler) {
sahilmgandhi 18:6a4db94011d3 220 // Use local variable to make it possible to start a next
sahilmgandhi 18:6a4db94011d3 221 // transfer from callback routine.
sahilmgandhi 18:6a4db94011d3 222 void (*handler)() = UART_CB.tx_asynch_handler;
sahilmgandhi 18:6a4db94011d3 223 UART_CB.tx_asynch_handler = NULL;
sahilmgandhi 18:6a4db94011d3 224 handler();
sahilmgandhi 18:6a4db94011d3 225 }
sahilmgandhi 18:6a4db94011d3 226 }
sahilmgandhi 18:6a4db94011d3 227 }
sahilmgandhi 18:6a4db94011d3 228 else
sahilmgandhi 18:6a4db94011d3 229 #endif
sahilmgandhi 18:6a4db94011d3 230
sahilmgandhi 18:6a4db94011d3 231 if (UART_CB.irq_handler) {
sahilmgandhi 18:6a4db94011d3 232 UART_CB.irq_handler(UART_CB.irq_context, TxIrq);
sahilmgandhi 18:6a4db94011d3 233 }
sahilmgandhi 18:6a4db94011d3 234 }
sahilmgandhi 18:6a4db94011d3 235
sahilmgandhi 18:6a4db94011d3 236 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 237 if (nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_ERROR)) {
sahilmgandhi 18:6a4db94011d3 238 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_ERROR);
sahilmgandhi 18:6a4db94011d3 239
sahilmgandhi 18:6a4db94011d3 240 uint8_t errorsrc = nrf_uart_errorsrc_get_and_clear(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 241 if (UART_CB.rx_asynch_handler) {
sahilmgandhi 18:6a4db94011d3 242 UART_CB.events_occured |= SERIAL_EVENT_ERROR;
sahilmgandhi 18:6a4db94011d3 243 if (errorsrc & NRF_UART_ERROR_PARITY_MASK) {
sahilmgandhi 18:6a4db94011d3 244 UART_CB.events_occured |= SERIAL_EVENT_RX_PARITY_ERROR;
sahilmgandhi 18:6a4db94011d3 245 }
sahilmgandhi 18:6a4db94011d3 246 if (errorsrc & NRF_UART_ERROR_FRAMING_MASK) {
sahilmgandhi 18:6a4db94011d3 247 UART_CB.events_occured |= SERIAL_EVENT_RX_FRAMING_ERROR;
sahilmgandhi 18:6a4db94011d3 248 }
sahilmgandhi 18:6a4db94011d3 249 if (errorsrc & NRF_UART_ERROR_OVERRUN_MASK) {
sahilmgandhi 18:6a4db94011d3 250 UART_CB.events_occured |= SERIAL_EVENT_RX_OVERRUN_ERROR;
sahilmgandhi 18:6a4db94011d3 251 }
sahilmgandhi 18:6a4db94011d3 252 UART_CB.rx_asynch_handler();
sahilmgandhi 18:6a4db94011d3 253 }
sahilmgandhi 18:6a4db94011d3 254 }
sahilmgandhi 18:6a4db94011d3 255 #endif // DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 256 }
sahilmgandhi 18:6a4db94011d3 257
sahilmgandhi 18:6a4db94011d3 258 void serial_init(serial_t *obj, PinName tx, PinName rx) {
sahilmgandhi 18:6a4db94011d3 259
sahilmgandhi 18:6a4db94011d3 260 NVIC_SetVector(UART0_IRQn, (uint32_t) UART0_IRQHandler);
sahilmgandhi 18:6a4db94011d3 261
sahilmgandhi 18:6a4db94011d3 262
sahilmgandhi 18:6a4db94011d3 263 UART_CB.pseltxd =
sahilmgandhi 18:6a4db94011d3 264 (tx == NC) ? NRF_UART_PSEL_DISCONNECTED : (uint32_t)tx;
sahilmgandhi 18:6a4db94011d3 265 UART_CB.pselrxd =
sahilmgandhi 18:6a4db94011d3 266 (rx == NC) ? NRF_UART_PSEL_DISCONNECTED : (uint32_t)rx;
sahilmgandhi 18:6a4db94011d3 267 if (UART_CB.pseltxd != NRF_UART_PSEL_DISCONNECTED) {
sahilmgandhi 18:6a4db94011d3 268 nrf_gpio_pin_set(UART_CB.pseltxd);
sahilmgandhi 18:6a4db94011d3 269 nrf_gpio_cfg_output(UART_CB.pseltxd);
sahilmgandhi 18:6a4db94011d3 270 }
sahilmgandhi 18:6a4db94011d3 271 if (UART_CB.pselrxd != NRF_UART_PSEL_DISCONNECTED) {
sahilmgandhi 18:6a4db94011d3 272 nrf_gpio_cfg_input(UART_CB.pselrxd, NRF_GPIO_PIN_NOPULL);
sahilmgandhi 18:6a4db94011d3 273 }
sahilmgandhi 18:6a4db94011d3 274
sahilmgandhi 18:6a4db94011d3 275 if (UART_CB.initialized) {
sahilmgandhi 18:6a4db94011d3 276 // For already initialized peripheral it is sufficient to reconfigure
sahilmgandhi 18:6a4db94011d3 277 // RX/TX pins only.
sahilmgandhi 18:6a4db94011d3 278
sahilmgandhi 18:6a4db94011d3 279 // Ensure that there is no unfinished TX transfer.
sahilmgandhi 18:6a4db94011d3 280 while (!serial_writable(obj)) {
sahilmgandhi 18:6a4db94011d3 281 }
sahilmgandhi 18:6a4db94011d3 282 // UART pins can be configured only when the peripheral is disabled.
sahilmgandhi 18:6a4db94011d3 283 nrf_uart_disable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 284 nrf_uart_txrx_pins_set(UART_INSTANCE, UART_CB.pseltxd, UART_CB.pselrxd);
sahilmgandhi 18:6a4db94011d3 285 nrf_uart_enable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 286 }
sahilmgandhi 18:6a4db94011d3 287 else {
sahilmgandhi 18:6a4db94011d3 288 UART_CB.baudrate = UART_DEFAULT_BAUDRATE;
sahilmgandhi 18:6a4db94011d3 289 UART_CB.parity = UART_DEFAULT_PARITY;
sahilmgandhi 18:6a4db94011d3 290 UART_CB.hwfc = UART_DEFAULT_HWFC;
sahilmgandhi 18:6a4db94011d3 291 UART_CB.pselcts = UART_DEFAULT_CTS;
sahilmgandhi 18:6a4db94011d3 292 UART_CB.pselrts = UART_DEFAULT_RTS;
sahilmgandhi 18:6a4db94011d3 293
sahilmgandhi 18:6a4db94011d3 294 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_RXDRDY);
sahilmgandhi 18:6a4db94011d3 295 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_TXDRDY);
sahilmgandhi 18:6a4db94011d3 296 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_STARTRX);
sahilmgandhi 18:6a4db94011d3 297 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_STARTTX);
sahilmgandhi 18:6a4db94011d3 298
sahilmgandhi 18:6a4db94011d3 299 nrf_uart_int_disable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY |
sahilmgandhi 18:6a4db94011d3 300 NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 301 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 302 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_ERROR);
sahilmgandhi 18:6a4db94011d3 303 #endif
sahilmgandhi 18:6a4db94011d3 304 nrf_drv_common_irq_enable(UART_IRQn, NRFx_MBED_UART_IRQ_PRIORITY);
sahilmgandhi 18:6a4db94011d3 305
sahilmgandhi 18:6a4db94011d3 306 // TX interrupt needs to be signaled when transmitter buffer is empty,
sahilmgandhi 18:6a4db94011d3 307 // so a dummy transmission is needed to get the TXDRDY event initially
sahilmgandhi 18:6a4db94011d3 308 // set.
sahilmgandhi 18:6a4db94011d3 309 nrf_uart_configure(UART_INSTANCE,
sahilmgandhi 18:6a4db94011d3 310 NRF_UART_PARITY_EXCLUDED, NRF_UART_HWFC_DISABLED);
sahilmgandhi 18:6a4db94011d3 311 // Use maximum baud rate, so this dummy transmission takes as little
sahilmgandhi 18:6a4db94011d3 312 // time as possible.
sahilmgandhi 18:6a4db94011d3 313 nrf_uart_baudrate_set(UART_INSTANCE, NRF_UART_BAUDRATE_1000000);
sahilmgandhi 18:6a4db94011d3 314 // Perform it with disconnected TX pin, so nothing actually comes out
sahilmgandhi 18:6a4db94011d3 315 // of the device.
sahilmgandhi 18:6a4db94011d3 316 nrf_uart_txrx_pins_disconnect(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 317 nrf_uart_hwfc_pins_disconnect(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 318 nrf_uart_enable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 319 nrf_uart_txd_set(UART_INSTANCE, 0);
sahilmgandhi 18:6a4db94011d3 320 while (!nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_TXDRDY)) {
sahilmgandhi 18:6a4db94011d3 321 }
sahilmgandhi 18:6a4db94011d3 322 nrf_uart_disable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 323
sahilmgandhi 18:6a4db94011d3 324 // Now everything is prepared to set the default configuration and
sahilmgandhi 18:6a4db94011d3 325 // connect the peripheral to actual pins.
sahilmgandhi 18:6a4db94011d3 326 nrf_uart_txrx_pins_set(UART_INSTANCE, UART_CB.pseltxd, UART_CB.pselrxd);
sahilmgandhi 18:6a4db94011d3 327 nrf_uart_baudrate_set(UART_INSTANCE, UART_CB.baudrate);
sahilmgandhi 18:6a4db94011d3 328 nrf_uart_configure(UART_INSTANCE, UART_CB.parity, UART_CB.hwfc);
sahilmgandhi 18:6a4db94011d3 329 if (UART_CB.hwfc == NRF_UART_HWFC_ENABLED) {
sahilmgandhi 18:6a4db94011d3 330 internal_set_hwfc(FlowControlRTSCTS,
sahilmgandhi 18:6a4db94011d3 331 (PinName) UART_CB.pselrts, (PinName) UART_CB.pselcts);
sahilmgandhi 18:6a4db94011d3 332 }
sahilmgandhi 18:6a4db94011d3 333
sahilmgandhi 18:6a4db94011d3 334 nrf_uart_enable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 335
sahilmgandhi 18:6a4db94011d3 336 UART_CB.initialized = true;
sahilmgandhi 18:6a4db94011d3 337 }
sahilmgandhi 18:6a4db94011d3 338
sahilmgandhi 18:6a4db94011d3 339 if (tx == STDIO_UART_TX && rx == STDIO_UART_RX) {
sahilmgandhi 18:6a4db94011d3 340 stdio_uart_inited = 1;
sahilmgandhi 18:6a4db94011d3 341 memcpy(&stdio_uart, obj, sizeof(serial_t));
sahilmgandhi 18:6a4db94011d3 342 }
sahilmgandhi 18:6a4db94011d3 343 else {
sahilmgandhi 18:6a4db94011d3 344 stdio_uart_inited = 0;
sahilmgandhi 18:6a4db94011d3 345 }
sahilmgandhi 18:6a4db94011d3 346 }
sahilmgandhi 18:6a4db94011d3 347
sahilmgandhi 18:6a4db94011d3 348 void serial_free(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 349 {
sahilmgandhi 18:6a4db94011d3 350 (void)obj;
sahilmgandhi 18:6a4db94011d3 351
sahilmgandhi 18:6a4db94011d3 352 if (UART_CB.initialized) {
sahilmgandhi 18:6a4db94011d3 353 nrf_uart_disable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 354 nrf_uart_int_disable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY |
sahilmgandhi 18:6a4db94011d3 355 NRF_UART_INT_MASK_TXDRDY |
sahilmgandhi 18:6a4db94011d3 356 NRF_UART_INT_MASK_ERROR);
sahilmgandhi 18:6a4db94011d3 357 nrf_drv_common_irq_disable(UART_IRQn);
sahilmgandhi 18:6a4db94011d3 358 UART_CB.initialized = false;
sahilmgandhi 18:6a4db94011d3 359
sahilmgandhi 18:6a4db94011d3 360 // There is only one UART instance, thus at this point the stdio UART
sahilmgandhi 18:6a4db94011d3 361 // can no longer be initialized.
sahilmgandhi 18:6a4db94011d3 362 stdio_uart_inited = 0;
sahilmgandhi 18:6a4db94011d3 363 }
sahilmgandhi 18:6a4db94011d3 364 }
sahilmgandhi 18:6a4db94011d3 365
sahilmgandhi 18:6a4db94011d3 366 void serial_baud(serial_t *obj, int baudrate)
sahilmgandhi 18:6a4db94011d3 367 {
sahilmgandhi 18:6a4db94011d3 368 // nrf_uart_baudrate_set() is not used here (registers are accessed
sahilmgandhi 18:6a4db94011d3 369 // directly) to make it possible to set special baud rates like 56000
sahilmgandhi 18:6a4db94011d3 370 // or 31250.
sahilmgandhi 18:6a4db94011d3 371
sahilmgandhi 18:6a4db94011d3 372 static uint32_t const acceptedSpeeds[][2] = {
sahilmgandhi 18:6a4db94011d3 373 { 1200, UART_BAUDRATE_BAUDRATE_Baud1200 },
sahilmgandhi 18:6a4db94011d3 374 { 2400, UART_BAUDRATE_BAUDRATE_Baud2400 },
sahilmgandhi 18:6a4db94011d3 375 { 4800, UART_BAUDRATE_BAUDRATE_Baud4800 },
sahilmgandhi 18:6a4db94011d3 376 { 9600, UART_BAUDRATE_BAUDRATE_Baud9600 },
sahilmgandhi 18:6a4db94011d3 377 { 14400, UART_BAUDRATE_BAUDRATE_Baud14400 },
sahilmgandhi 18:6a4db94011d3 378 { 19200, UART_BAUDRATE_BAUDRATE_Baud19200 },
sahilmgandhi 18:6a4db94011d3 379 { 28800, UART_BAUDRATE_BAUDRATE_Baud28800 },
sahilmgandhi 18:6a4db94011d3 380 { 31250, (0x00800000UL) /* 31250 baud */ },
sahilmgandhi 18:6a4db94011d3 381 { 38400, UART_BAUDRATE_BAUDRATE_Baud38400 },
sahilmgandhi 18:6a4db94011d3 382 { 56000, (0x00E51000UL) /* 56000 baud */ },
sahilmgandhi 18:6a4db94011d3 383 { 57600, UART_BAUDRATE_BAUDRATE_Baud57600 },
sahilmgandhi 18:6a4db94011d3 384 { 76800, UART_BAUDRATE_BAUDRATE_Baud76800 },
sahilmgandhi 18:6a4db94011d3 385 { 115200, UART_BAUDRATE_BAUDRATE_Baud115200 },
sahilmgandhi 18:6a4db94011d3 386 { 230400, UART_BAUDRATE_BAUDRATE_Baud230400 },
sahilmgandhi 18:6a4db94011d3 387 { 250000, UART_BAUDRATE_BAUDRATE_Baud250000 },
sahilmgandhi 18:6a4db94011d3 388 { 460800, UART_BAUDRATE_BAUDRATE_Baud460800 },
sahilmgandhi 18:6a4db94011d3 389 { 921600, UART_BAUDRATE_BAUDRATE_Baud921600 },
sahilmgandhi 18:6a4db94011d3 390 { 1000000, UART_BAUDRATE_BAUDRATE_Baud1M }
sahilmgandhi 18:6a4db94011d3 391 };
sahilmgandhi 18:6a4db94011d3 392
sahilmgandhi 18:6a4db94011d3 393 if (baudrate <= 1200) {
sahilmgandhi 18:6a4db94011d3 394 UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1200;
sahilmgandhi 18:6a4db94011d3 395 return;
sahilmgandhi 18:6a4db94011d3 396 }
sahilmgandhi 18:6a4db94011d3 397
sahilmgandhi 18:6a4db94011d3 398 int const item_cnt = sizeof(acceptedSpeeds)/sizeof(acceptedSpeeds[0]);
sahilmgandhi 18:6a4db94011d3 399 for (int i = 1; i < item_cnt; i++) {
sahilmgandhi 18:6a4db94011d3 400 if ((uint32_t)baudrate < acceptedSpeeds[i][0]) {
sahilmgandhi 18:6a4db94011d3 401 UART_INSTANCE->BAUDRATE = acceptedSpeeds[i - 1][1];
sahilmgandhi 18:6a4db94011d3 402 return;
sahilmgandhi 18:6a4db94011d3 403 }
sahilmgandhi 18:6a4db94011d3 404 }
sahilmgandhi 18:6a4db94011d3 405
sahilmgandhi 18:6a4db94011d3 406 UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M;
sahilmgandhi 18:6a4db94011d3 407 }
sahilmgandhi 18:6a4db94011d3 408
sahilmgandhi 18:6a4db94011d3 409 void serial_format(serial_t *obj,
sahilmgandhi 18:6a4db94011d3 410 int data_bits, SerialParity parity, int stop_bits)
sahilmgandhi 18:6a4db94011d3 411 {
sahilmgandhi 18:6a4db94011d3 412 (void)obj;
sahilmgandhi 18:6a4db94011d3 413
sahilmgandhi 18:6a4db94011d3 414 if (data_bits != 8) {
sahilmgandhi 18:6a4db94011d3 415 error("UART supports only 8 data bits.\r\n");
sahilmgandhi 18:6a4db94011d3 416 }
sahilmgandhi 18:6a4db94011d3 417 if (stop_bits != 1) {
sahilmgandhi 18:6a4db94011d3 418 error("UART supports only 1 stop bits.\r\n");
sahilmgandhi 18:6a4db94011d3 419 }
sahilmgandhi 18:6a4db94011d3 420 if (parity == ParityNone) {
sahilmgandhi 18:6a4db94011d3 421 UART_CB.parity = NRF_UART_PARITY_EXCLUDED;
sahilmgandhi 18:6a4db94011d3 422 } else if (parity == ParityEven) {
sahilmgandhi 18:6a4db94011d3 423 UART_CB.parity = NRF_UART_PARITY_INCLUDED;
sahilmgandhi 18:6a4db94011d3 424 } else {
sahilmgandhi 18:6a4db94011d3 425 error("UART supports only even parity.\r\n");
sahilmgandhi 18:6a4db94011d3 426 }
sahilmgandhi 18:6a4db94011d3 427
sahilmgandhi 18:6a4db94011d3 428 // Reconfigure UART peripheral.
sahilmgandhi 18:6a4db94011d3 429 nrf_uart_configure(UART_INSTANCE, UART_CB.parity, UART_CB.hwfc);
sahilmgandhi 18:6a4db94011d3 430 }
sahilmgandhi 18:6a4db94011d3 431
sahilmgandhi 18:6a4db94011d3 432 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
sahilmgandhi 18:6a4db94011d3 433 {
sahilmgandhi 18:6a4db94011d3 434 (void)obj;
sahilmgandhi 18:6a4db94011d3 435 UART_CB.irq_handler = handler;
sahilmgandhi 18:6a4db94011d3 436 UART_CB.irq_context = id;
sahilmgandhi 18:6a4db94011d3 437 }
sahilmgandhi 18:6a4db94011d3 438
sahilmgandhi 18:6a4db94011d3 439 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
sahilmgandhi 18:6a4db94011d3 440 {
sahilmgandhi 18:6a4db94011d3 441 (void)obj;
sahilmgandhi 18:6a4db94011d3 442 if (enable) {
sahilmgandhi 18:6a4db94011d3 443 switch (irq) {
sahilmgandhi 18:6a4db94011d3 444 case RxIrq:
sahilmgandhi 18:6a4db94011d3 445 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 446 UART_CB.irq_enabled |= UART_IRQ_RX;
sahilmgandhi 18:6a4db94011d3 447 #endif
sahilmgandhi 18:6a4db94011d3 448 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY);
sahilmgandhi 18:6a4db94011d3 449 break;
sahilmgandhi 18:6a4db94011d3 450
sahilmgandhi 18:6a4db94011d3 451 case TxIrq:
sahilmgandhi 18:6a4db94011d3 452 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 453 UART_CB.irq_enabled |= UART_IRQ_TX;
sahilmgandhi 18:6a4db94011d3 454 #endif
sahilmgandhi 18:6a4db94011d3 455 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 456 break;
sahilmgandhi 18:6a4db94011d3 457 }
sahilmgandhi 18:6a4db94011d3 458 } else {
sahilmgandhi 18:6a4db94011d3 459 switch (irq) {
sahilmgandhi 18:6a4db94011d3 460 case RxIrq:
sahilmgandhi 18:6a4db94011d3 461 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 462 UART_CB.irq_enabled &= ~UART_IRQ_RX;
sahilmgandhi 18:6a4db94011d3 463 if (!UART_CB.rx_active)
sahilmgandhi 18:6a4db94011d3 464 #endif
sahilmgandhi 18:6a4db94011d3 465 {
sahilmgandhi 18:6a4db94011d3 466 nrf_uart_int_disable(UART_INSTANCE,
sahilmgandhi 18:6a4db94011d3 467 NRF_UART_INT_MASK_RXDRDY);
sahilmgandhi 18:6a4db94011d3 468 }
sahilmgandhi 18:6a4db94011d3 469 break;
sahilmgandhi 18:6a4db94011d3 470
sahilmgandhi 18:6a4db94011d3 471 case TxIrq:
sahilmgandhi 18:6a4db94011d3 472 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 473 UART_CB.irq_enabled &= ~UART_IRQ_TX;
sahilmgandhi 18:6a4db94011d3 474 if (!UART_CB.tx_active)
sahilmgandhi 18:6a4db94011d3 475 #endif
sahilmgandhi 18:6a4db94011d3 476 {
sahilmgandhi 18:6a4db94011d3 477 nrf_uart_int_disable(UART_INSTANCE,
sahilmgandhi 18:6a4db94011d3 478 NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 479 }
sahilmgandhi 18:6a4db94011d3 480 break;
sahilmgandhi 18:6a4db94011d3 481 }
sahilmgandhi 18:6a4db94011d3 482 }
sahilmgandhi 18:6a4db94011d3 483 }
sahilmgandhi 18:6a4db94011d3 484
sahilmgandhi 18:6a4db94011d3 485 int serial_getc(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 486 {
sahilmgandhi 18:6a4db94011d3 487 while (!serial_readable(obj)) {
sahilmgandhi 18:6a4db94011d3 488 }
sahilmgandhi 18:6a4db94011d3 489
sahilmgandhi 18:6a4db94011d3 490 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_RXDRDY);
sahilmgandhi 18:6a4db94011d3 491 return nrf_uart_rxd_get(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 492 }
sahilmgandhi 18:6a4db94011d3 493
sahilmgandhi 18:6a4db94011d3 494 void serial_putc(serial_t *obj, int c)
sahilmgandhi 18:6a4db94011d3 495 {
sahilmgandhi 18:6a4db94011d3 496 while (!serial_writable(obj)) {
sahilmgandhi 18:6a4db94011d3 497 }
sahilmgandhi 18:6a4db94011d3 498
sahilmgandhi 18:6a4db94011d3 499 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_TXDRDY);
sahilmgandhi 18:6a4db94011d3 500 nrf_uart_txd_set(UART_INSTANCE, (uint8_t)c);
sahilmgandhi 18:6a4db94011d3 501 }
sahilmgandhi 18:6a4db94011d3 502
sahilmgandhi 18:6a4db94011d3 503 int serial_readable(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 504 {
sahilmgandhi 18:6a4db94011d3 505 (void)obj;
sahilmgandhi 18:6a4db94011d3 506 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 507 if (UART_CB.rx_active) {
sahilmgandhi 18:6a4db94011d3 508 return 0;
sahilmgandhi 18:6a4db94011d3 509 }
sahilmgandhi 18:6a4db94011d3 510 #endif
sahilmgandhi 18:6a4db94011d3 511 return (nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_RXDRDY));
sahilmgandhi 18:6a4db94011d3 512 }
sahilmgandhi 18:6a4db94011d3 513
sahilmgandhi 18:6a4db94011d3 514 int serial_writable(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 515 {
sahilmgandhi 18:6a4db94011d3 516 (void)obj;
sahilmgandhi 18:6a4db94011d3 517 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 518 if (UART_CB.tx_active) {
sahilmgandhi 18:6a4db94011d3 519 return 0;
sahilmgandhi 18:6a4db94011d3 520 }
sahilmgandhi 18:6a4db94011d3 521 #endif
sahilmgandhi 18:6a4db94011d3 522 return (nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_TXDRDY));
sahilmgandhi 18:6a4db94011d3 523 }
sahilmgandhi 18:6a4db94011d3 524
sahilmgandhi 18:6a4db94011d3 525 void serial_break_set(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 526 {
sahilmgandhi 18:6a4db94011d3 527 (void)obj;
sahilmgandhi 18:6a4db94011d3 528 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_SUSPEND);
sahilmgandhi 18:6a4db94011d3 529 nrf_uart_txrx_pins_disconnect(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 530 nrf_gpio_pin_clear(UART_CB.pseltxd);
sahilmgandhi 18:6a4db94011d3 531 }
sahilmgandhi 18:6a4db94011d3 532
sahilmgandhi 18:6a4db94011d3 533 void serial_break_clear(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 534 {
sahilmgandhi 18:6a4db94011d3 535 (void)obj;
sahilmgandhi 18:6a4db94011d3 536 nrf_gpio_pin_set(UART_CB.pseltxd);
sahilmgandhi 18:6a4db94011d3 537 nrf_uart_txrx_pins_set(UART_INSTANCE, UART_CB.pseltxd, UART_CB.pselrxd);
sahilmgandhi 18:6a4db94011d3 538 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_STARTRX);
sahilmgandhi 18:6a4db94011d3 539 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_STARTTX);
sahilmgandhi 18:6a4db94011d3 540 }
sahilmgandhi 18:6a4db94011d3 541
sahilmgandhi 18:6a4db94011d3 542
sahilmgandhi 18:6a4db94011d3 543 static void internal_set_hwfc(FlowControl type,
sahilmgandhi 18:6a4db94011d3 544 PinName rxflow, PinName txflow)
sahilmgandhi 18:6a4db94011d3 545 {
sahilmgandhi 18:6a4db94011d3 546 UART_CB.pselrts =
sahilmgandhi 18:6a4db94011d3 547 ((rxflow == NC) || (type == FlowControlCTS)) ? NRF_UART_PSEL_DISCONNECTED : (uint32_t)rxflow;
sahilmgandhi 18:6a4db94011d3 548 UART_CB.pselcts =
sahilmgandhi 18:6a4db94011d3 549 ((txflow == NC) || (type == FlowControlRTS)) ? NRF_UART_PSEL_DISCONNECTED : (uint32_t)txflow;
sahilmgandhi 18:6a4db94011d3 550
sahilmgandhi 18:6a4db94011d3 551 if (UART_CB.pselrts != NRF_UART_PSEL_DISCONNECTED) {
sahilmgandhi 18:6a4db94011d3 552 nrf_gpio_pin_set(UART_CB.pselrts);
sahilmgandhi 18:6a4db94011d3 553 nrf_gpio_cfg_output(UART_CB.pselrts);
sahilmgandhi 18:6a4db94011d3 554 }
sahilmgandhi 18:6a4db94011d3 555 if (UART_CB.pselcts != NRF_UART_PSEL_DISCONNECTED) {
sahilmgandhi 18:6a4db94011d3 556 nrf_gpio_cfg_input(UART_CB.pselcts, NRF_GPIO_PIN_NOPULL);
sahilmgandhi 18:6a4db94011d3 557 }
sahilmgandhi 18:6a4db94011d3 558
sahilmgandhi 18:6a4db94011d3 559 UART_CB.hwfc = (type == FlowControlNone)? NRF_UART_HWFC_DISABLED : UART0_CONFIG_HWFC;
sahilmgandhi 18:6a4db94011d3 560
sahilmgandhi 18:6a4db94011d3 561 nrf_uart_configure(UART_INSTANCE, UART_CB.parity, UART_CB.hwfc);
sahilmgandhi 18:6a4db94011d3 562 nrf_uart_hwfc_pins_set(UART_INSTANCE, UART_CB.pselrts, UART_CB.pselcts);
sahilmgandhi 18:6a4db94011d3 563 }
sahilmgandhi 18:6a4db94011d3 564
sahilmgandhi 18:6a4db94011d3 565 void serial_set_flow_control(serial_t *obj, FlowControl type,
sahilmgandhi 18:6a4db94011d3 566 PinName rxflow, PinName txflow)
sahilmgandhi 18:6a4db94011d3 567 {
sahilmgandhi 18:6a4db94011d3 568 (void)obj;
sahilmgandhi 18:6a4db94011d3 569
sahilmgandhi 18:6a4db94011d3 570 nrf_uart_disable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 571 internal_set_hwfc(type, rxflow, txflow);
sahilmgandhi 18:6a4db94011d3 572 nrf_uart_enable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 573 }
sahilmgandhi 18:6a4db94011d3 574
sahilmgandhi 18:6a4db94011d3 575
sahilmgandhi 18:6a4db94011d3 576 void serial_clear(serial_t *obj) {
sahilmgandhi 18:6a4db94011d3 577 (void)obj;
sahilmgandhi 18:6a4db94011d3 578 }
sahilmgandhi 18:6a4db94011d3 579
sahilmgandhi 18:6a4db94011d3 580 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 581
sahilmgandhi 18:6a4db94011d3 582 int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length,
sahilmgandhi 18:6a4db94011d3 583 uint8_t tx_width, uint32_t handler, uint32_t event,
sahilmgandhi 18:6a4db94011d3 584 DMAUsage hint)
sahilmgandhi 18:6a4db94011d3 585 {
sahilmgandhi 18:6a4db94011d3 586 (void)obj;
sahilmgandhi 18:6a4db94011d3 587 (void)tx_width;
sahilmgandhi 18:6a4db94011d3 588 (void)hint;
sahilmgandhi 18:6a4db94011d3 589 if (UART_CB.tx_active || !tx_length) {
sahilmgandhi 18:6a4db94011d3 590 return 0;
sahilmgandhi 18:6a4db94011d3 591 }
sahilmgandhi 18:6a4db94011d3 592
sahilmgandhi 18:6a4db94011d3 593 UART_CB.tx_buffer = tx;
sahilmgandhi 18:6a4db94011d3 594 UART_CB.tx_length = tx_length;
sahilmgandhi 18:6a4db94011d3 595 UART_CB.tx_pos = 0;
sahilmgandhi 18:6a4db94011d3 596 UART_CB.tx_asynch_handler = (void(*)())handler;
sahilmgandhi 18:6a4db94011d3 597 UART_CB.events_wanted &= ~SERIAL_EVENT_TX_ALL;
sahilmgandhi 18:6a4db94011d3 598 UART_CB.events_wanted |= event;
sahilmgandhi 18:6a4db94011d3 599
sahilmgandhi 18:6a4db94011d3 600 UART_CB.tx_active = true;
sahilmgandhi 18:6a4db94011d3 601 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 602
sahilmgandhi 18:6a4db94011d3 603 return 0;
sahilmgandhi 18:6a4db94011d3 604 }
sahilmgandhi 18:6a4db94011d3 605
sahilmgandhi 18:6a4db94011d3 606 void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length,
sahilmgandhi 18:6a4db94011d3 607 uint8_t rx_width, uint32_t handler, uint32_t event,
sahilmgandhi 18:6a4db94011d3 608 uint8_t char_match, DMAUsage hint)
sahilmgandhi 18:6a4db94011d3 609 {
sahilmgandhi 18:6a4db94011d3 610 (void)obj;
sahilmgandhi 18:6a4db94011d3 611 (void)rx_width;
sahilmgandhi 18:6a4db94011d3 612 (void)hint;
sahilmgandhi 18:6a4db94011d3 613 if (UART_CB.rx_active || !rx_length) {
sahilmgandhi 18:6a4db94011d3 614 return;
sahilmgandhi 18:6a4db94011d3 615 }
sahilmgandhi 18:6a4db94011d3 616
sahilmgandhi 18:6a4db94011d3 617 UART_CB.rx_buffer = rx;
sahilmgandhi 18:6a4db94011d3 618 UART_CB.rx_length = rx_length;
sahilmgandhi 18:6a4db94011d3 619 UART_CB.rx_pos = 0;
sahilmgandhi 18:6a4db94011d3 620 UART_CB.rx_asynch_handler = (void(*)())handler;
sahilmgandhi 18:6a4db94011d3 621 UART_CB.events_wanted &= ~SERIAL_EVENT_RX_ALL;
sahilmgandhi 18:6a4db94011d3 622 UART_CB.events_wanted |= event;
sahilmgandhi 18:6a4db94011d3 623 UART_CB.char_match = char_match;
sahilmgandhi 18:6a4db94011d3 624
sahilmgandhi 18:6a4db94011d3 625 UART_CB.rx_active = true;
sahilmgandhi 18:6a4db94011d3 626 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY);
sahilmgandhi 18:6a4db94011d3 627 }
sahilmgandhi 18:6a4db94011d3 628
sahilmgandhi 18:6a4db94011d3 629 uint8_t serial_tx_active(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 630 {
sahilmgandhi 18:6a4db94011d3 631 (void)obj;
sahilmgandhi 18:6a4db94011d3 632 return UART_CB.tx_active;
sahilmgandhi 18:6a4db94011d3 633 }
sahilmgandhi 18:6a4db94011d3 634
sahilmgandhi 18:6a4db94011d3 635 uint8_t serial_rx_active(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 636 {
sahilmgandhi 18:6a4db94011d3 637 (void)obj;
sahilmgandhi 18:6a4db94011d3 638 return UART_CB.rx_active;
sahilmgandhi 18:6a4db94011d3 639 }
sahilmgandhi 18:6a4db94011d3 640
sahilmgandhi 18:6a4db94011d3 641 int serial_irq_handler_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 642 {
sahilmgandhi 18:6a4db94011d3 643 (void)obj;
sahilmgandhi 18:6a4db94011d3 644 uint32_t events_to_report = UART_CB.events_wanted & UART_CB.events_occured;
sahilmgandhi 18:6a4db94011d3 645 UART_CB.events_occured &= (~events_to_report);
sahilmgandhi 18:6a4db94011d3 646 return events_to_report;
sahilmgandhi 18:6a4db94011d3 647 }
sahilmgandhi 18:6a4db94011d3 648
sahilmgandhi 18:6a4db94011d3 649 void serial_tx_abort_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 650 {
sahilmgandhi 18:6a4db94011d3 651 (void)obj;
sahilmgandhi 18:6a4db94011d3 652 end_asynch_tx();
sahilmgandhi 18:6a4db94011d3 653 UART_CB.tx_asynch_handler = NULL;
sahilmgandhi 18:6a4db94011d3 654 }
sahilmgandhi 18:6a4db94011d3 655
sahilmgandhi 18:6a4db94011d3 656 void serial_rx_abort_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 657 {
sahilmgandhi 18:6a4db94011d3 658 (void)obj;
sahilmgandhi 18:6a4db94011d3 659 end_asynch_rx();
sahilmgandhi 18:6a4db94011d3 660 UART_CB.rx_asynch_handler = NULL;
sahilmgandhi 18:6a4db94011d3 661 }
sahilmgandhi 18:6a4db94011d3 662
sahilmgandhi 18:6a4db94011d3 663 #endif // DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 664
sahilmgandhi 18:6a4db94011d3 665 #endif // DEVICE_SERIAL