mbed library sources. Supersedes mbed-src.

Fork of mbed by teralytic

Committer:
rodriguise
Date:
Mon Oct 17 18:47:01 2016 +0000
Revision:
148:4802eb17e82b
Parent:
107:414e9c822e99
backup

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 107:414e9c822e99 1 /* mbed Microcontroller Library
mbed_official 107:414e9c822e99 2 * Copyright (c) 2006-2015 ARM Limited
mbed_official 107:414e9c822e99 3 *
mbed_official 107:414e9c822e99 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 107:414e9c822e99 5 * you may not use this file except in compliance with the License.
mbed_official 107:414e9c822e99 6 * You may obtain a copy of the License at
mbed_official 107:414e9c822e99 7 *
mbed_official 107:414e9c822e99 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 107:414e9c822e99 9 *
mbed_official 107:414e9c822e99 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 107:414e9c822e99 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 107:414e9c822e99 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 107:414e9c822e99 13 * See the License for the specific language governing permissions and
mbed_official 107:414e9c822e99 14 * limitations under the License.
mbed_official 107:414e9c822e99 15 */
mbed_official 107:414e9c822e99 16 #include <string.h>
mbed_official 107:414e9c822e99 17 #include "mbed_assert.h"
mbed_official 107:414e9c822e99 18 #include "cmsis.h"
mbed_official 107:414e9c822e99 19 #include "serial_api.h"
mbed_official 107:414e9c822e99 20 #include "sysclk.h"
mbed_official 107:414e9c822e99 21 #include "serial_platform.h"
mbed_official 107:414e9c822e99 22 #include "ioport.h"
mbed_official 107:414e9c822e99 23 #include "pinmap.h"
mbed_official 107:414e9c822e99 24 #include "PeripheralPins.h"
mbed_official 107:414e9c822e99 25 #include "pdc.h"
mbed_official 107:414e9c822e99 26
mbed_official 107:414e9c822e99 27 #if DEVICE_SERIAL_ASYNCH
mbed_official 107:414e9c822e99 28 #define pUSART_S(obj) obj->serial.uart
mbed_official 107:414e9c822e99 29 #define pSERIAL_S(obj) ((struct serial_s*)&(obj->serial))
mbed_official 107:414e9c822e99 30 #else
mbed_official 107:414e9c822e99 31 #define pUSART_S(obj) obj->uart
mbed_official 107:414e9c822e99 32 #define pSERIAL_S(obj) ((struct serial_s*)obj)
mbed_official 107:414e9c822e99 33 #endif
mbed_official 107:414e9c822e99 34 #define _USART(obj) ((Usart*)pUSART_S(obj))
mbed_official 107:414e9c822e99 35 #define USART_NUM 8
mbed_official 107:414e9c822e99 36
mbed_official 107:414e9c822e99 37 static uint8_t serial_get_index(serial_t *obj);
mbed_official 107:414e9c822e99 38 static IRQn_Type get_serial_irq_num (serial_t *obj);
mbed_official 107:414e9c822e99 39 static uint32_t get_serial_vector (serial_t *obj);
mbed_official 107:414e9c822e99 40 static uint32_t serial_irq_ids[USART_NUM] = {0};
mbed_official 107:414e9c822e99 41 static uart_irq_handler irq_handler;
mbed_official 107:414e9c822e99 42 static void uart0_irq(void);
mbed_official 107:414e9c822e99 43 static void uart1_irq(void);
mbed_official 107:414e9c822e99 44 static void uart2_irq(void);
mbed_official 107:414e9c822e99 45 static void uart3_irq(void);
mbed_official 107:414e9c822e99 46 static void uart4_irq(void);
mbed_official 107:414e9c822e99 47 static void uart5_irq(void);
mbed_official 107:414e9c822e99 48 static void uart6_irq(void);
mbed_official 107:414e9c822e99 49 static void uart7_irq(void);
mbed_official 107:414e9c822e99 50
mbed_official 107:414e9c822e99 51
mbed_official 107:414e9c822e99 52 int stdio_uart_inited = 0;
mbed_official 107:414e9c822e99 53 serial_t stdio_uart;
mbed_official 107:414e9c822e99 54
mbed_official 107:414e9c822e99 55 extern uint8_t g_sys_init;
mbed_official 107:414e9c822e99 56
mbed_official 107:414e9c822e99 57 static int get_usart_clock_id(UARTName peripheral)
mbed_official 107:414e9c822e99 58 {
mbed_official 107:414e9c822e99 59 int cid;
mbed_official 107:414e9c822e99 60 switch (peripheral) {
mbed_official 107:414e9c822e99 61 case UART_0:
mbed_official 107:414e9c822e99 62 cid = ID_FLEXCOM0;
mbed_official 107:414e9c822e99 63 break;
mbed_official 107:414e9c822e99 64 case UART_1:
mbed_official 107:414e9c822e99 65 cid = ID_FLEXCOM1;
mbed_official 107:414e9c822e99 66 break;
mbed_official 107:414e9c822e99 67 case UART_2:
mbed_official 107:414e9c822e99 68 cid = ID_FLEXCOM2;
mbed_official 107:414e9c822e99 69 break;
mbed_official 107:414e9c822e99 70 case UART_3:
mbed_official 107:414e9c822e99 71 cid = ID_FLEXCOM3;
mbed_official 107:414e9c822e99 72 break;
mbed_official 107:414e9c822e99 73 case UART_4:
mbed_official 107:414e9c822e99 74 cid = ID_FLEXCOM4;
mbed_official 107:414e9c822e99 75 break;
mbed_official 107:414e9c822e99 76 case UART_5:
mbed_official 107:414e9c822e99 77 cid = ID_FLEXCOM5;
mbed_official 107:414e9c822e99 78 break;
mbed_official 107:414e9c822e99 79 case UART_6:
mbed_official 107:414e9c822e99 80 cid = ID_FLEXCOM6;
mbed_official 107:414e9c822e99 81 break;
mbed_official 107:414e9c822e99 82 case UART_7:
mbed_official 107:414e9c822e99 83 cid = ID_FLEXCOM7;
mbed_official 107:414e9c822e99 84 break;
mbed_official 107:414e9c822e99 85 default :
mbed_official 107:414e9c822e99 86 cid = NC;
mbed_official 107:414e9c822e99 87 break;
mbed_official 107:414e9c822e99 88 }
mbed_official 107:414e9c822e99 89 return cid;
mbed_official 107:414e9c822e99 90 }
mbed_official 107:414e9c822e99 91
mbed_official 107:414e9c822e99 92 static int get_flexcom_id(UARTName peripheral)
mbed_official 107:414e9c822e99 93 {
mbed_official 107:414e9c822e99 94 int fid;
mbed_official 107:414e9c822e99 95 switch (peripheral) {
mbed_official 107:414e9c822e99 96 case UART_0:
mbed_official 107:414e9c822e99 97 fid = (int)FLEXCOM0;
mbed_official 107:414e9c822e99 98 break;
mbed_official 107:414e9c822e99 99 case UART_1:
mbed_official 107:414e9c822e99 100 fid = (int)FLEXCOM1;
mbed_official 107:414e9c822e99 101 break;
mbed_official 107:414e9c822e99 102 case UART_2:
mbed_official 107:414e9c822e99 103 fid = (int)FLEXCOM2;
mbed_official 107:414e9c822e99 104 break;
mbed_official 107:414e9c822e99 105 case UART_3:
mbed_official 107:414e9c822e99 106 fid = (int)FLEXCOM3;
mbed_official 107:414e9c822e99 107 break;
mbed_official 107:414e9c822e99 108 case UART_4:
mbed_official 107:414e9c822e99 109 fid = (int)FLEXCOM4;
mbed_official 107:414e9c822e99 110 break;
mbed_official 107:414e9c822e99 111 case UART_5:
mbed_official 107:414e9c822e99 112 fid = (int)FLEXCOM5;
mbed_official 107:414e9c822e99 113 break;
mbed_official 107:414e9c822e99 114 case UART_6:
mbed_official 107:414e9c822e99 115 fid = (int)FLEXCOM6;
mbed_official 107:414e9c822e99 116 break;
mbed_official 107:414e9c822e99 117 case UART_7:
mbed_official 107:414e9c822e99 118 fid = (int)FLEXCOM7;
mbed_official 107:414e9c822e99 119 break;
mbed_official 107:414e9c822e99 120 default :
mbed_official 107:414e9c822e99 121 fid = NC;
mbed_official 107:414e9c822e99 122 break;
mbed_official 107:414e9c822e99 123 }
mbed_official 107:414e9c822e99 124 return fid;
mbed_official 107:414e9c822e99 125 }
mbed_official 107:414e9c822e99 126
mbed_official 107:414e9c822e99 127 void serial_init(serial_t *obj, PinName tx, PinName rx)
mbed_official 107:414e9c822e99 128 {
mbed_official 107:414e9c822e99 129 /* Sanity check arguments */
mbed_official 107:414e9c822e99 130 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 131 int clockid = NC, flexcom = NC;
mbed_official 107:414e9c822e99 132
mbed_official 107:414e9c822e99 133 /*To determine the uart peripheral associated with pins*/
mbed_official 107:414e9c822e99 134 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
mbed_official 107:414e9c822e99 135 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
mbed_official 107:414e9c822e99 136 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
mbed_official 107:414e9c822e99 137
mbed_official 107:414e9c822e99 138 MBED_ASSERT(uart != (UARTName)NC);
mbed_official 107:414e9c822e99 139
mbed_official 107:414e9c822e99 140 if (g_sys_init == 0) {
mbed_official 107:414e9c822e99 141 sysclk_init();
mbed_official 107:414e9c822e99 142 system_board_init();
mbed_official 107:414e9c822e99 143 g_sys_init = 1;
mbed_official 107:414e9c822e99 144 }
mbed_official 107:414e9c822e99 145 pUSART_S(obj) = uart;
mbed_official 107:414e9c822e99 146 pSERIAL_S(obj)->uart_serial_options.baudrate = (9600UL);
mbed_official 107:414e9c822e99 147 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_8_BIT;
mbed_official 107:414e9c822e99 148 pSERIAL_S(obj)->uart_serial_options.paritytype = US_MR_PAR_NO;
mbed_official 107:414e9c822e99 149 pSERIAL_S(obj)->uart_serial_options.stopbits = US_MR_NBSTOP_1_BIT;
mbed_official 107:414e9c822e99 150 pSERIAL_S(obj)->actrec = false;
mbed_official 107:414e9c822e99 151 pSERIAL_S(obj)->acttra = false;
mbed_official 107:414e9c822e99 152
mbed_official 107:414e9c822e99 153 /* Configure UART pins */
mbed_official 107:414e9c822e99 154 if(tx != NC) {
mbed_official 107:414e9c822e99 155 pin_function(tx, pinmap_find_function(tx, PinMap_UART_TX));
mbed_official 107:414e9c822e99 156 ioport_disable_pin(tx);
mbed_official 107:414e9c822e99 157 }
mbed_official 107:414e9c822e99 158 if(rx != NC) {
mbed_official 107:414e9c822e99 159 pin_function(rx, pinmap_find_function(rx, PinMap_UART_RX));
mbed_official 107:414e9c822e99 160 ioport_disable_pin(rx);
mbed_official 107:414e9c822e99 161 }
mbed_official 107:414e9c822e99 162 clockid = get_usart_clock_id(uart);
mbed_official 107:414e9c822e99 163 if (clockid != NC) {
mbed_official 107:414e9c822e99 164 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 165 }
mbed_official 107:414e9c822e99 166
mbed_official 107:414e9c822e99 167 flexcom = (int)get_flexcom_id(uart);
mbed_official 107:414e9c822e99 168 #if (!SAM4L)
mbed_official 107:414e9c822e99 169 #if (SAMG55)
mbed_official 107:414e9c822e99 170 /* Configure flexcom for usart */
mbed_official 107:414e9c822e99 171 flexcom_enable((Flexcom* )flexcom);
mbed_official 107:414e9c822e99 172 flexcom_set_opmode((Flexcom* )flexcom, FLEXCOM_USART);
mbed_official 107:414e9c822e99 173 #else
mbed_official 107:414e9c822e99 174 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 175 #endif
mbed_official 107:414e9c822e99 176 /* Configure USART */
mbed_official 107:414e9c822e99 177 usart_init_rs232((Usart*)uart, (sam_usart_opt_t*)&(pSERIAL_S(obj)->uart_serial_options),
mbed_official 107:414e9c822e99 178 sysclk_get_peripheral_hz());
mbed_official 107:414e9c822e99 179 #endif
mbed_official 107:414e9c822e99 180 #if (SAM4L)
mbed_official 107:414e9c822e99 181 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 182 /* Configure USART */
mbed_official 107:414e9c822e99 183 usart_init_rs232((Usart*)uart, (sam_usart_opt_t*)&(pSERIAL_S(obj)->uart_serial_options, sysclk_get_peripheral_bus_hz((Usart*)uart));
mbed_official 107:414e9c822e99 184 #endif
mbed_official 107:414e9c822e99 185 /* Disable rx and tx in case 1 line only required to be configured for usart */
mbed_official 107:414e9c822e99 186 usart_disable_tx((Usart*)uart);
mbed_official 107:414e9c822e99 187 usart_disable_rx((Usart*)uart);
mbed_official 107:414e9c822e99 188 /* Enable the receiver and transmitter. */
mbed_official 107:414e9c822e99 189 if(tx != NC) {
mbed_official 107:414e9c822e99 190 usart_enable_tx((Usart*)uart);
mbed_official 107:414e9c822e99 191 }
mbed_official 107:414e9c822e99 192 if(rx != NC) {
mbed_official 107:414e9c822e99 193 usart_enable_rx((Usart*)uart);
mbed_official 107:414e9c822e99 194 }
mbed_official 107:414e9c822e99 195
mbed_official 107:414e9c822e99 196 if(uart == STDIO_UART) {
mbed_official 107:414e9c822e99 197 stdio_uart_inited = 1;
mbed_official 107:414e9c822e99 198 memcpy(&stdio_uart, obj, sizeof(serial_t));
mbed_official 107:414e9c822e99 199 }
mbed_official 107:414e9c822e99 200 }
mbed_official 107:414e9c822e99 201
mbed_official 107:414e9c822e99 202 void serial_free(serial_t *obj)
mbed_official 107:414e9c822e99 203 {
mbed_official 107:414e9c822e99 204 /* Sanity check arguments */
mbed_official 107:414e9c822e99 205 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 206 usart_reset(_USART(obj));
mbed_official 107:414e9c822e99 207 }
mbed_official 107:414e9c822e99 208
mbed_official 107:414e9c822e99 209 void serial_baud(serial_t *obj, int baudrate)
mbed_official 107:414e9c822e99 210 {
mbed_official 107:414e9c822e99 211 /* Sanity check arguments */
mbed_official 107:414e9c822e99 212 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 213 MBED_ASSERT((baudrate == 110) || (baudrate == 150) || (baudrate == 300) || (baudrate == 1200) ||
mbed_official 107:414e9c822e99 214 (baudrate == 2400) || (baudrate == 4800) || (baudrate == 9600) || (baudrate == 19200) || (baudrate == 38400) ||
mbed_official 107:414e9c822e99 215 (baudrate == 57600) || (baudrate == 115200) || (baudrate == 230400) || (baudrate == 460800) || (baudrate == 921600) );
mbed_official 107:414e9c822e99 216 uint32_t clockid = 0;
mbed_official 107:414e9c822e99 217 clockid = get_usart_clock_id(pUSART_S(obj));
mbed_official 107:414e9c822e99 218 if (clockid != (uint32_t)NC) {
mbed_official 107:414e9c822e99 219 sysclk_disable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 220 }
mbed_official 107:414e9c822e99 221 pSERIAL_S(obj)->uart_serial_options.baudrate = baudrate;
mbed_official 107:414e9c822e99 222 usart_serial_init(_USART(obj), &(pSERIAL_S(obj)->uart_serial_options));
mbed_official 107:414e9c822e99 223 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 224 }
mbed_official 107:414e9c822e99 225
mbed_official 107:414e9c822e99 226 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
mbed_official 107:414e9c822e99 227 {
mbed_official 107:414e9c822e99 228 /* Sanity check arguments */
mbed_official 107:414e9c822e99 229 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 230 MBED_ASSERT((stop_bits == 1) || (stop_bits == 2));
mbed_official 107:414e9c822e99 231 MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven));
mbed_official 107:414e9c822e99 232 MBED_ASSERT((data_bits == 5) || (data_bits == 6) || (data_bits == 7) || (data_bits == 8));
mbed_official 107:414e9c822e99 233
mbed_official 107:414e9c822e99 234 uint32_t clockid = 0;
mbed_official 107:414e9c822e99 235 clockid = get_usart_clock_id(pUSART_S(obj));
mbed_official 107:414e9c822e99 236 if (clockid != (uint32_t)NC) {
mbed_official 107:414e9c822e99 237 sysclk_disable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 238 }
mbed_official 107:414e9c822e99 239
mbed_official 107:414e9c822e99 240 switch(stop_bits) { /*selecting the stop bits*/
mbed_official 107:414e9c822e99 241 case 1:
mbed_official 107:414e9c822e99 242 pSERIAL_S(obj)->uart_serial_options.stopbits = US_MR_NBSTOP_1_BIT;
mbed_official 107:414e9c822e99 243 break;
mbed_official 107:414e9c822e99 244 case 2:
mbed_official 107:414e9c822e99 245 pSERIAL_S(obj)->uart_serial_options.stopbits = US_MR_NBSTOP_2_BIT;
mbed_official 107:414e9c822e99 246 break;
mbed_official 107:414e9c822e99 247 }
mbed_official 107:414e9c822e99 248
mbed_official 107:414e9c822e99 249 switch(parity) { /*selecting the parity bits*/
mbed_official 107:414e9c822e99 250 case ParityNone:
mbed_official 107:414e9c822e99 251 pSERIAL_S(obj)->uart_serial_options.paritytype = US_MR_PAR_NO;
mbed_official 107:414e9c822e99 252 break;
mbed_official 107:414e9c822e99 253 case ParityOdd:
mbed_official 107:414e9c822e99 254 pSERIAL_S(obj)->uart_serial_options.paritytype = US_MR_PAR_ODD;
mbed_official 107:414e9c822e99 255 break;
mbed_official 107:414e9c822e99 256 case ParityEven:
mbed_official 107:414e9c822e99 257 pSERIAL_S(obj)->uart_serial_options.paritytype = US_MR_PAR_EVEN;
mbed_official 107:414e9c822e99 258 break;
mbed_official 107:414e9c822e99 259 case ParityForced1: /*No Hardware Support*/
mbed_official 107:414e9c822e99 260 MBED_ASSERT(0);
mbed_official 107:414e9c822e99 261 break;
mbed_official 107:414e9c822e99 262 case ParityForced0: /*No Hardware Support*/
mbed_official 107:414e9c822e99 263 MBED_ASSERT(0);
mbed_official 107:414e9c822e99 264 break;
mbed_official 107:414e9c822e99 265 }
mbed_official 107:414e9c822e99 266
mbed_official 107:414e9c822e99 267 switch(data_bits) { /*selecting the data bits*/
mbed_official 107:414e9c822e99 268 case 5:
mbed_official 107:414e9c822e99 269 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_5_BIT;
mbed_official 107:414e9c822e99 270 break;
mbed_official 107:414e9c822e99 271 case 6:
mbed_official 107:414e9c822e99 272 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_6_BIT;
mbed_official 107:414e9c822e99 273 break;
mbed_official 107:414e9c822e99 274 case 7:
mbed_official 107:414e9c822e99 275 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_7_BIT;
mbed_official 107:414e9c822e99 276 break;
mbed_official 107:414e9c822e99 277 case 8:
mbed_official 107:414e9c822e99 278 pSERIAL_S(obj)->uart_serial_options.charlength = US_MR_CHRL_8_BIT;
mbed_official 107:414e9c822e99 279 break;
mbed_official 107:414e9c822e99 280 }
mbed_official 107:414e9c822e99 281
mbed_official 107:414e9c822e99 282 usart_serial_init(_USART(obj), &(pSERIAL_S(obj)->uart_serial_options));
mbed_official 107:414e9c822e99 283 sysclk_enable_peripheral_clock(clockid);
mbed_official 107:414e9c822e99 284 }
mbed_official 107:414e9c822e99 285
mbed_official 107:414e9c822e99 286 #ifdef DEVICE_SERIAL_FC
mbed_official 107:414e9c822e99 287
mbed_official 107:414e9c822e99 288 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow)
mbed_official 107:414e9c822e99 289 {
mbed_official 107:414e9c822e99 290 /* Sanity check arguments */
mbed_official 107:414e9c822e99 291 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 292
mbed_official 107:414e9c822e99 293 if(FlowControlNone == type) {
mbed_official 107:414e9c822e99 294 /* Disable Hardware Handshaking. */
mbed_official 107:414e9c822e99 295 _USART(obj)->US_MR = (_USART(obj)->US_MR & ~US_MR_USART_MODE_Msk) | US_MR_USART_MODE_NORMAL;
mbed_official 107:414e9c822e99 296 return;
mbed_official 107:414e9c822e99 297 }
mbed_official 107:414e9c822e99 298
mbed_official 107:414e9c822e99 299 /*To determine the uart peripheral associated with pins*/
mbed_official 107:414e9c822e99 300 UARTName uart_cts = (UARTName)pinmap_peripheral(txflow, PinMap_UART_CTS);
mbed_official 107:414e9c822e99 301 UARTName uart_rts = (UARTName)pinmap_peripheral(rxflow, PinMap_UART_RTS);
mbed_official 107:414e9c822e99 302 UARTName uart = (UARTName)pinmap_merge(uart_cts, uart_rts);
mbed_official 107:414e9c822e99 303 MBED_ASSERT(uart != (UARTName)NC);
mbed_official 107:414e9c822e99 304
mbed_official 107:414e9c822e99 305 if((FlowControlCTS == type) || (FlowControlRTSCTS== type)) {
mbed_official 107:414e9c822e99 306 /* Configure CTS pin. */
mbed_official 107:414e9c822e99 307 pin_function(txflow, pinmap_find_function(txflow, PinMap_UART_CTS));
mbed_official 107:414e9c822e99 308 ioport_disable_pin(txflow);
mbed_official 107:414e9c822e99 309 }
mbed_official 107:414e9c822e99 310
mbed_official 107:414e9c822e99 311 if((FlowControlRTS == type) || (FlowControlRTSCTS== type)) {
mbed_official 107:414e9c822e99 312 /* Configure CTS pin. */
mbed_official 107:414e9c822e99 313 pin_function(rxflow, pinmap_find_function(rxflow, PinMap_UART_RTS));
mbed_official 107:414e9c822e99 314 ioport_disable_pin(rxflow);
mbed_official 107:414e9c822e99 315 }
mbed_official 107:414e9c822e99 316
mbed_official 107:414e9c822e99 317 /* Set hardware handshaking mode. */
mbed_official 107:414e9c822e99 318 _USART(obj)->US_MR = (_USART(obj)->US_MR & ~US_MR_USART_MODE_Msk) | US_MR_USART_MODE_HW_HANDSHAKING;
mbed_official 107:414e9c822e99 319 }
mbed_official 107:414e9c822e99 320
mbed_official 107:414e9c822e99 321 #endif //DEVICE_SERIAL_FC
mbed_official 107:414e9c822e99 322
mbed_official 107:414e9c822e99 323 void serial_break_set(serial_t *obj)
mbed_official 107:414e9c822e99 324 {
mbed_official 107:414e9c822e99 325 /* Sanity check arguments */
mbed_official 107:414e9c822e99 326 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 327 _USART(obj)->US_CR = US_CR_STTBRK;
mbed_official 107:414e9c822e99 328
mbed_official 107:414e9c822e99 329 }
mbed_official 107:414e9c822e99 330
mbed_official 107:414e9c822e99 331 void serial_break_clear(serial_t *obj)
mbed_official 107:414e9c822e99 332 {
mbed_official 107:414e9c822e99 333 /* Sanity check arguments */
mbed_official 107:414e9c822e99 334 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 335 _USART(obj)->US_CR = US_CR_STPBRK;
mbed_official 107:414e9c822e99 336
mbed_official 107:414e9c822e99 337 }
mbed_official 107:414e9c822e99 338
mbed_official 107:414e9c822e99 339 void serial_pinout_tx(PinName tx)
mbed_official 107:414e9c822e99 340 {
mbed_official 107:414e9c822e99 341 pin_function(tx, pinmap_find_function(tx, PinMap_UART_TX));
mbed_official 107:414e9c822e99 342 ioport_disable_pin(tx);
mbed_official 107:414e9c822e99 343 }
mbed_official 107:414e9c822e99 344
mbed_official 107:414e9c822e99 345 /******************************************************************************
mbed_official 107:414e9c822e99 346 * INTERRUPTS HANDLING
mbed_official 107:414e9c822e99 347 ******************************************************************************/
mbed_official 107:414e9c822e99 348
mbed_official 107:414e9c822e99 349 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
mbed_official 107:414e9c822e99 350 {
mbed_official 107:414e9c822e99 351 /* Sanity check arguments */
mbed_official 107:414e9c822e99 352 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 353 irq_handler = handler;
mbed_official 107:414e9c822e99 354 serial_irq_ids[serial_get_index(obj)] = id;
mbed_official 107:414e9c822e99 355 }
mbed_official 107:414e9c822e99 356
mbed_official 107:414e9c822e99 357 #warning "Interrupt only available for Serial Receive complete. Transmit complete not supported by Controller"
mbed_official 107:414e9c822e99 358
mbed_official 107:414e9c822e99 359 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
mbed_official 107:414e9c822e99 360 {
mbed_official 107:414e9c822e99 361 /* Sanity check arguments */
mbed_official 107:414e9c822e99 362 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 363 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 107:414e9c822e99 364 uint32_t vector = 0;
mbed_official 107:414e9c822e99 365
mbed_official 107:414e9c822e99 366 vector = get_serial_vector(obj);
mbed_official 107:414e9c822e99 367 irq_n = get_serial_irq_num(obj);
mbed_official 107:414e9c822e99 368
mbed_official 107:414e9c822e99 369 if (enable) {
mbed_official 107:414e9c822e99 370 switch (irq) {
mbed_official 107:414e9c822e99 371 case RxIrq:
mbed_official 107:414e9c822e99 372 usart_enable_interrupt(_USART(obj), US_IER_RXRDY);
mbed_official 107:414e9c822e99 373 break;
mbed_official 107:414e9c822e99 374 case TxIrq:
mbed_official 107:414e9c822e99 375 break;
mbed_official 107:414e9c822e99 376 }
mbed_official 107:414e9c822e99 377 NVIC_ClearPendingIRQ(irq_n);
mbed_official 107:414e9c822e99 378 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 379 NVIC_SetVector(irq_n, vector);
mbed_official 107:414e9c822e99 380 NVIC_EnableIRQ(irq_n);
mbed_official 107:414e9c822e99 381 } else {
mbed_official 107:414e9c822e99 382 switch (irq) {
mbed_official 107:414e9c822e99 383 case RxIrq:
mbed_official 107:414e9c822e99 384 usart_disable_interrupt(_USART(obj), US_IER_RXRDY);
mbed_official 107:414e9c822e99 385 break;
mbed_official 107:414e9c822e99 386 case TxIrq:
mbed_official 107:414e9c822e99 387 break;
mbed_official 107:414e9c822e99 388 }
mbed_official 107:414e9c822e99 389 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 390 }
mbed_official 107:414e9c822e99 391 }
mbed_official 107:414e9c822e99 392
mbed_official 107:414e9c822e99 393 static inline void uart_irq(Usart *const usart, uint32_t index)
mbed_official 107:414e9c822e99 394 {
mbed_official 107:414e9c822e99 395 MBED_ASSERT(usart != (void*)0);
mbed_official 107:414e9c822e99 396 uint32_t mask, status;
mbed_official 107:414e9c822e99 397 /* Read and clear mask. */
mbed_official 107:414e9c822e99 398 status = usart_get_status(usart);
mbed_official 107:414e9c822e99 399 mask = usart_get_interrupt_mask(usart);
mbed_official 107:414e9c822e99 400 status &= mask;
mbed_official 107:414e9c822e99 401
mbed_official 107:414e9c822e99 402 if (serial_irq_ids[index] != 0) {
mbed_official 107:414e9c822e99 403 if (status & US_IER_RXRDY) { /*For Receive Complete*/
mbed_official 107:414e9c822e99 404 if (irq_handler) {
mbed_official 107:414e9c822e99 405 irq_handler(serial_irq_ids[index], RxIrq);
mbed_official 107:414e9c822e99 406 }
mbed_official 107:414e9c822e99 407 }
mbed_official 107:414e9c822e99 408 }
mbed_official 107:414e9c822e99 409 }
mbed_official 107:414e9c822e99 410
mbed_official 107:414e9c822e99 411 void uart0_irq(void)
mbed_official 107:414e9c822e99 412 {
mbed_official 107:414e9c822e99 413 uart_irq(USART0, 0);
mbed_official 107:414e9c822e99 414 }
mbed_official 107:414e9c822e99 415
mbed_official 107:414e9c822e99 416 void uart1_irq(void)
mbed_official 107:414e9c822e99 417 {
mbed_official 107:414e9c822e99 418 uart_irq(USART1, 1);
mbed_official 107:414e9c822e99 419 }
mbed_official 107:414e9c822e99 420
mbed_official 107:414e9c822e99 421 void uart2_irq(void)
mbed_official 107:414e9c822e99 422 {
mbed_official 107:414e9c822e99 423 uart_irq(USART2, 2);
mbed_official 107:414e9c822e99 424 }
mbed_official 107:414e9c822e99 425
mbed_official 107:414e9c822e99 426 void uart3_irq(void)
mbed_official 107:414e9c822e99 427 {
mbed_official 107:414e9c822e99 428 uart_irq(USART3, 3);
mbed_official 107:414e9c822e99 429 }
mbed_official 107:414e9c822e99 430
mbed_official 107:414e9c822e99 431 void uart4_irq(void)
mbed_official 107:414e9c822e99 432 {
mbed_official 107:414e9c822e99 433 uart_irq(USART4, 4);
mbed_official 107:414e9c822e99 434 }
mbed_official 107:414e9c822e99 435
mbed_official 107:414e9c822e99 436 void uart5_irq(void)
mbed_official 107:414e9c822e99 437 {
mbed_official 107:414e9c822e99 438 uart_irq(USART5, 5);
mbed_official 107:414e9c822e99 439 }
mbed_official 107:414e9c822e99 440
mbed_official 107:414e9c822e99 441 void uart6_irq(void)
mbed_official 107:414e9c822e99 442 {
mbed_official 107:414e9c822e99 443 uart_irq(USART6, 6);
mbed_official 107:414e9c822e99 444 }
mbed_official 107:414e9c822e99 445
mbed_official 107:414e9c822e99 446 void uart7_irq(void)
mbed_official 107:414e9c822e99 447 {
mbed_official 107:414e9c822e99 448 uart_irq(USART7, 7);
mbed_official 107:414e9c822e99 449 }
mbed_official 107:414e9c822e99 450
mbed_official 107:414e9c822e99 451 static uint8_t serial_get_index(serial_t *obj)
mbed_official 107:414e9c822e99 452 {
mbed_official 107:414e9c822e99 453 /* Sanity check arguments */
mbed_official 107:414e9c822e99 454 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 455 switch ((int)pUSART_S(obj)) {
mbed_official 107:414e9c822e99 456 case UART_0:
mbed_official 107:414e9c822e99 457 return 0;
mbed_official 107:414e9c822e99 458 case UART_1:
mbed_official 107:414e9c822e99 459 return 1;
mbed_official 107:414e9c822e99 460 case UART_2:
mbed_official 107:414e9c822e99 461 return 2;
mbed_official 107:414e9c822e99 462 case UART_3:
mbed_official 107:414e9c822e99 463 return 3;
mbed_official 107:414e9c822e99 464 case UART_4:
mbed_official 107:414e9c822e99 465 return 4;
mbed_official 107:414e9c822e99 466 case UART_5:
mbed_official 107:414e9c822e99 467 return 5;
mbed_official 107:414e9c822e99 468 case UART_6:
mbed_official 107:414e9c822e99 469 return 6;
mbed_official 107:414e9c822e99 470 case UART_7:
mbed_official 107:414e9c822e99 471 return 7;
mbed_official 107:414e9c822e99 472 }
mbed_official 107:414e9c822e99 473 return 0;
mbed_official 107:414e9c822e99 474 }
mbed_official 107:414e9c822e99 475
mbed_official 107:414e9c822e99 476 static uint32_t get_serial_vector (serial_t *obj)
mbed_official 107:414e9c822e99 477 {
mbed_official 107:414e9c822e99 478 /* Sanity check arguments */
mbed_official 107:414e9c822e99 479 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 480 uint32_t vector = 0;
mbed_official 107:414e9c822e99 481 switch ((int)pUSART_S(obj)) {
mbed_official 107:414e9c822e99 482 case UART_0:
mbed_official 107:414e9c822e99 483 vector = (uint32_t)uart0_irq;
mbed_official 107:414e9c822e99 484 break;
mbed_official 107:414e9c822e99 485 case UART_1:
mbed_official 107:414e9c822e99 486 vector = (uint32_t)uart1_irq;
mbed_official 107:414e9c822e99 487 break;
mbed_official 107:414e9c822e99 488 case UART_2:
mbed_official 107:414e9c822e99 489 vector = (uint32_t)uart2_irq;
mbed_official 107:414e9c822e99 490 break;
mbed_official 107:414e9c822e99 491 case UART_3:
mbed_official 107:414e9c822e99 492 vector = (uint32_t)uart3_irq;
mbed_official 107:414e9c822e99 493 break;
mbed_official 107:414e9c822e99 494 case UART_4:
mbed_official 107:414e9c822e99 495 vector = (uint32_t)uart4_irq;
mbed_official 107:414e9c822e99 496 break;
mbed_official 107:414e9c822e99 497 case UART_5:
mbed_official 107:414e9c822e99 498 vector = (uint32_t)uart5_irq;
mbed_official 107:414e9c822e99 499 break;
mbed_official 107:414e9c822e99 500 case UART_6:
mbed_official 107:414e9c822e99 501 vector = (uint32_t)uart6_irq;
mbed_official 107:414e9c822e99 502 break;
mbed_official 107:414e9c822e99 503 case UART_7:
mbed_official 107:414e9c822e99 504 vector = (uint32_t)uart7_irq;
mbed_official 107:414e9c822e99 505 break;
mbed_official 107:414e9c822e99 506 }
mbed_official 107:414e9c822e99 507 return vector;
mbed_official 107:414e9c822e99 508 }
mbed_official 107:414e9c822e99 509
mbed_official 107:414e9c822e99 510 IRQn_Type get_serial_irq_num (serial_t *obj)
mbed_official 107:414e9c822e99 511 {
mbed_official 107:414e9c822e99 512 /* Sanity check arguments */
mbed_official 107:414e9c822e99 513 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 514 switch ((int)pUSART_S(obj)) {
mbed_official 107:414e9c822e99 515 case UART_0:
mbed_official 107:414e9c822e99 516 return FLEXCOM0_IRQn;
mbed_official 107:414e9c822e99 517 case UART_1:
mbed_official 107:414e9c822e99 518 return FLEXCOM1_IRQn;
mbed_official 107:414e9c822e99 519 case UART_2:
mbed_official 107:414e9c822e99 520 return FLEXCOM2_IRQn;
mbed_official 107:414e9c822e99 521 case UART_3:
mbed_official 107:414e9c822e99 522 return FLEXCOM3_IRQn;
mbed_official 107:414e9c822e99 523 case UART_4:
mbed_official 107:414e9c822e99 524 return FLEXCOM4_IRQn;
mbed_official 107:414e9c822e99 525 case UART_5:
mbed_official 107:414e9c822e99 526 return FLEXCOM5_IRQn;
mbed_official 107:414e9c822e99 527 case UART_6:
mbed_official 107:414e9c822e99 528 return FLEXCOM6_IRQn;
mbed_official 107:414e9c822e99 529 case UART_7:
mbed_official 107:414e9c822e99 530 return FLEXCOM7_IRQn;
mbed_official 107:414e9c822e99 531 default:
mbed_official 107:414e9c822e99 532 MBED_ASSERT(0);
mbed_official 107:414e9c822e99 533 }
mbed_official 107:414e9c822e99 534 return 0; /*Warning Suppression*/
mbed_official 107:414e9c822e99 535 }
mbed_official 107:414e9c822e99 536
mbed_official 107:414e9c822e99 537 /******************************************************************************
mbed_official 107:414e9c822e99 538 * READ/WRITE
mbed_official 107:414e9c822e99 539 ******************************************************************************/
mbed_official 107:414e9c822e99 540 int serial_getc(serial_t *obj)
mbed_official 107:414e9c822e99 541 {
mbed_official 107:414e9c822e99 542 /* Sanity check arguments */
mbed_official 107:414e9c822e99 543 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 544 while (!serial_readable(obj));
mbed_official 107:414e9c822e99 545 return (int)((_USART(obj)->US_RHR & US_RHR_RXCHR_Msk) & 0xFF);
mbed_official 107:414e9c822e99 546 }
mbed_official 107:414e9c822e99 547
mbed_official 107:414e9c822e99 548 void serial_putc(serial_t *obj, int c)
mbed_official 107:414e9c822e99 549 {
mbed_official 107:414e9c822e99 550 /* Sanity check arguments */
mbed_official 107:414e9c822e99 551 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 552 while (!serial_writable(obj));
mbed_official 107:414e9c822e99 553 _USART(obj)->US_THR = US_THR_TXCHR(c);
mbed_official 107:414e9c822e99 554 }
mbed_official 107:414e9c822e99 555
mbed_official 107:414e9c822e99 556 int serial_readable(serial_t *obj)
mbed_official 107:414e9c822e99 557 {
mbed_official 107:414e9c822e99 558 /* Sanity check arguments */
mbed_official 107:414e9c822e99 559 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 560 uint32_t status = 1;
mbed_official 107:414e9c822e99 561 if (!(_USART(obj)->US_CSR & US_CSR_RXRDY)) {
mbed_official 107:414e9c822e99 562 status = 0;
mbed_official 107:414e9c822e99 563 } else {
mbed_official 107:414e9c822e99 564 status = 1;
mbed_official 107:414e9c822e99 565 }
mbed_official 107:414e9c822e99 566 return status;
mbed_official 107:414e9c822e99 567 }
mbed_official 107:414e9c822e99 568
mbed_official 107:414e9c822e99 569 int serial_writable(serial_t *obj)
mbed_official 107:414e9c822e99 570 {
mbed_official 107:414e9c822e99 571 /* Sanity check arguments */
mbed_official 107:414e9c822e99 572 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 573 uint32_t status = 1;
mbed_official 107:414e9c822e99 574 if (!(_USART(obj)->US_CSR & US_CSR_TXRDY)) {
mbed_official 107:414e9c822e99 575 status = 0;
mbed_official 107:414e9c822e99 576 } else {
mbed_official 107:414e9c822e99 577 status = 1;
mbed_official 107:414e9c822e99 578 }
mbed_official 107:414e9c822e99 579 return status;
mbed_official 107:414e9c822e99 580 }
mbed_official 107:414e9c822e99 581
mbed_official 107:414e9c822e99 582 /************************************************************************************
mbed_official 107:414e9c822e99 583 * ASYNCHRONOUS HAL *
mbed_official 107:414e9c822e99 584 ************************************************************************************/
mbed_official 107:414e9c822e99 585
mbed_official 107:414e9c822e99 586
mbed_official 107:414e9c822e99 587 #if DEVICE_SERIAL_ASYNCH
mbed_official 107:414e9c822e99 588 /************************************
mbed_official 107:414e9c822e99 589 * HELPER FUNCTIONS *
mbed_official 107:414e9c822e99 590 ***********************************/
mbed_official 107:414e9c822e99 591
mbed_official 107:414e9c822e99 592 void serial_set_char_match(serial_t *obj, uint8_t char_match)
mbed_official 107:414e9c822e99 593 {
mbed_official 107:414e9c822e99 594 /* Sanity check arguments */
mbed_official 107:414e9c822e99 595 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 596 if (char_match != SERIAL_RESERVED_CHAR_MATCH) {
mbed_official 107:414e9c822e99 597 obj->char_match = char_match;
mbed_official 107:414e9c822e99 598 _USART(obj)->US_CMPR = (char_match & 0xFF);
mbed_official 107:414e9c822e99 599 usart_enable_interrupt(_USART(obj), US_IER_CMP);
mbed_official 107:414e9c822e99 600 }
mbed_official 107:414e9c822e99 601 }
mbed_official 107:414e9c822e99 602
mbed_official 107:414e9c822e99 603 /************************************
mbed_official 107:414e9c822e99 604 * TRANSFER FUNCTIONS *
mbed_official 107:414e9c822e99 605 ***********************************/
mbed_official 107:414e9c822e99 606 int serial_tx_asynch(serial_t *obj, const void *tx, size_t tx_length, uint8_t tx_width, uint32_t handler, uint32_t event, DMAUsage hint)
mbed_official 107:414e9c822e99 607 {
mbed_official 107:414e9c822e99 608 /* Sanity check arguments */
mbed_official 107:414e9c822e99 609 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 610 MBED_ASSERT(tx != (void*)0);
mbed_official 107:414e9c822e99 611 if(tx_length == 0) return 0;
mbed_official 107:414e9c822e99 612 Pdc *pdc_base;
mbed_official 107:414e9c822e99 613 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 107:414e9c822e99 614 pdc_packet_t packet;
mbed_official 107:414e9c822e99 615
mbed_official 107:414e9c822e99 616 pSERIAL_S(obj)->acttra = true; /* flag for active transmit transfer */
mbed_official 107:414e9c822e99 617
mbed_official 107:414e9c822e99 618 irq_n = get_serial_irq_num(obj);
mbed_official 107:414e9c822e99 619
mbed_official 107:414e9c822e99 620 /* Get board USART PDC base address and enable transmitter. */
mbed_official 107:414e9c822e99 621 pdc_base = usart_get_pdc_base(_USART(obj));
mbed_official 107:414e9c822e99 622 pdc_enable_transfer(pdc_base, PERIPH_PTCR_TXTEN);
mbed_official 107:414e9c822e99 623
mbed_official 107:414e9c822e99 624 packet.ul_addr = (uint32_t)tx;
mbed_official 107:414e9c822e99 625 packet.ul_size = (uint32_t)tx_length;
mbed_official 107:414e9c822e99 626
mbed_official 107:414e9c822e99 627 pdc_tx_init(pdc_base, &packet, NULL);
mbed_official 107:414e9c822e99 628 usart_enable_interrupt(_USART(obj), US_IER_TXBUFE);
mbed_official 107:414e9c822e99 629
mbed_official 107:414e9c822e99 630 NVIC_ClearPendingIRQ(irq_n);
mbed_official 107:414e9c822e99 631 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 632 NVIC_SetVector(irq_n, (uint32_t)handler);
mbed_official 107:414e9c822e99 633 NVIC_EnableIRQ(irq_n);
mbed_official 107:414e9c822e99 634
mbed_official 107:414e9c822e99 635 return 0;
mbed_official 107:414e9c822e99 636 }
mbed_official 107:414e9c822e99 637
mbed_official 107:414e9c822e99 638 void serial_rx_asynch(serial_t *obj, void *rx, size_t rx_length, uint8_t rx_width, uint32_t handler, uint32_t event, uint8_t char_match, DMAUsage hint)
mbed_official 107:414e9c822e99 639 {
mbed_official 107:414e9c822e99 640 /* Sanity check arguments */
mbed_official 107:414e9c822e99 641 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 642 MBED_ASSERT(rx != (void*)0);
mbed_official 107:414e9c822e99 643 if(rx_length == 0) return 0;
mbed_official 107:414e9c822e99 644 Pdc *pdc_base;
mbed_official 107:414e9c822e99 645 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 107:414e9c822e99 646 pdc_packet_t packet;
mbed_official 107:414e9c822e99 647
mbed_official 107:414e9c822e99 648 pSERIAL_S(obj)->actrec = true; /* flag for active receive transfer */
mbed_official 107:414e9c822e99 649 if (event == SERIAL_EVENT_RX_CHARACTER_MATCH) { /* if event is character match alone */
mbed_official 107:414e9c822e99 650 pSERIAL_S(obj)->events = SERIAL_EVENT_RX_CHARACTER_MATCH;
mbed_official 107:414e9c822e99 651 }
mbed_official 107:414e9c822e99 652
mbed_official 107:414e9c822e99 653 irq_n = get_serial_irq_num(obj);
mbed_official 107:414e9c822e99 654
mbed_official 107:414e9c822e99 655 serial_set_char_match(obj, char_match);
mbed_official 107:414e9c822e99 656
mbed_official 107:414e9c822e99 657 /* Get board USART PDC base address and enable transmitter. */
mbed_official 107:414e9c822e99 658 pdc_base = usart_get_pdc_base(_USART(obj));
mbed_official 107:414e9c822e99 659 pdc_enable_transfer(pdc_base, PERIPH_PTCR_RXTEN);
mbed_official 107:414e9c822e99 660 packet.ul_addr = (uint32_t)rx;
mbed_official 107:414e9c822e99 661 packet.ul_size = (uint32_t)rx_length;
mbed_official 107:414e9c822e99 662 pdc_rx_init(pdc_base, &packet, NULL);
mbed_official 107:414e9c822e99 663
mbed_official 107:414e9c822e99 664 usart_enable_interrupt(_USART(obj), (US_IER_RXBUFF | US_IER_OVRE | US_IER_FRAME | US_IER_PARE));
mbed_official 107:414e9c822e99 665
mbed_official 107:414e9c822e99 666 NVIC_ClearPendingIRQ(irq_n);
mbed_official 107:414e9c822e99 667 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 668 NVIC_SetVector(irq_n, (uint32_t)handler);
mbed_official 107:414e9c822e99 669 NVIC_EnableIRQ(irq_n);
mbed_official 107:414e9c822e99 670
mbed_official 107:414e9c822e99 671 }
mbed_official 107:414e9c822e99 672
mbed_official 107:414e9c822e99 673 uint8_t serial_tx_active(serial_t *obj)
mbed_official 107:414e9c822e99 674 {
mbed_official 107:414e9c822e99 675 /* Sanity check arguments */
mbed_official 107:414e9c822e99 676 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 677 return pSERIAL_S(obj)->acttra;
mbed_official 107:414e9c822e99 678 }
mbed_official 107:414e9c822e99 679
mbed_official 107:414e9c822e99 680 uint8_t serial_rx_active(serial_t *obj)
mbed_official 107:414e9c822e99 681 {
mbed_official 107:414e9c822e99 682 /* Sanity check arguments */
mbed_official 107:414e9c822e99 683 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 684 return pSERIAL_S(obj)->actrec;
mbed_official 107:414e9c822e99 685 }
mbed_official 107:414e9c822e99 686
mbed_official 107:414e9c822e99 687 int serial_tx_irq_handler_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 688 {
mbed_official 107:414e9c822e99 689 /* Sanity check arguments */
mbed_official 107:414e9c822e99 690 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 691 serial_tx_abort_asynch(obj);
mbed_official 107:414e9c822e99 692 return SERIAL_EVENT_TX_COMPLETE;
mbed_official 107:414e9c822e99 693 }
mbed_official 107:414e9c822e99 694 int serial_rx_irq_handler_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 695 {
mbed_official 107:414e9c822e99 696 /* Sanity check arguments */
mbed_official 107:414e9c822e99 697 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 698 uint32_t ul_status, ulmask;
mbed_official 107:414e9c822e99 699
mbed_official 107:414e9c822e99 700 /* Read USART Status. */
mbed_official 107:414e9c822e99 701 ul_status = usart_get_status(_USART(obj));
mbed_official 107:414e9c822e99 702 ulmask = usart_get_interrupt_mask(_USART(obj));
mbed_official 107:414e9c822e99 703 ul_status &= ulmask;
mbed_official 107:414e9c822e99 704
mbed_official 107:414e9c822e99 705 if (ul_status & US_CSR_OVRE) { /* Overrun Error */
mbed_official 107:414e9c822e99 706 usart_disable_interrupt(_USART(obj), US_IDR_OVRE);
mbed_official 107:414e9c822e99 707 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 708 return SERIAL_EVENT_RX_OVERFLOW;
mbed_official 107:414e9c822e99 709 }
mbed_official 107:414e9c822e99 710 if (ul_status & US_CSR_FRAME) { /* Framing Error */
mbed_official 107:414e9c822e99 711 usart_disable_interrupt(_USART(obj), US_IDR_FRAME);
mbed_official 107:414e9c822e99 712 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 713 return SERIAL_EVENT_RX_FRAMING_ERROR;
mbed_official 107:414e9c822e99 714 }
mbed_official 107:414e9c822e99 715 if (ul_status & US_CSR_PARE) { /* Parity Error */
mbed_official 107:414e9c822e99 716 usart_disable_interrupt(_USART(obj), US_IDR_PARE);
mbed_official 107:414e9c822e99 717 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 718 return SERIAL_EVENT_RX_PARITY_ERROR;
mbed_official 107:414e9c822e99 719 }
mbed_official 107:414e9c822e99 720 if ((ul_status & (US_IER_RXBUFF | US_IER_CMP)) == (US_IER_RXBUFF | US_IER_CMP)) { /* Character match in last character in transfer*/
mbed_official 107:414e9c822e99 721 usart_disable_interrupt(_USART(obj), US_IDR_CMP);
mbed_official 107:414e9c822e99 722 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 723 return SERIAL_EVENT_RX_COMPLETE|SERIAL_EVENT_RX_CHARACTER_MATCH;
mbed_official 107:414e9c822e99 724 }
mbed_official 107:414e9c822e99 725 if (ul_status & US_IER_CMP) { /* Character match */
mbed_official 107:414e9c822e99 726 usart_disable_interrupt(_USART(obj), US_IDR_CMP);
mbed_official 107:414e9c822e99 727 if (pSERIAL_S(obj)->events == SERIAL_EVENT_RX_CHARACTER_MATCH) { /*if character match is the only event abort transfer */
mbed_official 107:414e9c822e99 728 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 729 }
mbed_official 107:414e9c822e99 730 return SERIAL_EVENT_RX_CHARACTER_MATCH;
mbed_official 107:414e9c822e99 731 }
mbed_official 107:414e9c822e99 732 if (ul_status & US_IER_RXBUFF) { /* Reception Complete */
mbed_official 107:414e9c822e99 733 serial_rx_abort_asynch(obj);
mbed_official 107:414e9c822e99 734 return SERIAL_EVENT_RX_COMPLETE;
mbed_official 107:414e9c822e99 735 }
mbed_official 107:414e9c822e99 736 return 0;
mbed_official 107:414e9c822e99 737 }
mbed_official 107:414e9c822e99 738
mbed_official 107:414e9c822e99 739 int serial_irq_handler_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 740 {
mbed_official 107:414e9c822e99 741 /* Sanity check arguments */
mbed_official 107:414e9c822e99 742 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 743 uint32_t ul_status, ulmask;
mbed_official 107:414e9c822e99 744
mbed_official 107:414e9c822e99 745 /* Read USART Status. */
mbed_official 107:414e9c822e99 746 ul_status = usart_get_status(_USART(obj));
mbed_official 107:414e9c822e99 747 ulmask = usart_get_interrupt_mask(_USART(obj));
mbed_official 107:414e9c822e99 748
mbed_official 107:414e9c822e99 749 ul_status &= ulmask;
mbed_official 107:414e9c822e99 750
mbed_official 107:414e9c822e99 751 if (ul_status & (US_CSR_RXBUFF | US_CSR_OVRE | US_CSR_FRAME | US_CSR_PARE | US_IER_CMP)) {
mbed_official 107:414e9c822e99 752 return serial_rx_irq_handler_asynch(obj);
mbed_official 107:414e9c822e99 753 }
mbed_official 107:414e9c822e99 754 if (ul_status & US_CSR_TXBUFE) {
mbed_official 107:414e9c822e99 755 return serial_tx_irq_handler_asynch(obj);
mbed_official 107:414e9c822e99 756 }
mbed_official 107:414e9c822e99 757 return 0;
mbed_official 107:414e9c822e99 758 }
mbed_official 107:414e9c822e99 759
mbed_official 107:414e9c822e99 760 void serial_tx_abort_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 761 {
mbed_official 107:414e9c822e99 762 /* Sanity check arguments */
mbed_official 107:414e9c822e99 763 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 764 Pdc *pdc_base;
mbed_official 107:414e9c822e99 765 usart_disable_interrupt(_USART(obj), US_IER_TXBUFE);
mbed_official 107:414e9c822e99 766 pdc_base = usart_get_pdc_base(_USART(obj));
mbed_official 107:414e9c822e99 767 pdc_disable_transfer(pdc_base, PERIPH_PTCR_TXTEN);
mbed_official 107:414e9c822e99 768 pSERIAL_S(obj)->acttra = false;
mbed_official 107:414e9c822e99 769 }
mbed_official 107:414e9c822e99 770
mbed_official 107:414e9c822e99 771 void serial_rx_abort_asynch(serial_t *obj)
mbed_official 107:414e9c822e99 772 {
mbed_official 107:414e9c822e99 773 IRQn_Type irq_n = (IRQn_Type)0;
mbed_official 107:414e9c822e99 774 /* Sanity check arguments */
mbed_official 107:414e9c822e99 775 MBED_ASSERT(obj);
mbed_official 107:414e9c822e99 776 Pdc *pdc_base;
mbed_official 107:414e9c822e99 777 usart_disable_interrupt(_USART(obj), US_IER_RXBUFF);
mbed_official 107:414e9c822e99 778 pdc_base = usart_get_pdc_base(_USART(obj));
mbed_official 107:414e9c822e99 779 pdc_disable_transfer(pdc_base, PERIPH_PTCR_RXTEN);
mbed_official 107:414e9c822e99 780 irq_n = get_serial_irq_num(obj);
mbed_official 107:414e9c822e99 781 NVIC_ClearPendingIRQ(irq_n);
mbed_official 107:414e9c822e99 782 NVIC_DisableIRQ(irq_n);
mbed_official 107:414e9c822e99 783 pSERIAL_S(obj)->actrec = false;
mbed_official 107:414e9c822e99 784 }
mbed_official 107:414e9c822e99 785
mbed_official 107:414e9c822e99 786 #endif