mbed-os

Dependents:   cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more

Committer:
be_bryan
Date:
Mon Dec 11 17:54:04 2017 +0000
Revision:
0:b74591d5ab33
motor ++

Who changed what in which revision?

UserRevisionLine numberNew contents of line
be_bryan 0:b74591d5ab33 1 /* mbed Microcontroller Library
be_bryan 0:b74591d5ab33 2 * (C)Copyright TOSHIBA ELECTRONIC DEVICES & STORAGE CORPORATION 2017 All rights reserved
be_bryan 0:b74591d5ab33 3 *
be_bryan 0:b74591d5ab33 4 * Licensed under the Apache License, Version 2.0 (the "License");
be_bryan 0:b74591d5ab33 5 * you may not use this file except in compliance with the License.
be_bryan 0:b74591d5ab33 6 * You may obtain a copy of the License at
be_bryan 0:b74591d5ab33 7 *
be_bryan 0:b74591d5ab33 8 * http://www.apache.org/licenses/LICENSE-2.0
be_bryan 0:b74591d5ab33 9 *
be_bryan 0:b74591d5ab33 10 * Unless required by applicable law or agreed to in writing, software
be_bryan 0:b74591d5ab33 11 * distributed under the License is distributed on an "AS IS" BASIS,
be_bryan 0:b74591d5ab33 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
be_bryan 0:b74591d5ab33 13 * See the License for the specific language governing permissions and
be_bryan 0:b74591d5ab33 14 * limitations under the License.
be_bryan 0:b74591d5ab33 15 */
be_bryan 0:b74591d5ab33 16 #include <string.h>
be_bryan 0:b74591d5ab33 17 #include "serial_api.h"
be_bryan 0:b74591d5ab33 18 #include "PeripheralNames.h"
be_bryan 0:b74591d5ab33 19 #include "pinmap.h"
be_bryan 0:b74591d5ab33 20
be_bryan 0:b74591d5ab33 21 #define UART_NUM 2
be_bryan 0:b74591d5ab33 22
be_bryan 0:b74591d5ab33 23 static const PinMap PinMap_UART_TX[] = {
be_bryan 0:b74591d5ab33 24 {PC2, SERIAL_0, PIN_DATA(1, 1)},
be_bryan 0:b74591d5ab33 25 {PE2, SERIAL_1, PIN_DATA(1, 1)},
be_bryan 0:b74591d5ab33 26 {NC, NC, 0}
be_bryan 0:b74591d5ab33 27 };
be_bryan 0:b74591d5ab33 28
be_bryan 0:b74591d5ab33 29 static const PinMap PinMap_UART_RX[] = {
be_bryan 0:b74591d5ab33 30 {PC3, SERIAL_0, PIN_DATA(1, 0)},
be_bryan 0:b74591d5ab33 31 {PE1, SERIAL_1, PIN_DATA(1, 0)},
be_bryan 0:b74591d5ab33 32 {NC, NC, 0}
be_bryan 0:b74591d5ab33 33 };
be_bryan 0:b74591d5ab33 34
be_bryan 0:b74591d5ab33 35 static int serial_irq_ids[UART_NUM] = {0};
be_bryan 0:b74591d5ab33 36 static uart_irq_handler irq_handler;
be_bryan 0:b74591d5ab33 37
be_bryan 0:b74591d5ab33 38 int stdio_uart_inited = 0;
be_bryan 0:b74591d5ab33 39 serial_t stdio_uart;
be_bryan 0:b74591d5ab33 40
be_bryan 0:b74591d5ab33 41 void serial_init(serial_t *obj, PinName tx, PinName rx)
be_bryan 0:b74591d5ab33 42 {
be_bryan 0:b74591d5ab33 43 int is_stdio_uart = 0;
be_bryan 0:b74591d5ab33 44
be_bryan 0:b74591d5ab33 45 UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
be_bryan 0:b74591d5ab33 46 UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
be_bryan 0:b74591d5ab33 47 UARTName uart_name = (UARTName)pinmap_merge(uart_tx, uart_rx);
be_bryan 0:b74591d5ab33 48 MBED_ASSERT((int)uart_name != NC);
be_bryan 0:b74591d5ab33 49
be_bryan 0:b74591d5ab33 50 obj->index = uart_name;
be_bryan 0:b74591d5ab33 51 // Initialize UART instance
be_bryan 0:b74591d5ab33 52 switch (uart_name) {
be_bryan 0:b74591d5ab33 53 case SERIAL_0:
be_bryan 0:b74591d5ab33 54 CG_SetFcPeriphA(CG_FC_PERIPH_SIO0, ENABLE);
be_bryan 0:b74591d5ab33 55 obj->UARTx = UART0;
be_bryan 0:b74591d5ab33 56 break;
be_bryan 0:b74591d5ab33 57 case SERIAL_1:
be_bryan 0:b74591d5ab33 58 CG_SetFcPeriphB(CG_FC_PERIPH_SIO1, ENABLE);
be_bryan 0:b74591d5ab33 59 obj->UARTx = UART1;
be_bryan 0:b74591d5ab33 60 break;
be_bryan 0:b74591d5ab33 61 default:
be_bryan 0:b74591d5ab33 62 break;
be_bryan 0:b74591d5ab33 63 }
be_bryan 0:b74591d5ab33 64
be_bryan 0:b74591d5ab33 65 obj->uart_config.BaudRate = 9600;
be_bryan 0:b74591d5ab33 66 obj->uart_config.DataBits = UART_DATA_BITS_8;
be_bryan 0:b74591d5ab33 67 obj->uart_config.StopBits = UART_STOP_BITS_1;
be_bryan 0:b74591d5ab33 68 obj->uart_config.Parity = UART_NO_PARITY;
be_bryan 0:b74591d5ab33 69 obj->uart_config.FlowCtrl = UART_NONE_FLOW_CTRL;
be_bryan 0:b74591d5ab33 70
be_bryan 0:b74591d5ab33 71 if (tx != NC && rx != NC) {
be_bryan 0:b74591d5ab33 72 obj->uart_config.Mode = UART_ENABLE_RX | UART_ENABLE_TX;
be_bryan 0:b74591d5ab33 73 } else {
be_bryan 0:b74591d5ab33 74 if (tx != NC) {
be_bryan 0:b74591d5ab33 75 obj->uart_config.Mode = UART_ENABLE_TX;
be_bryan 0:b74591d5ab33 76 } else {
be_bryan 0:b74591d5ab33 77 if (rx != NC) {
be_bryan 0:b74591d5ab33 78 obj->uart_config.Mode = UART_ENABLE_RX;
be_bryan 0:b74591d5ab33 79 }
be_bryan 0:b74591d5ab33 80 }
be_bryan 0:b74591d5ab33 81 }
be_bryan 0:b74591d5ab33 82
be_bryan 0:b74591d5ab33 83 // Pinout the chosen uart
be_bryan 0:b74591d5ab33 84 pinmap_pinout(tx, PinMap_UART_TX);
be_bryan 0:b74591d5ab33 85 pinmap_pinout(rx, PinMap_UART_RX);
be_bryan 0:b74591d5ab33 86 // Initialize UART configure
be_bryan 0:b74591d5ab33 87 UART_Enable(obj->UARTx);
be_bryan 0:b74591d5ab33 88 UART_SetIdleMode(obj->UARTx, ENABLE);
be_bryan 0:b74591d5ab33 89 UART_Init(obj->UARTx, &obj->uart_config);
be_bryan 0:b74591d5ab33 90 is_stdio_uart = (uart_name == STDIO_UART) ? (1) : (0);
be_bryan 0:b74591d5ab33 91 if (is_stdio_uart) {
be_bryan 0:b74591d5ab33 92 stdio_uart_inited = 1;
be_bryan 0:b74591d5ab33 93 memcpy(&stdio_uart, obj, sizeof(serial_t));
be_bryan 0:b74591d5ab33 94 }
be_bryan 0:b74591d5ab33 95 }
be_bryan 0:b74591d5ab33 96
be_bryan 0:b74591d5ab33 97 void serial_free(serial_t *obj)
be_bryan 0:b74591d5ab33 98 {
be_bryan 0:b74591d5ab33 99 // Disable UART
be_bryan 0:b74591d5ab33 100 UART_Disable(obj->UARTx);
be_bryan 0:b74591d5ab33 101 UART_SWReset(obj->UARTx);
be_bryan 0:b74591d5ab33 102 // Set information of object to invalid
be_bryan 0:b74591d5ab33 103 obj->uart_config.BaudRate = 0;
be_bryan 0:b74591d5ab33 104 obj->uart_config.DataBits = 0;
be_bryan 0:b74591d5ab33 105 obj->uart_config.StopBits = 0;
be_bryan 0:b74591d5ab33 106 obj->uart_config.Parity = 0;
be_bryan 0:b74591d5ab33 107 obj->uart_config.Mode = 0;
be_bryan 0:b74591d5ab33 108 obj->uart_config.FlowCtrl = 0;
be_bryan 0:b74591d5ab33 109 }
be_bryan 0:b74591d5ab33 110
be_bryan 0:b74591d5ab33 111 void serial_baud(serial_t *obj, int baudrate)
be_bryan 0:b74591d5ab33 112 {
be_bryan 0:b74591d5ab33 113 obj->uart_config.BaudRate = baudrate;
be_bryan 0:b74591d5ab33 114 UART_Init(obj->UARTx, &obj->uart_config);
be_bryan 0:b74591d5ab33 115 }
be_bryan 0:b74591d5ab33 116
be_bryan 0:b74591d5ab33 117 void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_bits)
be_bryan 0:b74591d5ab33 118 {
be_bryan 0:b74591d5ab33 119 // 0: 1 stop bits, 1: 2 stop bits
be_bryan 0:b74591d5ab33 120 MBED_ASSERT((stop_bits == 1) || (stop_bits == 2));
be_bryan 0:b74591d5ab33 121 MBED_ASSERT((parity == ParityNone) || (parity == ParityOdd) || (parity == ParityEven) ||
be_bryan 0:b74591d5ab33 122 (parity == ParityForced1) || (parity == ParityForced0));
be_bryan 0:b74591d5ab33 123 // 0: 7 data bits ... 2: 9 data bits
be_bryan 0:b74591d5ab33 124 MBED_ASSERT((data_bits > 6) && (data_bits < 10));
be_bryan 0:b74591d5ab33 125
be_bryan 0:b74591d5ab33 126 obj->uart_config.DataBits = data_bits;
be_bryan 0:b74591d5ab33 127 obj->uart_config.StopBits = stop_bits;
be_bryan 0:b74591d5ab33 128 obj->uart_config.Parity = parity;
be_bryan 0:b74591d5ab33 129 UART_Init(obj->UARTx, &obj->uart_config);
be_bryan 0:b74591d5ab33 130 }
be_bryan 0:b74591d5ab33 131
be_bryan 0:b74591d5ab33 132 // INTERRUPTS HANDLING
be_bryan 0:b74591d5ab33 133 void INTTX0_IRQHandler(void)
be_bryan 0:b74591d5ab33 134 {
be_bryan 0:b74591d5ab33 135 irq_handler(serial_irq_ids[SERIAL_0], TxIrq);
be_bryan 0:b74591d5ab33 136 }
be_bryan 0:b74591d5ab33 137
be_bryan 0:b74591d5ab33 138 void INTRX0_IRQHandler(void)
be_bryan 0:b74591d5ab33 139 {
be_bryan 0:b74591d5ab33 140 irq_handler(serial_irq_ids[SERIAL_0], RxIrq);
be_bryan 0:b74591d5ab33 141 }
be_bryan 0:b74591d5ab33 142
be_bryan 0:b74591d5ab33 143 void INTTX1_IRQHandler(void)
be_bryan 0:b74591d5ab33 144 {
be_bryan 0:b74591d5ab33 145 irq_handler(serial_irq_ids[SERIAL_1], TxIrq);
be_bryan 0:b74591d5ab33 146 }
be_bryan 0:b74591d5ab33 147
be_bryan 0:b74591d5ab33 148 void INTRX1_IRQHandler(void)
be_bryan 0:b74591d5ab33 149 {
be_bryan 0:b74591d5ab33 150 irq_handler(serial_irq_ids[SERIAL_1], RxIrq);
be_bryan 0:b74591d5ab33 151 }
be_bryan 0:b74591d5ab33 152
be_bryan 0:b74591d5ab33 153 void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
be_bryan 0:b74591d5ab33 154 {
be_bryan 0:b74591d5ab33 155 irq_handler = handler;
be_bryan 0:b74591d5ab33 156 serial_irq_ids[obj->index] = id;
be_bryan 0:b74591d5ab33 157 }
be_bryan 0:b74591d5ab33 158
be_bryan 0:b74591d5ab33 159 void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
be_bryan 0:b74591d5ab33 160 {
be_bryan 0:b74591d5ab33 161 IRQn_Type irq_n = (IRQn_Type)0;
be_bryan 0:b74591d5ab33 162
be_bryan 0:b74591d5ab33 163 switch (obj->index) {
be_bryan 0:b74591d5ab33 164 case SERIAL_0:
be_bryan 0:b74591d5ab33 165 if (irq == RxIrq) {
be_bryan 0:b74591d5ab33 166 irq_n = INTRX0_IRQn;
be_bryan 0:b74591d5ab33 167 } else {
be_bryan 0:b74591d5ab33 168 irq_n = INTTX0_IRQn;
be_bryan 0:b74591d5ab33 169 }
be_bryan 0:b74591d5ab33 170 break;
be_bryan 0:b74591d5ab33 171 case SERIAL_1:
be_bryan 0:b74591d5ab33 172 if (irq == RxIrq) {
be_bryan 0:b74591d5ab33 173 irq_n = INTRX1_IRQn;
be_bryan 0:b74591d5ab33 174 } else {
be_bryan 0:b74591d5ab33 175 irq_n = INTTX1_IRQn;
be_bryan 0:b74591d5ab33 176 }
be_bryan 0:b74591d5ab33 177 break;
be_bryan 0:b74591d5ab33 178 default:
be_bryan 0:b74591d5ab33 179 break;
be_bryan 0:b74591d5ab33 180 }
be_bryan 0:b74591d5ab33 181
be_bryan 0:b74591d5ab33 182 if (enable) {
be_bryan 0:b74591d5ab33 183 NVIC_EnableIRQ(irq_n);
be_bryan 0:b74591d5ab33 184 } else {
be_bryan 0:b74591d5ab33 185 NVIC_DisableIRQ(irq_n);
be_bryan 0:b74591d5ab33 186 }
be_bryan 0:b74591d5ab33 187 }
be_bryan 0:b74591d5ab33 188
be_bryan 0:b74591d5ab33 189 int serial_getc(serial_t *obj)
be_bryan 0:b74591d5ab33 190 {
be_bryan 0:b74591d5ab33 191 // Wait until Rx buffer is full
be_bryan 0:b74591d5ab33 192 while (!serial_readable(obj)) {
be_bryan 0:b74591d5ab33 193 // Do nothing
be_bryan 0:b74591d5ab33 194 }
be_bryan 0:b74591d5ab33 195
be_bryan 0:b74591d5ab33 196 return UART_GetRxData(obj->UARTx);
be_bryan 0:b74591d5ab33 197 }
be_bryan 0:b74591d5ab33 198
be_bryan 0:b74591d5ab33 199 void serial_putc(serial_t *obj, int c)
be_bryan 0:b74591d5ab33 200 {
be_bryan 0:b74591d5ab33 201 // Wait until Tx buffer is empty
be_bryan 0:b74591d5ab33 202 while (!serial_writable(obj)) {
be_bryan 0:b74591d5ab33 203 // Do nothing
be_bryan 0:b74591d5ab33 204 }
be_bryan 0:b74591d5ab33 205
be_bryan 0:b74591d5ab33 206 UART_SetTxData(obj->UARTx, (uint32_t)c);
be_bryan 0:b74591d5ab33 207 }
be_bryan 0:b74591d5ab33 208
be_bryan 0:b74591d5ab33 209 int serial_readable(serial_t *obj)
be_bryan 0:b74591d5ab33 210 {
be_bryan 0:b74591d5ab33 211 int ret = 0;
be_bryan 0:b74591d5ab33 212
be_bryan 0:b74591d5ab33 213 if (UART_GetBufState(obj->UARTx, UART_RX) == DONE) {
be_bryan 0:b74591d5ab33 214 ret = 1;
be_bryan 0:b74591d5ab33 215 }
be_bryan 0:b74591d5ab33 216
be_bryan 0:b74591d5ab33 217 return ret;
be_bryan 0:b74591d5ab33 218 }
be_bryan 0:b74591d5ab33 219
be_bryan 0:b74591d5ab33 220 int serial_writable(serial_t *obj)
be_bryan 0:b74591d5ab33 221 {
be_bryan 0:b74591d5ab33 222 int ret = 0;
be_bryan 0:b74591d5ab33 223
be_bryan 0:b74591d5ab33 224 if (UART_GetBufState(obj->UARTx, UART_TX) == DONE) {
be_bryan 0:b74591d5ab33 225 ret = 1;
be_bryan 0:b74591d5ab33 226 }
be_bryan 0:b74591d5ab33 227
be_bryan 0:b74591d5ab33 228 return ret;
be_bryan 0:b74591d5ab33 229 }
be_bryan 0:b74591d5ab33 230
be_bryan 0:b74591d5ab33 231 void serial_clear(serial_t *obj)
be_bryan 0:b74591d5ab33 232 {
be_bryan 0:b74591d5ab33 233 UART_TxFIFOClear(obj->UARTx);
be_bryan 0:b74591d5ab33 234 UART_RxFIFOClear(obj->UARTx);
be_bryan 0:b74591d5ab33 235 UART_TxBufferClear(obj->UARTx);
be_bryan 0:b74591d5ab33 236 }
be_bryan 0:b74591d5ab33 237
be_bryan 0:b74591d5ab33 238 void serial_pinout_tx(PinName tx)
be_bryan 0:b74591d5ab33 239 {
be_bryan 0:b74591d5ab33 240 pinmap_pinout(tx, PinMap_UART_TX);
be_bryan 0:b74591d5ab33 241 }
be_bryan 0:b74591d5ab33 242
be_bryan 0:b74591d5ab33 243 void serial_break_set(serial_t *obj)
be_bryan 0:b74591d5ab33 244 {
be_bryan 0:b74591d5ab33 245 }
be_bryan 0:b74591d5ab33 246
be_bryan 0:b74591d5ab33 247 void serial_break_clear(serial_t *obj)
be_bryan 0:b74591d5ab33 248 {
be_bryan 0:b74591d5ab33 249 }