mbed library sources. Supersedes mbed-src.

Dependents:   Hobbyking_Cheetah_Compact Hobbyking_Cheetah_Compact_DRV8323_14bit Hobbyking_Cheetah_Compact_DRV8323_V51_201907 HKC_MiniCheetah ... more

Fork of mbed-dev by mbed official

Committer:
benkatz
Date:
Mon Jul 30 20:31:44 2018 +0000
Revision:
181:36facd806e4a
Parent:
149:156823d33999
going on the robot.  fixed a dumb bug in float_to_uint

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /* mbed Microcontroller Library
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2006-2015 ARM Limited
<> 144:ef7eb2e8f9f7 3 *
<> 144:ef7eb2e8f9f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 5 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 6 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 13 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 14 * limitations under the License.
<> 144:ef7eb2e8f9f7 15 */
<> 144:ef7eb2e8f9f7 16 // math.h required for floating point operations for baud rate calculation
<> 144:ef7eb2e8f9f7 17 #include <math.h>
<> 144:ef7eb2e8f9f7 18 #include <stdio.h>
<> 144:ef7eb2e8f9f7 19 #include <string.h>
<> 144:ef7eb2e8f9f7 20 #include <stdlib.h>
<> 144:ef7eb2e8f9f7 21
<> 144:ef7eb2e8f9f7 22 #include "serial_api.h"
<> 144:ef7eb2e8f9f7 23 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 24 #include "pinmap.h"
<> 144:ef7eb2e8f9f7 25 #include "mbed_error.h"
<> 144:ef7eb2e8f9f7 26 #include "gpio_api.h"
<> 144:ef7eb2e8f9f7 27
<> 144:ef7eb2e8f9f7 28 /******************************************************************************
<> 144:ef7eb2e8f9f7 29 * INITIALIZATION
<> 144:ef7eb2e8f9f7 30 ******************************************************************************/
<> 144:ef7eb2e8f9f7 31
<> 144:ef7eb2e8f9f7 32 static const PinMap PinMap_UART_TX[] = {
<> 144:ef7eb2e8f9f7 33 {USBTX , UART_0, 0},
<> 144:ef7eb2e8f9f7 34 {XB_TX , UART_1, 0},
<> 144:ef7eb2e8f9f7 35 {SH0_TX , UART_2, 0},
<> 144:ef7eb2e8f9f7 36 {SH1_TX , UART_3, 0},
<> 144:ef7eb2e8f9f7 37 {NC , NC , 0}
<> 144:ef7eb2e8f9f7 38 };
<> 144:ef7eb2e8f9f7 39
<> 144:ef7eb2e8f9f7 40 static const PinMap PinMap_UART_RX[] = {
<> 144:ef7eb2e8f9f7 41 {USBRX , UART_0, 0},
<> 144:ef7eb2e8f9f7 42 {XB_RX , UART_1, 0},
<> 144:ef7eb2e8f9f7 43 {SH0_RX , UART_2, 0},
<> 144:ef7eb2e8f9f7 44 {SH1_RX , UART_3, 0},
<> 144:ef7eb2e8f9f7 45 {NC , NC , 0}
<> 144:ef7eb2e8f9f7 46 };
<> 144:ef7eb2e8f9f7 47
<> 144:ef7eb2e8f9f7 48 #define UART_NUM 4
<> 144:ef7eb2e8f9f7 49
<> 144:ef7eb2e8f9f7 50 static uart_irq_handler irq_handler;
<> 144:ef7eb2e8f9f7 51
<> 144:ef7eb2e8f9f7 52 int stdio_uart_inited = 0;
<> 144:ef7eb2e8f9f7 53 serial_t stdio_uart;
<> 144:ef7eb2e8f9f7 54
<> 144:ef7eb2e8f9f7 55 struct serial_global_data_s {
<> 144:ef7eb2e8f9f7 56 uint32_t serial_irq_id;
<> 144:ef7eb2e8f9f7 57 gpio_t sw_rts, sw_cts;
<> 144:ef7eb2e8f9f7 58 uint8_t count, rx_irq_set_flow, rx_irq_set_api;
<> 144:ef7eb2e8f9f7 59 };
<> 144:ef7eb2e8f9f7 60
<> 144:ef7eb2e8f9f7 61 static struct serial_global_data_s uart_data[UART_NUM];
<> 144:ef7eb2e8f9f7 62
<> 144:ef7eb2e8f9f7 63 void serial_init(serial_t *obj, PinName tx, PinName rx) {
<> 144:ef7eb2e8f9f7 64 int is_stdio_uart = 0;
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66 // determine the UART to use
<> 144:ef7eb2e8f9f7 67 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 68 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
<> 144:ef7eb2e8f9f7 69 UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);
<> 144:ef7eb2e8f9f7 70 if ((int)uart == NC) {
<> 144:ef7eb2e8f9f7 71 error("Serial pinout mapping failed");
<> 144:ef7eb2e8f9f7 72 }
<> 144:ef7eb2e8f9f7 73
<> 144:ef7eb2e8f9f7 74 obj->uart = (CMSDK_UART_TypeDef *)uart;
<> 144:ef7eb2e8f9f7 75 //set baud rate and enable Uart in normarl mode (RX and TX enabled)
<> 144:ef7eb2e8f9f7 76 switch (uart)
<> 144:ef7eb2e8f9f7 77 {
<> 144:ef7eb2e8f9f7 78 case UART_0:
<> 144:ef7eb2e8f9f7 79 {
<> 144:ef7eb2e8f9f7 80 CMSDK_UART0->CTRL = 0x00; // Disable UART when changing configuration
<> 144:ef7eb2e8f9f7 81 if((int)uart_tx != NC)
<> 144:ef7eb2e8f9f7 82 {
<> 144:ef7eb2e8f9f7 83 CMSDK_UART0->CTRL |= 0x01; // TX enable
<> 144:ef7eb2e8f9f7 84 } else {
<> 144:ef7eb2e8f9f7 85 CMSDK_UART0->CTRL &= 0xFFFE; // TX disable
<> 144:ef7eb2e8f9f7 86 }
<> 144:ef7eb2e8f9f7 87
<> 144:ef7eb2e8f9f7 88
<> 144:ef7eb2e8f9f7 89 if((int)uart_rx != NC)
<> 144:ef7eb2e8f9f7 90 {
<> 144:ef7eb2e8f9f7 91 CMSDK_UART0->CTRL |= 0x02; // RX enable
<> 144:ef7eb2e8f9f7 92 } else {
<> 144:ef7eb2e8f9f7 93 CMSDK_UART0->CTRL &= 0xFFFD; // RX disable
<> 144:ef7eb2e8f9f7 94 }
<> 144:ef7eb2e8f9f7 95
<> 144:ef7eb2e8f9f7 96 }
<> 144:ef7eb2e8f9f7 97 break;
<> 144:ef7eb2e8f9f7 98 case UART_1: //XBEE SOCKET UART
<> 144:ef7eb2e8f9f7 99 {
<> 144:ef7eb2e8f9f7 100 CMSDK_UART1->CTRL = 0x00; // Disable UART when changing configuration
<> 144:ef7eb2e8f9f7 101 if((int)tx != NC)
<> 144:ef7eb2e8f9f7 102 {
<> 144:ef7eb2e8f9f7 103 CMSDK_UART1->CTRL = 0x1; // TX enable
<> 144:ef7eb2e8f9f7 104 CMSDK_GPIO1->ALTFUNCSET |= 0x0100;
<> 144:ef7eb2e8f9f7 105 }
<> 144:ef7eb2e8f9f7 106 if((int)rx != NC)
<> 144:ef7eb2e8f9f7 107 {
<> 144:ef7eb2e8f9f7 108 CMSDK_UART1->CTRL |= 0x2; // RX enable
<> 144:ef7eb2e8f9f7 109 CMSDK_GPIO1->ALTFUNCSET |= 0x0080;
<> 144:ef7eb2e8f9f7 110 }
<> 144:ef7eb2e8f9f7 111 }
<> 144:ef7eb2e8f9f7 112 break;
<> 144:ef7eb2e8f9f7 113 case UART_2: //Sheild0 UART
<> 144:ef7eb2e8f9f7 114 {
<> 144:ef7eb2e8f9f7 115 CMSDK_UART3->CTRL = 0x00; // Disable UART when changing configuration
<> 144:ef7eb2e8f9f7 116 if((int)tx != NC)
<> 144:ef7eb2e8f9f7 117 {
<> 144:ef7eb2e8f9f7 118 CMSDK_UART3->CTRL = 0x1; // TX enable
<> 144:ef7eb2e8f9f7 119 CMSDK_GPIO0->ALTFUNCSET |= 0x0010;
<> 144:ef7eb2e8f9f7 120 }
<> 144:ef7eb2e8f9f7 121 if((int)rx != NC)
<> 144:ef7eb2e8f9f7 122 {
<> 144:ef7eb2e8f9f7 123 CMSDK_UART3->CTRL |= 0x2; // RX enable
<> 144:ef7eb2e8f9f7 124 CMSDK_GPIO0->ALTFUNCSET |= 0x0001;
<> 144:ef7eb2e8f9f7 125 }
<> 144:ef7eb2e8f9f7 126 }
<> 144:ef7eb2e8f9f7 127 break;
<> 144:ef7eb2e8f9f7 128 case UART_3: //Sheild1 UART
<> 144:ef7eb2e8f9f7 129 {
<> 144:ef7eb2e8f9f7 130 CMSDK_UART4->CTRL = 0x00; // Disable UART when changing configuration
<> 144:ef7eb2e8f9f7 131 if((int)tx != NC)
<> 144:ef7eb2e8f9f7 132 {
<> 144:ef7eb2e8f9f7 133 CMSDK_UART4->CTRL = 0x1; // TX enable
<> 144:ef7eb2e8f9f7 134 CMSDK_GPIO1->ALTFUNCSET |= 0x4000;
<> 144:ef7eb2e8f9f7 135 }
<> 144:ef7eb2e8f9f7 136 if((int)rx != NC)
<> 144:ef7eb2e8f9f7 137 {
<> 144:ef7eb2e8f9f7 138 CMSDK_UART4->CTRL |= 0x2; // RX enable
<> 144:ef7eb2e8f9f7 139 CMSDK_GPIO1->ALTFUNCSET |= 0x0400;
<> 144:ef7eb2e8f9f7 140 }
<> 144:ef7eb2e8f9f7 141 }
<> 144:ef7eb2e8f9f7 142 break;
<> 144:ef7eb2e8f9f7 143 }
<> 144:ef7eb2e8f9f7 144
<> 144:ef7eb2e8f9f7 145 // set default baud rate and format
<> 144:ef7eb2e8f9f7 146 serial_baud (obj, 9600);
<> 144:ef7eb2e8f9f7 147
<> 144:ef7eb2e8f9f7 148 // pinout the chosen uart
<> 144:ef7eb2e8f9f7 149 pinmap_pinout(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 150 pinmap_pinout(rx, PinMap_UART_RX);
<> 144:ef7eb2e8f9f7 151
<> 144:ef7eb2e8f9f7 152 switch (uart) {
<> 144:ef7eb2e8f9f7 153 case UART_0: obj->index = 0; break;
<> 144:ef7eb2e8f9f7 154 case UART_1: obj->index = 1; break;
<> 144:ef7eb2e8f9f7 155 case UART_2: obj->index = 2; break;
<> 144:ef7eb2e8f9f7 156 case UART_3: obj->index = 3; break;
<> 144:ef7eb2e8f9f7 157 }
<> 144:ef7eb2e8f9f7 158 uart_data[obj->index].sw_rts.pin = NC;
<> 144:ef7eb2e8f9f7 159 uart_data[obj->index].sw_cts.pin = NC;
<> 144:ef7eb2e8f9f7 160 serial_set_flow_control(obj, FlowControlNone, NC, NC);
<> 144:ef7eb2e8f9f7 161
<> 144:ef7eb2e8f9f7 162 is_stdio_uart = (uart == STDIO_UART) ? (1) : (0);
<> 144:ef7eb2e8f9f7 163
<> 144:ef7eb2e8f9f7 164 if (is_stdio_uart) {
<> 144:ef7eb2e8f9f7 165 stdio_uart_inited = 1;
<> 144:ef7eb2e8f9f7 166 memcpy(&stdio_uart, obj, sizeof(serial_t));
<> 144:ef7eb2e8f9f7 167 }
<> 144:ef7eb2e8f9f7 168 }
<> 144:ef7eb2e8f9f7 169
<> 144:ef7eb2e8f9f7 170 void serial_free(serial_t *obj) {
<> 144:ef7eb2e8f9f7 171 uart_data[obj->index].serial_irq_id = 0;
<> 144:ef7eb2e8f9f7 172 }
<> 144:ef7eb2e8f9f7 173
<> 144:ef7eb2e8f9f7 174 // serial_baud
<> 144:ef7eb2e8f9f7 175 // set the baud rate, taking in to account the current SystemFrequency
<> 144:ef7eb2e8f9f7 176 void serial_baud(serial_t *obj, int baudrate) {
<> 144:ef7eb2e8f9f7 177 // The MPS2 has a simple divider to control the baud rate. The formula is:
<> 144:ef7eb2e8f9f7 178 //
<> 144:ef7eb2e8f9f7 179 // Baudrate = PCLK / BAUDDIV
<> 144:ef7eb2e8f9f7 180 //
<> 144:ef7eb2e8f9f7 181 // PCLK = 25 Mhz
<> 144:ef7eb2e8f9f7 182 // so for a desired baud rate of 9600
<> 144:ef7eb2e8f9f7 183 // 25000000 / 9600 = 2604
<> 144:ef7eb2e8f9f7 184 //
<> 144:ef7eb2e8f9f7 185 //check to see if minimum baud value entered
<> 144:ef7eb2e8f9f7 186 int baudrate_div = 0;
<> 144:ef7eb2e8f9f7 187 baudrate_div = SystemCoreClock / baudrate;
<> 144:ef7eb2e8f9f7 188 if(baudrate >= 16){
<> 144:ef7eb2e8f9f7 189 switch ((int)obj->uart) {
<> 144:ef7eb2e8f9f7 190 case UART_0: CMSDK_UART0->BAUDDIV = baudrate_div; break;
<> 144:ef7eb2e8f9f7 191 case UART_1: CMSDK_UART1->BAUDDIV = baudrate_div; break;
<> 144:ef7eb2e8f9f7 192 case UART_2: CMSDK_UART3->BAUDDIV = baudrate_div; break;
<> 144:ef7eb2e8f9f7 193 case UART_3: CMSDK_UART4->BAUDDIV = baudrate_div; break;
<> 144:ef7eb2e8f9f7 194 default: error("serial_baud"); break;
<> 144:ef7eb2e8f9f7 195 }
<> 144:ef7eb2e8f9f7 196 } else {
<> 144:ef7eb2e8f9f7 197 error("serial_baud");
<> 144:ef7eb2e8f9f7 198 }
<> 144:ef7eb2e8f9f7 199
<> 144:ef7eb2e8f9f7 200 }
<> 144:ef7eb2e8f9f7 201
<> 144:ef7eb2e8f9f7 202 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits) {
<> 144:ef7eb2e8f9f7 203 }
<> 144:ef7eb2e8f9f7 204
<> 144:ef7eb2e8f9f7 205 /******************************************************************************
<> 144:ef7eb2e8f9f7 206 * INTERRUPTS HANDLING
<> 144:ef7eb2e8f9f7 207 ******************************************************************************/
<> 144:ef7eb2e8f9f7 208 static inline void uart_irq(uint32_t intstatus, uint32_t index, CMSDK_UART_TypeDef *puart) {
<> 144:ef7eb2e8f9f7 209 SerialIrq irq_type;
<> 144:ef7eb2e8f9f7 210 switch (intstatus)
<> 144:ef7eb2e8f9f7 211 {
<> 144:ef7eb2e8f9f7 212 case 1:
<> 144:ef7eb2e8f9f7 213 {
<> 144:ef7eb2e8f9f7 214 irq_type = TxIrq;
<> 144:ef7eb2e8f9f7 215 }
<> 144:ef7eb2e8f9f7 216 break;
<> 144:ef7eb2e8f9f7 217
<> 144:ef7eb2e8f9f7 218 case 2:
<> 144:ef7eb2e8f9f7 219 {
<> 144:ef7eb2e8f9f7 220 irq_type = RxIrq;
<> 144:ef7eb2e8f9f7 221 }
<> 144:ef7eb2e8f9f7 222 break;
<> 144:ef7eb2e8f9f7 223
<> 144:ef7eb2e8f9f7 224 default: return;
<> 144:ef7eb2e8f9f7 225 } /* End of Switch */
<> 144:ef7eb2e8f9f7 226
<> 144:ef7eb2e8f9f7 227 if ((RxIrq == irq_type) && (NC != uart_data[index].sw_rts.pin))
<> 144:ef7eb2e8f9f7 228 {
<> 144:ef7eb2e8f9f7 229 gpio_write(&uart_data[index].sw_rts, 1);
<> 144:ef7eb2e8f9f7 230 // Disable interrupt if it wasn't enabled by other part of the application
<> 144:ef7eb2e8f9f7 231 if (!uart_data[index].rx_irq_set_api)
<> 144:ef7eb2e8f9f7 232 {
<> 144:ef7eb2e8f9f7 233 /* Disable Rx interrupt */
<> 144:ef7eb2e8f9f7 234 puart->CTRL &= ~(CMSDK_UART_CTRL_RXIRQEN_Msk);
<> 144:ef7eb2e8f9f7 235 }
<> 144:ef7eb2e8f9f7 236 }
<> 144:ef7eb2e8f9f7 237
<> 144:ef7eb2e8f9f7 238 if (uart_data[index].serial_irq_id != 0)
<> 144:ef7eb2e8f9f7 239 {
<> 144:ef7eb2e8f9f7 240 if ((irq_type != RxIrq) || (uart_data[index].rx_irq_set_api))
<> 144:ef7eb2e8f9f7 241 {
<> 144:ef7eb2e8f9f7 242 irq_handler(uart_data[index].serial_irq_id, irq_type);
<> 144:ef7eb2e8f9f7 243 }
<> 144:ef7eb2e8f9f7 244 }
<> 144:ef7eb2e8f9f7 245
<> 144:ef7eb2e8f9f7 246 if( irq_type == TxIrq )
<> 144:ef7eb2e8f9f7 247 {
<> 144:ef7eb2e8f9f7 248 /* Clear the TX interrupt Flag */
<> 144:ef7eb2e8f9f7 249 puart->INTCLEAR |= 0x01;
<> 144:ef7eb2e8f9f7 250 }
<> 144:ef7eb2e8f9f7 251 else
<> 144:ef7eb2e8f9f7 252 {
<> 144:ef7eb2e8f9f7 253 /* Clear the Rx interupt Flag */
<> 144:ef7eb2e8f9f7 254 puart->INTCLEAR |= 0x02;
<> 144:ef7eb2e8f9f7 255 }
<> 144:ef7eb2e8f9f7 256 }
<> 144:ef7eb2e8f9f7 257
<> 144:ef7eb2e8f9f7 258 void uart0_irq() {uart_irq(CMSDK_UART0->INTSTATUS & 0x3, 0, (CMSDK_UART_TypeDef*)CMSDK_UART0);}
<> 144:ef7eb2e8f9f7 259 void uart1_irq() {uart_irq(CMSDK_UART1->INTSTATUS & 0x3, 1, (CMSDK_UART_TypeDef*)CMSDK_UART1);}
<> 144:ef7eb2e8f9f7 260 void uart2_irq() {uart_irq(CMSDK_UART3->INTSTATUS & 0x3, 2, (CMSDK_UART_TypeDef*)CMSDK_UART3);}
<> 144:ef7eb2e8f9f7 261 void uart3_irq() {uart_irq(CMSDK_UART4->INTSTATUS & 0x3, 3, (CMSDK_UART_TypeDef*)CMSDK_UART4);}
<> 144:ef7eb2e8f9f7 262
<> 144:ef7eb2e8f9f7 263 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
<> 144:ef7eb2e8f9f7 264 irq_handler = handler;
<> 144:ef7eb2e8f9f7 265 uart_data[obj->index].serial_irq_id = id;
<> 144:ef7eb2e8f9f7 266 }
<> 144:ef7eb2e8f9f7 267
<> 144:ef7eb2e8f9f7 268 static void serial_irq_set_internal(serial_t *obj, SerialIrq irq, uint32_t enable) {
<> 144:ef7eb2e8f9f7 269 /* Declare a variable of type IRQn, initialise to 0 */
<> 144:ef7eb2e8f9f7 270 IRQn_Type irq_n = (IRQn_Type)0;
<> 144:ef7eb2e8f9f7 271 uint32_t vector = 0;
<> 144:ef7eb2e8f9f7 272 switch ((int)obj->uart)
<> 144:ef7eb2e8f9f7 273 {
<> 144:ef7eb2e8f9f7 274 case UART_0:
<> 144:ef7eb2e8f9f7 275 {
<> 144:ef7eb2e8f9f7 276 irq_n = (( irq == TxIrq ) ? UARTTX0_IRQn : UARTRX0_IRQn);
<> 144:ef7eb2e8f9f7 277 vector = (uint32_t)&uart0_irq;
<> 144:ef7eb2e8f9f7 278 }
<> 144:ef7eb2e8f9f7 279 break;
<> 144:ef7eb2e8f9f7 280
<> 144:ef7eb2e8f9f7 281 case UART_1:
<> 144:ef7eb2e8f9f7 282 {
<> 144:ef7eb2e8f9f7 283 irq_n = (( irq == TxIrq ) ? UARTTX1_IRQn : UARTRX1_IRQn);
<> 144:ef7eb2e8f9f7 284 vector = (uint32_t)&uart1_irq;
<> 144:ef7eb2e8f9f7 285 }
<> 144:ef7eb2e8f9f7 286 break;
<> 144:ef7eb2e8f9f7 287 case UART_2:
<> 144:ef7eb2e8f9f7 288 {
<> 144:ef7eb2e8f9f7 289 irq_n = (( irq == TxIrq ) ? UARTTX3_IRQn : UARTRX3_IRQn);
<> 144:ef7eb2e8f9f7 290 vector = (uint32_t)&uart2_irq;
<> 144:ef7eb2e8f9f7 291 }
<> 144:ef7eb2e8f9f7 292 break;
<> 144:ef7eb2e8f9f7 293 case UART_3:
<> 144:ef7eb2e8f9f7 294 {
<> 144:ef7eb2e8f9f7 295 irq_n = (( irq == TxIrq ) ? UARTTX4_IRQn : UARTRX4_IRQn);
<> 144:ef7eb2e8f9f7 296 vector = (uint32_t)&uart3_irq;
<> 144:ef7eb2e8f9f7 297 }
<> 144:ef7eb2e8f9f7 298 break;
<> 144:ef7eb2e8f9f7 299 }
<> 144:ef7eb2e8f9f7 300
<> 144:ef7eb2e8f9f7 301 if (enable)
<> 144:ef7eb2e8f9f7 302 {
<> 144:ef7eb2e8f9f7 303 if( irq == TxIrq )
<> 144:ef7eb2e8f9f7 304 {
<> 144:ef7eb2e8f9f7 305 /* Transmit IRQ, set appripriate enable */
<> 144:ef7eb2e8f9f7 306
<> 144:ef7eb2e8f9f7 307 /* set TX interrupt enable in CTRL REG */
<> 144:ef7eb2e8f9f7 308 obj->uart->CTRL |= CMSDK_UART_CTRL_TXIRQEN_Msk;
<> 144:ef7eb2e8f9f7 309 }
<> 144:ef7eb2e8f9f7 310 else
<> 144:ef7eb2e8f9f7 311 {
<> 144:ef7eb2e8f9f7 312 /* set Rx interrupt on in CTRL REG */
<> 144:ef7eb2e8f9f7 313 obj->uart->CTRL |= CMSDK_UART_CTRL_RXIRQEN_Msk;
<> 144:ef7eb2e8f9f7 314 }
<> 144:ef7eb2e8f9f7 315 NVIC_SetVector(irq_n, vector);
<> 144:ef7eb2e8f9f7 316 NVIC_EnableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 317
<> 144:ef7eb2e8f9f7 318 }
<> 144:ef7eb2e8f9f7 319 else
<> 144:ef7eb2e8f9f7 320 { /* Disable IRQ */
<> 144:ef7eb2e8f9f7 321
<> 144:ef7eb2e8f9f7 322 obj->uart->CTRL &= ~(1 << (irq + 2));
<> 144:ef7eb2e8f9f7 323
<> 144:ef7eb2e8f9f7 324 NVIC_DisableIRQ(irq_n);
<> 144:ef7eb2e8f9f7 325 }
<> 144:ef7eb2e8f9f7 326 }
<> 144:ef7eb2e8f9f7 327
<> 144:ef7eb2e8f9f7 328 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
<> 144:ef7eb2e8f9f7 329 serial_irq_set_internal(obj, irq, enable);
<> 144:ef7eb2e8f9f7 330 }
<> 144:ef7eb2e8f9f7 331
<> 144:ef7eb2e8f9f7 332 /******************************************************************************
<> 144:ef7eb2e8f9f7 333 * READ/WRITE
<> 144:ef7eb2e8f9f7 334 ******************************************************************************/
<> 144:ef7eb2e8f9f7 335 int serial_getc(serial_t *obj) {
<> 144:ef7eb2e8f9f7 336 while (serial_readable(obj) == 0);
<> 144:ef7eb2e8f9f7 337 int data = obj->uart->DATA;
<> 144:ef7eb2e8f9f7 338 return data;
<> 144:ef7eb2e8f9f7 339 }
<> 144:ef7eb2e8f9f7 340
<> 144:ef7eb2e8f9f7 341 void serial_putc(serial_t *obj, int c) {
<> 144:ef7eb2e8f9f7 342 while (serial_writable(obj));
<> 144:ef7eb2e8f9f7 343 obj->uart->DATA = c;
<> 144:ef7eb2e8f9f7 344 }
<> 144:ef7eb2e8f9f7 345
<> 144:ef7eb2e8f9f7 346 int serial_readable(serial_t *obj) {
<> 144:ef7eb2e8f9f7 347 return obj->uart->STATE & 0x2;
<> 144:ef7eb2e8f9f7 348 }
<> 144:ef7eb2e8f9f7 349
<> 144:ef7eb2e8f9f7 350 int serial_writable(serial_t *obj) {
<> 144:ef7eb2e8f9f7 351 return obj->uart->STATE & 0x1;
<> 144:ef7eb2e8f9f7 352 }
<> 144:ef7eb2e8f9f7 353
<> 144:ef7eb2e8f9f7 354 void serial_clear(serial_t *obj) {
<> 144:ef7eb2e8f9f7 355 obj->uart->DATA = 0x00;
<> 144:ef7eb2e8f9f7 356 }
<> 144:ef7eb2e8f9f7 357
<> 144:ef7eb2e8f9f7 358 void serial_pinout_tx(PinName tx) {
<> 144:ef7eb2e8f9f7 359 pinmap_pinout(tx, PinMap_UART_TX);
<> 144:ef7eb2e8f9f7 360 }
<> 144:ef7eb2e8f9f7 361
<> 144:ef7eb2e8f9f7 362 void serial_break_set(serial_t *obj) {
<> 144:ef7eb2e8f9f7 363 }
<> 144:ef7eb2e8f9f7 364
<> 144:ef7eb2e8f9f7 365 void serial_break_clear(serial_t *obj) {
<> 144:ef7eb2e8f9f7 366 }
<> 144:ef7eb2e8f9f7 367 void serial_set_flow_control(serial_t *obj, FlowControl type, PinName rxflow, PinName txflow) {
<> 144:ef7eb2e8f9f7 368 }
<> 144:ef7eb2e8f9f7 369