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 "app_util_platform.h"
sahilmgandhi 18:6a4db94011d3 49 #include "nrf_gpio.h"
sahilmgandhi 18:6a4db94011d3 50
sahilmgandhi 18:6a4db94011d3 51 #define UART_INSTANCE_COUNT 1
sahilmgandhi 18:6a4db94011d3 52 #define UART_INSTANCE NRF_UART0
sahilmgandhi 18:6a4db94011d3 53 #define UART_IRQn UART0_IRQn
sahilmgandhi 18:6a4db94011d3 54 #define UART_IRQ_HANDLER UART0_IRQHandler
sahilmgandhi 18:6a4db94011d3 55 #define UART_INSTANCE_ID 0
sahilmgandhi 18:6a4db94011d3 56 #define UART_CB uart_cb[UART_INSTANCE_ID]
sahilmgandhi 18:6a4db94011d3 57
sahilmgandhi 18:6a4db94011d3 58 #define UART_DEFAULT_BAUDRATE UART_DEFAULT_CONFIG_BAUDRATE
sahilmgandhi 18:6a4db94011d3 59 #define UART_DEFAULT_PARITY UART_DEFAULT_CONFIG_PARITY
sahilmgandhi 18:6a4db94011d3 60
sahilmgandhi 18:6a4db94011d3 61 // expected the macro from mbed configuration system
sahilmgandhi 18:6a4db94011d3 62 #ifndef MBED_CONF_NORDIC_UART_HWFC
sahilmgandhi 18:6a4db94011d3 63 #define MBED_CONF_NORDIC_UART_HWFC 1
sahilmgandhi 18:6a4db94011d3 64 #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 65 #endif
sahilmgandhi 18:6a4db94011d3 66
sahilmgandhi 18:6a4db94011d3 67 #if MBED_CONF_NORDIC_UART_HWFC == 1
sahilmgandhi 18:6a4db94011d3 68 #define UART_DEFAULT_HWFC UART_DEFAULT_CONFIG_HWFC
sahilmgandhi 18:6a4db94011d3 69 #else
sahilmgandhi 18:6a4db94011d3 70 #define UART_DEFAULT_HWFC NRF_UART_HWFC_DISABLED
sahilmgandhi 18:6a4db94011d3 71 #endif
sahilmgandhi 18:6a4db94011d3 72
sahilmgandhi 18:6a4db94011d3 73 #define UART_DEFAULT_CTS CTS_PIN_NUMBER
sahilmgandhi 18:6a4db94011d3 74 #define UART_DEFAULT_RTS RTS_PIN_NUMBER
sahilmgandhi 18:6a4db94011d3 75
sahilmgandhi 18:6a4db94011d3 76 #ifdef NRF51
sahilmgandhi 18:6a4db94011d3 77 #define NRFx_MBED_UART_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW
sahilmgandhi 18:6a4db94011d3 78 #elif defined(NRF52) || defined(NRF52840_XXAA)
sahilmgandhi 18:6a4db94011d3 79 #define NRFx_MBED_UART_IRQ_PRIORITY APP_IRQ_PRIORITY_LOWEST
sahilmgandhi 18:6a4db94011d3 80 #endif
sahilmgandhi 18:6a4db94011d3 81
sahilmgandhi 18:6a4db94011d3 82 // Required by "retarget.cpp".
sahilmgandhi 18:6a4db94011d3 83 int stdio_uart_inited = 0;
sahilmgandhi 18:6a4db94011d3 84 serial_t stdio_uart;
sahilmgandhi 18:6a4db94011d3 85
sahilmgandhi 18:6a4db94011d3 86 typedef struct
sahilmgandhi 18:6a4db94011d3 87 {
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 {
sahilmgandhi 18:6a4db94011d3 136 nrf_uart_int_disable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY);
sahilmgandhi 18:6a4db94011d3 137 }
sahilmgandhi 18:6a4db94011d3 138 UART_CB.rx_active = false;
sahilmgandhi 18:6a4db94011d3 139 }
sahilmgandhi 18:6a4db94011d3 140 static void end_asynch_tx(void)
sahilmgandhi 18:6a4db94011d3 141 {
sahilmgandhi 18:6a4db94011d3 142 // If TX interrupt is activated for synchronous operations,
sahilmgandhi 18:6a4db94011d3 143 // don't disable it, just stop handling it here.
sahilmgandhi 18:6a4db94011d3 144 if (!(UART_CB.irq_enabled & UART_IRQ_TX))
sahilmgandhi 18:6a4db94011d3 145 {
sahilmgandhi 18:6a4db94011d3 146 nrf_uart_int_disable(UART_INSTANCE, NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 147 }
sahilmgandhi 18:6a4db94011d3 148 UART_CB.tx_active = false;
sahilmgandhi 18:6a4db94011d3 149 }
sahilmgandhi 18:6a4db94011d3 150 #endif // DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 151
sahilmgandhi 18:6a4db94011d3 152 void UART_IRQ_HANDLER(void)
sahilmgandhi 18:6a4db94011d3 153 {
sahilmgandhi 18:6a4db94011d3 154 if (nrf_uart_int_enable_check(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY) &&
sahilmgandhi 18:6a4db94011d3 155 nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_RXDRDY))
sahilmgandhi 18:6a4db94011d3 156 {
sahilmgandhi 18:6a4db94011d3 157
sahilmgandhi 18:6a4db94011d3 158 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 159 if (UART_CB.rx_active)
sahilmgandhi 18:6a4db94011d3 160 {
sahilmgandhi 18:6a4db94011d3 161 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_RXDRDY);
sahilmgandhi 18:6a4db94011d3 162
sahilmgandhi 18:6a4db94011d3 163 uint8_t rx_data = nrf_uart_rxd_get(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 164 UART_CB.rx_buffer[UART_CB.rx_pos] = rx_data;
sahilmgandhi 18:6a4db94011d3 165
sahilmgandhi 18:6a4db94011d3 166 bool end_rx = false;
sahilmgandhi 18:6a4db94011d3 167 // If character matching should be performed, check if the current
sahilmgandhi 18:6a4db94011d3 168 // data matches the given one.
sahilmgandhi 18:6a4db94011d3 169 if (UART_CB.char_match != SERIAL_RESERVED_CHAR_MATCH &&
sahilmgandhi 18:6a4db94011d3 170 rx_data == UART_CB.char_match)
sahilmgandhi 18:6a4db94011d3 171 {
sahilmgandhi 18:6a4db94011d3 172 // If it does, report the match and abort further receiving.
sahilmgandhi 18:6a4db94011d3 173 UART_CB.events_occured |= SERIAL_EVENT_RX_CHARACTER_MATCH;
sahilmgandhi 18:6a4db94011d3 174 if (UART_CB.events_wanted & SERIAL_EVENT_RX_CHARACTER_MATCH)
sahilmgandhi 18:6a4db94011d3 175 {
sahilmgandhi 18:6a4db94011d3 176 end_rx = true;
sahilmgandhi 18:6a4db94011d3 177 }
sahilmgandhi 18:6a4db94011d3 178 }
sahilmgandhi 18:6a4db94011d3 179 if (++UART_CB.rx_pos >= UART_CB.rx_length)
sahilmgandhi 18:6a4db94011d3 180 {
sahilmgandhi 18:6a4db94011d3 181 UART_CB.events_occured |= SERIAL_EVENT_RX_COMPLETE;
sahilmgandhi 18:6a4db94011d3 182 end_rx = true;
sahilmgandhi 18:6a4db94011d3 183 }
sahilmgandhi 18:6a4db94011d3 184 if (end_rx)
sahilmgandhi 18:6a4db94011d3 185 {
sahilmgandhi 18:6a4db94011d3 186 end_asynch_rx();
sahilmgandhi 18:6a4db94011d3 187
sahilmgandhi 18:6a4db94011d3 188 if (UART_CB.rx_asynch_handler)
sahilmgandhi 18:6a4db94011d3 189 {
sahilmgandhi 18:6a4db94011d3 190 // Use local variable to make it possible to start a next
sahilmgandhi 18:6a4db94011d3 191 // transfer from callback routine.
sahilmgandhi 18:6a4db94011d3 192 void (*handler)() = UART_CB.rx_asynch_handler;
sahilmgandhi 18:6a4db94011d3 193 UART_CB.rx_asynch_handler = NULL;
sahilmgandhi 18:6a4db94011d3 194 handler();
sahilmgandhi 18:6a4db94011d3 195 }
sahilmgandhi 18:6a4db94011d3 196 }
sahilmgandhi 18:6a4db94011d3 197 }
sahilmgandhi 18:6a4db94011d3 198 else
sahilmgandhi 18:6a4db94011d3 199 #endif
sahilmgandhi 18:6a4db94011d3 200
sahilmgandhi 18:6a4db94011d3 201 if (UART_CB.irq_handler)
sahilmgandhi 18:6a4db94011d3 202 {
sahilmgandhi 18:6a4db94011d3 203 UART_CB.irq_handler(UART_CB.irq_context, RxIrq);
sahilmgandhi 18:6a4db94011d3 204 }
sahilmgandhi 18:6a4db94011d3 205 }
sahilmgandhi 18:6a4db94011d3 206
sahilmgandhi 18:6a4db94011d3 207 if (nrf_uart_int_enable_check(UART_INSTANCE, NRF_UART_INT_MASK_TXDRDY) &&
sahilmgandhi 18:6a4db94011d3 208 nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_TXDRDY))
sahilmgandhi 18:6a4db94011d3 209 {
sahilmgandhi 18:6a4db94011d3 210
sahilmgandhi 18:6a4db94011d3 211 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 212 if (UART_CB.tx_active)
sahilmgandhi 18:6a4db94011d3 213 {
sahilmgandhi 18:6a4db94011d3 214 if (++UART_CB.tx_pos <= UART_CB.tx_length)
sahilmgandhi 18:6a4db94011d3 215 {
sahilmgandhi 18:6a4db94011d3 216 // When there is still something to send, clear the TXDRDY event
sahilmgandhi 18:6a4db94011d3 217 // and put next byte to transmitter.
sahilmgandhi 18:6a4db94011d3 218 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_TXDRDY);
sahilmgandhi 18:6a4db94011d3 219 nrf_uart_txd_set(UART_INSTANCE,
sahilmgandhi 18:6a4db94011d3 220 UART_CB.tx_buffer[UART_CB.tx_pos]);
sahilmgandhi 18:6a4db94011d3 221 }
sahilmgandhi 18:6a4db94011d3 222 else
sahilmgandhi 18:6a4db94011d3 223 {
sahilmgandhi 18:6a4db94011d3 224 // When the TXDRDY event is set after the last byte to be sent
sahilmgandhi 18:6a4db94011d3 225 // has been passed to the transmitter, the job is done and TX
sahilmgandhi 18:6a4db94011d3 226 // complete can be indicated.
sahilmgandhi 18:6a4db94011d3 227 // Don't clear the TXDRDY event, it needs to remain set for the
sahilmgandhi 18:6a4db94011d3 228 // 'serial_writable' function to work properly.
sahilmgandhi 18:6a4db94011d3 229 end_asynch_tx();
sahilmgandhi 18:6a4db94011d3 230
sahilmgandhi 18:6a4db94011d3 231 UART_CB.events_occured |= SERIAL_EVENT_TX_COMPLETE;
sahilmgandhi 18:6a4db94011d3 232 if (UART_CB.tx_asynch_handler)
sahilmgandhi 18:6a4db94011d3 233 {
sahilmgandhi 18:6a4db94011d3 234 // Use local variable to make it possible to start a next
sahilmgandhi 18:6a4db94011d3 235 // transfer from callback routine.
sahilmgandhi 18:6a4db94011d3 236 void (*handler)() = UART_CB.tx_asynch_handler;
sahilmgandhi 18:6a4db94011d3 237 UART_CB.tx_asynch_handler = NULL;
sahilmgandhi 18:6a4db94011d3 238 handler();
sahilmgandhi 18:6a4db94011d3 239 }
sahilmgandhi 18:6a4db94011d3 240 }
sahilmgandhi 18:6a4db94011d3 241 }
sahilmgandhi 18:6a4db94011d3 242 else
sahilmgandhi 18:6a4db94011d3 243 #endif
sahilmgandhi 18:6a4db94011d3 244
sahilmgandhi 18:6a4db94011d3 245 if (UART_CB.irq_handler)
sahilmgandhi 18:6a4db94011d3 246 {
sahilmgandhi 18:6a4db94011d3 247 UART_CB.irq_handler(UART_CB.irq_context, TxIrq);
sahilmgandhi 18:6a4db94011d3 248 }
sahilmgandhi 18:6a4db94011d3 249 }
sahilmgandhi 18:6a4db94011d3 250
sahilmgandhi 18:6a4db94011d3 251 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 252 if (nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_ERROR))
sahilmgandhi 18:6a4db94011d3 253 {
sahilmgandhi 18:6a4db94011d3 254 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_ERROR);
sahilmgandhi 18:6a4db94011d3 255
sahilmgandhi 18:6a4db94011d3 256 uint8_t errorsrc = nrf_uart_errorsrc_get_and_clear(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 257 if (UART_CB.rx_asynch_handler)
sahilmgandhi 18:6a4db94011d3 258 {
sahilmgandhi 18:6a4db94011d3 259 UART_CB.events_occured |= SERIAL_EVENT_ERROR;
sahilmgandhi 18:6a4db94011d3 260 if (errorsrc & NRF_UART_ERROR_PARITY_MASK)
sahilmgandhi 18:6a4db94011d3 261 {
sahilmgandhi 18:6a4db94011d3 262 UART_CB.events_occured |= SERIAL_EVENT_RX_PARITY_ERROR;
sahilmgandhi 18:6a4db94011d3 263 }
sahilmgandhi 18:6a4db94011d3 264 if (errorsrc & NRF_UART_ERROR_FRAMING_MASK)
sahilmgandhi 18:6a4db94011d3 265 {
sahilmgandhi 18:6a4db94011d3 266 UART_CB.events_occured |= SERIAL_EVENT_RX_FRAMING_ERROR;
sahilmgandhi 18:6a4db94011d3 267 }
sahilmgandhi 18:6a4db94011d3 268 if (errorsrc & NRF_UART_ERROR_OVERRUN_MASK)
sahilmgandhi 18:6a4db94011d3 269 {
sahilmgandhi 18:6a4db94011d3 270 UART_CB.events_occured |= SERIAL_EVENT_RX_OVERRUN_ERROR;
sahilmgandhi 18:6a4db94011d3 271 }
sahilmgandhi 18:6a4db94011d3 272 UART_CB.rx_asynch_handler();
sahilmgandhi 18:6a4db94011d3 273 }
sahilmgandhi 18:6a4db94011d3 274 }
sahilmgandhi 18:6a4db94011d3 275 #endif // DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 276 }
sahilmgandhi 18:6a4db94011d3 277
sahilmgandhi 18:6a4db94011d3 278
sahilmgandhi 18:6a4db94011d3 279 void serial_init(serial_t *obj, PinName tx, PinName rx)
sahilmgandhi 18:6a4db94011d3 280 {
sahilmgandhi 18:6a4db94011d3 281
sahilmgandhi 18:6a4db94011d3 282 NVIC_SetVector(UART0_IRQn, (uint32_t) UART0_IRQHandler);
sahilmgandhi 18:6a4db94011d3 283
sahilmgandhi 18:6a4db94011d3 284
sahilmgandhi 18:6a4db94011d3 285 UART_CB.pseltxd =
sahilmgandhi 18:6a4db94011d3 286 (tx == NC) ? NRF_UART_PSEL_DISCONNECTED : (uint32_t)tx;
sahilmgandhi 18:6a4db94011d3 287 UART_CB.pselrxd =
sahilmgandhi 18:6a4db94011d3 288 (rx == NC) ? NRF_UART_PSEL_DISCONNECTED : (uint32_t)rx;
sahilmgandhi 18:6a4db94011d3 289 if (UART_CB.pseltxd != NRF_UART_PSEL_DISCONNECTED)
sahilmgandhi 18:6a4db94011d3 290 {
sahilmgandhi 18:6a4db94011d3 291 nrf_gpio_pin_set(UART_CB.pseltxd);
sahilmgandhi 18:6a4db94011d3 292 nrf_gpio_cfg_output(UART_CB.pseltxd);
sahilmgandhi 18:6a4db94011d3 293 }
sahilmgandhi 18:6a4db94011d3 294 if (UART_CB.pselrxd != NRF_UART_PSEL_DISCONNECTED)
sahilmgandhi 18:6a4db94011d3 295 {
sahilmgandhi 18:6a4db94011d3 296 nrf_gpio_cfg_input(UART_CB.pselrxd, NRF_GPIO_PIN_NOPULL);
sahilmgandhi 18:6a4db94011d3 297 }
sahilmgandhi 18:6a4db94011d3 298
sahilmgandhi 18:6a4db94011d3 299 if (UART_CB.initialized)
sahilmgandhi 18:6a4db94011d3 300 {
sahilmgandhi 18:6a4db94011d3 301 // For already initialized peripheral it is sufficient to reconfigure
sahilmgandhi 18:6a4db94011d3 302 // RX/TX pins only.
sahilmgandhi 18:6a4db94011d3 303
sahilmgandhi 18:6a4db94011d3 304 // Ensure that there is no unfinished TX transfer.
sahilmgandhi 18:6a4db94011d3 305 while (!serial_writable(obj))
sahilmgandhi 18:6a4db94011d3 306 {
sahilmgandhi 18:6a4db94011d3 307 }
sahilmgandhi 18:6a4db94011d3 308 // UART pins can be configured only when the peripheral is disabled.
sahilmgandhi 18:6a4db94011d3 309 nrf_uart_disable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 310 nrf_uart_txrx_pins_set(UART_INSTANCE, UART_CB.pseltxd, UART_CB.pselrxd);
sahilmgandhi 18:6a4db94011d3 311 nrf_uart_enable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 312 }
sahilmgandhi 18:6a4db94011d3 313 else
sahilmgandhi 18:6a4db94011d3 314 {
sahilmgandhi 18:6a4db94011d3 315 UART_CB.baudrate = (nrf_uart_baudrate_t)UART_DEFAULT_BAUDRATE;
sahilmgandhi 18:6a4db94011d3 316 UART_CB.parity = (nrf_uart_parity_t)UART_DEFAULT_PARITY;
sahilmgandhi 18:6a4db94011d3 317 UART_CB.hwfc = (nrf_uart_hwfc_t)UART_DEFAULT_HWFC;
sahilmgandhi 18:6a4db94011d3 318 UART_CB.pselcts = UART_DEFAULT_CTS;
sahilmgandhi 18:6a4db94011d3 319 UART_CB.pselrts = UART_DEFAULT_RTS;
sahilmgandhi 18:6a4db94011d3 320
sahilmgandhi 18:6a4db94011d3 321 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_RXDRDY);
sahilmgandhi 18:6a4db94011d3 322 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_TXDRDY);
sahilmgandhi 18:6a4db94011d3 323 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_STARTRX);
sahilmgandhi 18:6a4db94011d3 324 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_STARTTX);
sahilmgandhi 18:6a4db94011d3 325
sahilmgandhi 18:6a4db94011d3 326 nrf_uart_int_disable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY |
sahilmgandhi 18:6a4db94011d3 327 NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 328 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 329 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_ERROR);
sahilmgandhi 18:6a4db94011d3 330 #endif
sahilmgandhi 18:6a4db94011d3 331 nrf_drv_common_irq_enable(UART_IRQn, NRFx_MBED_UART_IRQ_PRIORITY);
sahilmgandhi 18:6a4db94011d3 332
sahilmgandhi 18:6a4db94011d3 333 // TX interrupt needs to be signaled when transmitter buffer is empty,
sahilmgandhi 18:6a4db94011d3 334 // so a dummy transmission is needed to get the TXDRDY event initially
sahilmgandhi 18:6a4db94011d3 335 // set.
sahilmgandhi 18:6a4db94011d3 336 nrf_uart_configure(UART_INSTANCE,
sahilmgandhi 18:6a4db94011d3 337 NRF_UART_PARITY_EXCLUDED, NRF_UART_HWFC_DISABLED);
sahilmgandhi 18:6a4db94011d3 338 // Use maximum baud rate, so this dummy transmission takes as little
sahilmgandhi 18:6a4db94011d3 339 // time as possible.
sahilmgandhi 18:6a4db94011d3 340 nrf_uart_baudrate_set(UART_INSTANCE, NRF_UART_BAUDRATE_1000000);
sahilmgandhi 18:6a4db94011d3 341 // Perform it with disconnected TX pin, so nothing actually comes out
sahilmgandhi 18:6a4db94011d3 342 // of the device.
sahilmgandhi 18:6a4db94011d3 343 nrf_uart_txrx_pins_disconnect(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 344 nrf_uart_hwfc_pins_disconnect(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 345 nrf_uart_enable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 346 nrf_uart_txd_set(UART_INSTANCE, 0);
sahilmgandhi 18:6a4db94011d3 347
sahilmgandhi 18:6a4db94011d3 348 while (!nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_TXDRDY))
sahilmgandhi 18:6a4db94011d3 349 {
sahilmgandhi 18:6a4db94011d3 350 }
sahilmgandhi 18:6a4db94011d3 351 nrf_uart_disable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 352
sahilmgandhi 18:6a4db94011d3 353 // Now everything is prepared to set the default configuration and
sahilmgandhi 18:6a4db94011d3 354 // connect the peripheral to actual pins.
sahilmgandhi 18:6a4db94011d3 355 nrf_uart_txrx_pins_set(UART_INSTANCE, UART_CB.pseltxd, UART_CB.pselrxd);
sahilmgandhi 18:6a4db94011d3 356 nrf_uart_baudrate_set(UART_INSTANCE, UART_CB.baudrate);
sahilmgandhi 18:6a4db94011d3 357 nrf_uart_configure(UART_INSTANCE, UART_CB.parity, UART_CB.hwfc);
sahilmgandhi 18:6a4db94011d3 358 if (UART_CB.hwfc == NRF_UART_HWFC_ENABLED)
sahilmgandhi 18:6a4db94011d3 359 {
sahilmgandhi 18:6a4db94011d3 360 internal_set_hwfc(FlowControlRTSCTS,
sahilmgandhi 18:6a4db94011d3 361 (PinName) UART_CB.pselrts, (PinName) UART_CB.pselcts);
sahilmgandhi 18:6a4db94011d3 362 }
sahilmgandhi 18:6a4db94011d3 363
sahilmgandhi 18:6a4db94011d3 364 nrf_uart_enable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 365
sahilmgandhi 18:6a4db94011d3 366 UART_CB.initialized = true;
sahilmgandhi 18:6a4db94011d3 367 }
sahilmgandhi 18:6a4db94011d3 368
sahilmgandhi 18:6a4db94011d3 369 if (tx == STDIO_UART_TX && rx == STDIO_UART_RX)
sahilmgandhi 18:6a4db94011d3 370 {
sahilmgandhi 18:6a4db94011d3 371 stdio_uart_inited = 1;
sahilmgandhi 18:6a4db94011d3 372 memcpy(&stdio_uart, obj, sizeof(serial_t));
sahilmgandhi 18:6a4db94011d3 373 }
sahilmgandhi 18:6a4db94011d3 374 else
sahilmgandhi 18:6a4db94011d3 375 {
sahilmgandhi 18:6a4db94011d3 376 stdio_uart_inited = 0;
sahilmgandhi 18:6a4db94011d3 377 }
sahilmgandhi 18:6a4db94011d3 378 }
sahilmgandhi 18:6a4db94011d3 379
sahilmgandhi 18:6a4db94011d3 380 void serial_free(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 381 {
sahilmgandhi 18:6a4db94011d3 382 (void)obj;
sahilmgandhi 18:6a4db94011d3 383
sahilmgandhi 18:6a4db94011d3 384 if (UART_CB.initialized)
sahilmgandhi 18:6a4db94011d3 385 {
sahilmgandhi 18:6a4db94011d3 386 nrf_uart_disable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 387 nrf_uart_int_disable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY |
sahilmgandhi 18:6a4db94011d3 388 NRF_UART_INT_MASK_TXDRDY |
sahilmgandhi 18:6a4db94011d3 389 NRF_UART_INT_MASK_ERROR);
sahilmgandhi 18:6a4db94011d3 390 nrf_drv_common_irq_disable(UART_IRQn);
sahilmgandhi 18:6a4db94011d3 391 UART_CB.initialized = false;
sahilmgandhi 18:6a4db94011d3 392
sahilmgandhi 18:6a4db94011d3 393 // There is only one UART instance, thus at this point the stdio UART
sahilmgandhi 18:6a4db94011d3 394 // can no longer be initialized.
sahilmgandhi 18:6a4db94011d3 395 stdio_uart_inited = 0;
sahilmgandhi 18:6a4db94011d3 396 }
sahilmgandhi 18:6a4db94011d3 397 }
sahilmgandhi 18:6a4db94011d3 398
sahilmgandhi 18:6a4db94011d3 399 void serial_baud(serial_t *obj, int baudrate)
sahilmgandhi 18:6a4db94011d3 400 {
sahilmgandhi 18:6a4db94011d3 401 // nrf_uart_baudrate_set() is not used here (registers are accessed
sahilmgandhi 18:6a4db94011d3 402 // directly) to make it possible to set special baud rates like 56000
sahilmgandhi 18:6a4db94011d3 403 // or 31250.
sahilmgandhi 18:6a4db94011d3 404
sahilmgandhi 18:6a4db94011d3 405 static uint32_t const acceptedSpeeds[][2] = {
sahilmgandhi 18:6a4db94011d3 406 { 1200, UART_BAUDRATE_BAUDRATE_Baud1200 },
sahilmgandhi 18:6a4db94011d3 407 { 2400, UART_BAUDRATE_BAUDRATE_Baud2400 },
sahilmgandhi 18:6a4db94011d3 408 { 4800, UART_BAUDRATE_BAUDRATE_Baud4800 },
sahilmgandhi 18:6a4db94011d3 409 { 9600, UART_BAUDRATE_BAUDRATE_Baud9600 },
sahilmgandhi 18:6a4db94011d3 410 { 14400, UART_BAUDRATE_BAUDRATE_Baud14400 },
sahilmgandhi 18:6a4db94011d3 411 { 19200, UART_BAUDRATE_BAUDRATE_Baud19200 },
sahilmgandhi 18:6a4db94011d3 412 { 28800, UART_BAUDRATE_BAUDRATE_Baud28800 },
sahilmgandhi 18:6a4db94011d3 413 { 31250, (0x00800000UL) /* 31250 baud */ },
sahilmgandhi 18:6a4db94011d3 414 { 38400, UART_BAUDRATE_BAUDRATE_Baud38400 },
sahilmgandhi 18:6a4db94011d3 415 { 56000, (0x00E51000UL) /* 56000 baud */ },
sahilmgandhi 18:6a4db94011d3 416 { 57600, UART_BAUDRATE_BAUDRATE_Baud57600 },
sahilmgandhi 18:6a4db94011d3 417 { 76800, UART_BAUDRATE_BAUDRATE_Baud76800 },
sahilmgandhi 18:6a4db94011d3 418 { 115200, UART_BAUDRATE_BAUDRATE_Baud115200 },
sahilmgandhi 18:6a4db94011d3 419 { 230400, UART_BAUDRATE_BAUDRATE_Baud230400 },
sahilmgandhi 18:6a4db94011d3 420 { 250000, UART_BAUDRATE_BAUDRATE_Baud250000 },
sahilmgandhi 18:6a4db94011d3 421 { 460800, UART_BAUDRATE_BAUDRATE_Baud460800 },
sahilmgandhi 18:6a4db94011d3 422 { 921600, UART_BAUDRATE_BAUDRATE_Baud921600 },
sahilmgandhi 18:6a4db94011d3 423 { 1000000, UART_BAUDRATE_BAUDRATE_Baud1M }
sahilmgandhi 18:6a4db94011d3 424 };
sahilmgandhi 18:6a4db94011d3 425
sahilmgandhi 18:6a4db94011d3 426 if (baudrate <= 1200)
sahilmgandhi 18:6a4db94011d3 427 {
sahilmgandhi 18:6a4db94011d3 428 UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1200;
sahilmgandhi 18:6a4db94011d3 429 return;
sahilmgandhi 18:6a4db94011d3 430 }
sahilmgandhi 18:6a4db94011d3 431
sahilmgandhi 18:6a4db94011d3 432 int const item_cnt = sizeof(acceptedSpeeds)/sizeof(acceptedSpeeds[0]);
sahilmgandhi 18:6a4db94011d3 433
sahilmgandhi 18:6a4db94011d3 434 for (int i = 1; i < item_cnt; i++)
sahilmgandhi 18:6a4db94011d3 435 {
sahilmgandhi 18:6a4db94011d3 436 if ((uint32_t)baudrate < acceptedSpeeds[i][0])
sahilmgandhi 18:6a4db94011d3 437 {
sahilmgandhi 18:6a4db94011d3 438 UART_INSTANCE->BAUDRATE = acceptedSpeeds[i - 1][1];
sahilmgandhi 18:6a4db94011d3 439 return;
sahilmgandhi 18:6a4db94011d3 440 }
sahilmgandhi 18:6a4db94011d3 441 }
sahilmgandhi 18:6a4db94011d3 442
sahilmgandhi 18:6a4db94011d3 443 UART_INSTANCE->BAUDRATE = UART_BAUDRATE_BAUDRATE_Baud1M;
sahilmgandhi 18:6a4db94011d3 444 }
sahilmgandhi 18:6a4db94011d3 445
sahilmgandhi 18:6a4db94011d3 446 void serial_format(serial_t *obj,
sahilmgandhi 18:6a4db94011d3 447 int data_bits, SerialParity parity, int stop_bits)
sahilmgandhi 18:6a4db94011d3 448 {
sahilmgandhi 18:6a4db94011d3 449 (void)obj;
sahilmgandhi 18:6a4db94011d3 450
sahilmgandhi 18:6a4db94011d3 451 if (data_bits != 8)
sahilmgandhi 18:6a4db94011d3 452 {
sahilmgandhi 18:6a4db94011d3 453 error("UART supports only 8 data bits.\r\n");
sahilmgandhi 18:6a4db94011d3 454 }
sahilmgandhi 18:6a4db94011d3 455 if (stop_bits != 1)
sahilmgandhi 18:6a4db94011d3 456 {
sahilmgandhi 18:6a4db94011d3 457 error("UART supports only 1 stop bits.\r\n");
sahilmgandhi 18:6a4db94011d3 458 }
sahilmgandhi 18:6a4db94011d3 459 if (parity == ParityNone)
sahilmgandhi 18:6a4db94011d3 460 {
sahilmgandhi 18:6a4db94011d3 461 UART_CB.parity = NRF_UART_PARITY_EXCLUDED;
sahilmgandhi 18:6a4db94011d3 462 }
sahilmgandhi 18:6a4db94011d3 463 else if (parity == ParityEven)
sahilmgandhi 18:6a4db94011d3 464 {
sahilmgandhi 18:6a4db94011d3 465 UART_CB.parity = NRF_UART_PARITY_INCLUDED;
sahilmgandhi 18:6a4db94011d3 466 }
sahilmgandhi 18:6a4db94011d3 467 else
sahilmgandhi 18:6a4db94011d3 468 {
sahilmgandhi 18:6a4db94011d3 469 error("UART supports only even parity.\r\n");
sahilmgandhi 18:6a4db94011d3 470 }
sahilmgandhi 18:6a4db94011d3 471
sahilmgandhi 18:6a4db94011d3 472 // Reconfigure UART peripheral.
sahilmgandhi 18:6a4db94011d3 473 nrf_uart_configure(UART_INSTANCE, UART_CB.parity, UART_CB.hwfc);
sahilmgandhi 18:6a4db94011d3 474 }
sahilmgandhi 18:6a4db94011d3 475
sahilmgandhi 18:6a4db94011d3 476 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
sahilmgandhi 18:6a4db94011d3 477 {
sahilmgandhi 18:6a4db94011d3 478 (void)obj;
sahilmgandhi 18:6a4db94011d3 479 UART_CB.irq_handler = handler;
sahilmgandhi 18:6a4db94011d3 480 UART_CB.irq_context = id;
sahilmgandhi 18:6a4db94011d3 481 }
sahilmgandhi 18:6a4db94011d3 482
sahilmgandhi 18:6a4db94011d3 483 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
sahilmgandhi 18:6a4db94011d3 484 {
sahilmgandhi 18:6a4db94011d3 485 (void)obj;
sahilmgandhi 18:6a4db94011d3 486 if (enable)
sahilmgandhi 18:6a4db94011d3 487 {
sahilmgandhi 18:6a4db94011d3 488 switch (irq)
sahilmgandhi 18:6a4db94011d3 489 {
sahilmgandhi 18:6a4db94011d3 490 case RxIrq:
sahilmgandhi 18:6a4db94011d3 491 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 492 UART_CB.irq_enabled |= UART_IRQ_RX;
sahilmgandhi 18:6a4db94011d3 493 #endif
sahilmgandhi 18:6a4db94011d3 494 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY);
sahilmgandhi 18:6a4db94011d3 495 break;
sahilmgandhi 18:6a4db94011d3 496
sahilmgandhi 18:6a4db94011d3 497 case TxIrq:
sahilmgandhi 18:6a4db94011d3 498 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 499 UART_CB.irq_enabled |= UART_IRQ_TX;
sahilmgandhi 18:6a4db94011d3 500 #endif
sahilmgandhi 18:6a4db94011d3 501 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 502 break;
sahilmgandhi 18:6a4db94011d3 503 }
sahilmgandhi 18:6a4db94011d3 504 }
sahilmgandhi 18:6a4db94011d3 505 else
sahilmgandhi 18:6a4db94011d3 506 {
sahilmgandhi 18:6a4db94011d3 507 switch (irq)
sahilmgandhi 18:6a4db94011d3 508 {
sahilmgandhi 18:6a4db94011d3 509 case RxIrq:
sahilmgandhi 18:6a4db94011d3 510 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 511 UART_CB.irq_enabled &= ~UART_IRQ_RX;
sahilmgandhi 18:6a4db94011d3 512 if (!UART_CB.rx_active)
sahilmgandhi 18:6a4db94011d3 513 #endif
sahilmgandhi 18:6a4db94011d3 514 {
sahilmgandhi 18:6a4db94011d3 515 nrf_uart_int_disable(UART_INSTANCE,
sahilmgandhi 18:6a4db94011d3 516 NRF_UART_INT_MASK_RXDRDY);
sahilmgandhi 18:6a4db94011d3 517 }
sahilmgandhi 18:6a4db94011d3 518 break;
sahilmgandhi 18:6a4db94011d3 519
sahilmgandhi 18:6a4db94011d3 520 case TxIrq:
sahilmgandhi 18:6a4db94011d3 521 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 522 UART_CB.irq_enabled &= ~UART_IRQ_TX;
sahilmgandhi 18:6a4db94011d3 523 if (!UART_CB.tx_active)
sahilmgandhi 18:6a4db94011d3 524 #endif
sahilmgandhi 18:6a4db94011d3 525 {
sahilmgandhi 18:6a4db94011d3 526 nrf_uart_int_disable(UART_INSTANCE,
sahilmgandhi 18:6a4db94011d3 527 NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 528 }
sahilmgandhi 18:6a4db94011d3 529 break;
sahilmgandhi 18:6a4db94011d3 530 }
sahilmgandhi 18:6a4db94011d3 531 }
sahilmgandhi 18:6a4db94011d3 532 }
sahilmgandhi 18:6a4db94011d3 533
sahilmgandhi 18:6a4db94011d3 534 int serial_getc(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 535 {
sahilmgandhi 18:6a4db94011d3 536 while (!serial_readable(obj))
sahilmgandhi 18:6a4db94011d3 537 {
sahilmgandhi 18:6a4db94011d3 538 }
sahilmgandhi 18:6a4db94011d3 539
sahilmgandhi 18:6a4db94011d3 540 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_RXDRDY);
sahilmgandhi 18:6a4db94011d3 541 return nrf_uart_rxd_get(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 542 }
sahilmgandhi 18:6a4db94011d3 543
sahilmgandhi 18:6a4db94011d3 544 void serial_putc(serial_t *obj, int c)
sahilmgandhi 18:6a4db94011d3 545 {
sahilmgandhi 18:6a4db94011d3 546 while (!serial_writable(obj))
sahilmgandhi 18:6a4db94011d3 547 {
sahilmgandhi 18:6a4db94011d3 548 }
sahilmgandhi 18:6a4db94011d3 549
sahilmgandhi 18:6a4db94011d3 550 nrf_uart_event_clear(UART_INSTANCE, NRF_UART_EVENT_TXDRDY);
sahilmgandhi 18:6a4db94011d3 551 nrf_uart_txd_set(UART_INSTANCE, (uint8_t)c);
sahilmgandhi 18:6a4db94011d3 552 }
sahilmgandhi 18:6a4db94011d3 553
sahilmgandhi 18:6a4db94011d3 554 int serial_readable(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 555 {
sahilmgandhi 18:6a4db94011d3 556 (void)obj;
sahilmgandhi 18:6a4db94011d3 557 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 558 if (UART_CB.rx_active)
sahilmgandhi 18:6a4db94011d3 559 {
sahilmgandhi 18:6a4db94011d3 560 return 0;
sahilmgandhi 18:6a4db94011d3 561 }
sahilmgandhi 18:6a4db94011d3 562 #endif
sahilmgandhi 18:6a4db94011d3 563 return (nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_RXDRDY));
sahilmgandhi 18:6a4db94011d3 564 }
sahilmgandhi 18:6a4db94011d3 565
sahilmgandhi 18:6a4db94011d3 566 int serial_writable(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 567 {
sahilmgandhi 18:6a4db94011d3 568 (void)obj;
sahilmgandhi 18:6a4db94011d3 569 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 570 if (UART_CB.tx_active)
sahilmgandhi 18:6a4db94011d3 571 {
sahilmgandhi 18:6a4db94011d3 572 return 0;
sahilmgandhi 18:6a4db94011d3 573 }
sahilmgandhi 18:6a4db94011d3 574 #endif
sahilmgandhi 18:6a4db94011d3 575 return (nrf_uart_event_check(UART_INSTANCE, NRF_UART_EVENT_TXDRDY));
sahilmgandhi 18:6a4db94011d3 576 }
sahilmgandhi 18:6a4db94011d3 577
sahilmgandhi 18:6a4db94011d3 578 void serial_break_set(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 579 {
sahilmgandhi 18:6a4db94011d3 580 (void)obj;
sahilmgandhi 18:6a4db94011d3 581 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_SUSPEND);
sahilmgandhi 18:6a4db94011d3 582 nrf_uart_txrx_pins_disconnect(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 583 nrf_gpio_pin_clear(UART_CB.pseltxd);
sahilmgandhi 18:6a4db94011d3 584 }
sahilmgandhi 18:6a4db94011d3 585
sahilmgandhi 18:6a4db94011d3 586 void serial_break_clear(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 587 {
sahilmgandhi 18:6a4db94011d3 588 (void)obj;
sahilmgandhi 18:6a4db94011d3 589 nrf_gpio_pin_set(UART_CB.pseltxd);
sahilmgandhi 18:6a4db94011d3 590 nrf_uart_txrx_pins_set(UART_INSTANCE, UART_CB.pseltxd, UART_CB.pselrxd);
sahilmgandhi 18:6a4db94011d3 591 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_STARTRX);
sahilmgandhi 18:6a4db94011d3 592 nrf_uart_task_trigger(UART_INSTANCE, NRF_UART_TASK_STARTTX);
sahilmgandhi 18:6a4db94011d3 593 }
sahilmgandhi 18:6a4db94011d3 594
sahilmgandhi 18:6a4db94011d3 595
sahilmgandhi 18:6a4db94011d3 596 static void internal_set_hwfc(FlowControl type,
sahilmgandhi 18:6a4db94011d3 597 PinName rxflow, PinName txflow)
sahilmgandhi 18:6a4db94011d3 598 {
sahilmgandhi 18:6a4db94011d3 599 UART_CB.pselrts =
sahilmgandhi 18:6a4db94011d3 600 ((rxflow == NC) || (type == FlowControlCTS)) ? NRF_UART_PSEL_DISCONNECTED : (uint32_t)rxflow;
sahilmgandhi 18:6a4db94011d3 601 UART_CB.pselcts =
sahilmgandhi 18:6a4db94011d3 602 ((txflow == NC) || (type == FlowControlRTS)) ? NRF_UART_PSEL_DISCONNECTED : (uint32_t)txflow;
sahilmgandhi 18:6a4db94011d3 603
sahilmgandhi 18:6a4db94011d3 604 if (UART_CB.pselrts != NRF_UART_PSEL_DISCONNECTED)
sahilmgandhi 18:6a4db94011d3 605 {
sahilmgandhi 18:6a4db94011d3 606 nrf_gpio_pin_set(UART_CB.pselrts);
sahilmgandhi 18:6a4db94011d3 607 nrf_gpio_cfg_output(UART_CB.pselrts);
sahilmgandhi 18:6a4db94011d3 608 }
sahilmgandhi 18:6a4db94011d3 609 if (UART_CB.pselcts != NRF_UART_PSEL_DISCONNECTED)
sahilmgandhi 18:6a4db94011d3 610 {
sahilmgandhi 18:6a4db94011d3 611 nrf_gpio_cfg_input(UART_CB.pselcts, NRF_GPIO_PIN_NOPULL);
sahilmgandhi 18:6a4db94011d3 612 }
sahilmgandhi 18:6a4db94011d3 613
sahilmgandhi 18:6a4db94011d3 614 UART_CB.hwfc = (nrf_uart_hwfc_t)((type == FlowControlNone)? NRF_UART_HWFC_DISABLED : UART_DEFAULT_CONFIG_HWFC);
sahilmgandhi 18:6a4db94011d3 615
sahilmgandhi 18:6a4db94011d3 616 nrf_uart_configure(UART_INSTANCE, UART_CB.parity, UART_CB.hwfc);
sahilmgandhi 18:6a4db94011d3 617 nrf_uart_hwfc_pins_set(UART_INSTANCE, UART_CB.pselrts, UART_CB.pselcts);
sahilmgandhi 18:6a4db94011d3 618 }
sahilmgandhi 18:6a4db94011d3 619
sahilmgandhi 18:6a4db94011d3 620 void serial_set_flow_control(serial_t *obj, FlowControl type,
sahilmgandhi 18:6a4db94011d3 621 PinName rxflow, PinName txflow)
sahilmgandhi 18:6a4db94011d3 622 {
sahilmgandhi 18:6a4db94011d3 623 (void)obj;
sahilmgandhi 18:6a4db94011d3 624
sahilmgandhi 18:6a4db94011d3 625 nrf_uart_disable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 626 internal_set_hwfc(type, rxflow, txflow);
sahilmgandhi 18:6a4db94011d3 627 nrf_uart_enable(UART_INSTANCE);
sahilmgandhi 18:6a4db94011d3 628 }
sahilmgandhi 18:6a4db94011d3 629
sahilmgandhi 18:6a4db94011d3 630
sahilmgandhi 18:6a4db94011d3 631 void serial_clear(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 632 {
sahilmgandhi 18:6a4db94011d3 633 (void)obj;
sahilmgandhi 18:6a4db94011d3 634 }
sahilmgandhi 18:6a4db94011d3 635
sahilmgandhi 18:6a4db94011d3 636 #if DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 637
sahilmgandhi 18:6a4db94011d3 638 int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length,
sahilmgandhi 18:6a4db94011d3 639 uint8_t tx_width, uint32_t handler, uint32_t event,
sahilmgandhi 18:6a4db94011d3 640 DMAUsage hint)
sahilmgandhi 18:6a4db94011d3 641 {
sahilmgandhi 18:6a4db94011d3 642 (void)obj;
sahilmgandhi 18:6a4db94011d3 643 (void)tx_width;
sahilmgandhi 18:6a4db94011d3 644 (void)hint;
sahilmgandhi 18:6a4db94011d3 645 if (UART_CB.tx_active || !tx_length)
sahilmgandhi 18:6a4db94011d3 646 {
sahilmgandhi 18:6a4db94011d3 647 return 0;
sahilmgandhi 18:6a4db94011d3 648 }
sahilmgandhi 18:6a4db94011d3 649
sahilmgandhi 18:6a4db94011d3 650 UART_CB.tx_buffer = tx;
sahilmgandhi 18:6a4db94011d3 651 UART_CB.tx_length = tx_length;
sahilmgandhi 18:6a4db94011d3 652 UART_CB.tx_pos = 0;
sahilmgandhi 18:6a4db94011d3 653 UART_CB.tx_asynch_handler = (void(*)())handler;
sahilmgandhi 18:6a4db94011d3 654 UART_CB.events_wanted &= ~SERIAL_EVENT_TX_ALL;
sahilmgandhi 18:6a4db94011d3 655 UART_CB.events_wanted |= event;
sahilmgandhi 18:6a4db94011d3 656
sahilmgandhi 18:6a4db94011d3 657 UART_CB.tx_active = true;
sahilmgandhi 18:6a4db94011d3 658 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_TXDRDY);
sahilmgandhi 18:6a4db94011d3 659
sahilmgandhi 18:6a4db94011d3 660 return 0;
sahilmgandhi 18:6a4db94011d3 661 }
sahilmgandhi 18:6a4db94011d3 662
sahilmgandhi 18:6a4db94011d3 663 void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length,
sahilmgandhi 18:6a4db94011d3 664 uint8_t rx_width, uint32_t handler, uint32_t event,
sahilmgandhi 18:6a4db94011d3 665 uint8_t char_match, DMAUsage hint)
sahilmgandhi 18:6a4db94011d3 666 {
sahilmgandhi 18:6a4db94011d3 667 (void)obj;
sahilmgandhi 18:6a4db94011d3 668 (void)rx_width;
sahilmgandhi 18:6a4db94011d3 669 (void)hint;
sahilmgandhi 18:6a4db94011d3 670 if (UART_CB.rx_active || !rx_length)
sahilmgandhi 18:6a4db94011d3 671 {
sahilmgandhi 18:6a4db94011d3 672 return;
sahilmgandhi 18:6a4db94011d3 673 }
sahilmgandhi 18:6a4db94011d3 674
sahilmgandhi 18:6a4db94011d3 675 UART_CB.rx_buffer = rx;
sahilmgandhi 18:6a4db94011d3 676 UART_CB.rx_length = rx_length;
sahilmgandhi 18:6a4db94011d3 677 UART_CB.rx_pos = 0;
sahilmgandhi 18:6a4db94011d3 678 UART_CB.rx_asynch_handler = (void(*)())handler;
sahilmgandhi 18:6a4db94011d3 679 UART_CB.events_wanted &= ~SERIAL_EVENT_RX_ALL;
sahilmgandhi 18:6a4db94011d3 680 UART_CB.events_wanted |= event;
sahilmgandhi 18:6a4db94011d3 681 UART_CB.char_match = char_match;
sahilmgandhi 18:6a4db94011d3 682
sahilmgandhi 18:6a4db94011d3 683 UART_CB.rx_active = true;
sahilmgandhi 18:6a4db94011d3 684 nrf_uart_int_enable(UART_INSTANCE, NRF_UART_INT_MASK_RXDRDY);
sahilmgandhi 18:6a4db94011d3 685 }
sahilmgandhi 18:6a4db94011d3 686
sahilmgandhi 18:6a4db94011d3 687 uint8_t serial_tx_active(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 688 {
sahilmgandhi 18:6a4db94011d3 689 (void)obj;
sahilmgandhi 18:6a4db94011d3 690 return UART_CB.tx_active;
sahilmgandhi 18:6a4db94011d3 691 }
sahilmgandhi 18:6a4db94011d3 692
sahilmgandhi 18:6a4db94011d3 693 uint8_t serial_rx_active(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 694 {
sahilmgandhi 18:6a4db94011d3 695 (void)obj;
sahilmgandhi 18:6a4db94011d3 696 return UART_CB.rx_active;
sahilmgandhi 18:6a4db94011d3 697 }
sahilmgandhi 18:6a4db94011d3 698
sahilmgandhi 18:6a4db94011d3 699 int serial_irq_handler_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 700 {
sahilmgandhi 18:6a4db94011d3 701 (void)obj;
sahilmgandhi 18:6a4db94011d3 702 uint32_t events_to_report = UART_CB.events_wanted & UART_CB.events_occured;
sahilmgandhi 18:6a4db94011d3 703 UART_CB.events_occured &= (~events_to_report);
sahilmgandhi 18:6a4db94011d3 704 return events_to_report;
sahilmgandhi 18:6a4db94011d3 705 }
sahilmgandhi 18:6a4db94011d3 706
sahilmgandhi 18:6a4db94011d3 707 void serial_tx_abort_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 708 {
sahilmgandhi 18:6a4db94011d3 709 (void)obj;
sahilmgandhi 18:6a4db94011d3 710 end_asynch_tx();
sahilmgandhi 18:6a4db94011d3 711 UART_CB.tx_asynch_handler = NULL;
sahilmgandhi 18:6a4db94011d3 712 }
sahilmgandhi 18:6a4db94011d3 713
sahilmgandhi 18:6a4db94011d3 714 void serial_rx_abort_asynch(serial_t *obj)
sahilmgandhi 18:6a4db94011d3 715 {
sahilmgandhi 18:6a4db94011d3 716 (void)obj;
sahilmgandhi 18:6a4db94011d3 717 end_asynch_rx();
sahilmgandhi 18:6a4db94011d3 718 UART_CB.rx_asynch_handler = NULL;
sahilmgandhi 18:6a4db94011d3 719 }
sahilmgandhi 18:6a4db94011d3 720
sahilmgandhi 18:6a4db94011d3 721 #endif // DEVICE_SERIAL_ASYNCH
sahilmgandhi 18:6a4db94011d3 722
sahilmgandhi 18:6a4db94011d3 723 #endif // DEVICE_SERIAL