mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Tue Mar 20 16:56:18 2018 +0000
Revision:
182:a56a73fd2a6f
Parent:
181:57724642e740
Child:
184:08ed48f1de7f
mbed-dev library. Release version 160

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2013-2016 Realtek Semiconductor Corp.
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16
AnnaBridge 167:e84263d55307 17 #include "objects.h"
AnnaBridge 167:e84263d55307 18 #include "log_uart_api.h"
AnnaBridge 167:e84263d55307 19
AnnaBridge 182:a56a73fd2a6f 20 #ifdef CONFIG_MBED_ENABLED
AnnaBridge 182:a56a73fd2a6f 21 #include "platform_stdlib.h"
AnnaBridge 182:a56a73fd2a6f 22 #endif
AnnaBridge 182:a56a73fd2a6f 23
AnnaBridge 167:e84263d55307 24 #include <string.h>
AnnaBridge 167:e84263d55307 25
AnnaBridge 167:e84263d55307 26 const u32 log_uart_support_rate[] = {
AnnaBridge 167:e84263d55307 27 UART_BAUD_RATE_2400, UART_BAUD_RATE_4800, UART_BAUD_RATE_9600,
AnnaBridge 167:e84263d55307 28 UART_BAUD_RATE_19200, UART_BAUD_RATE_38400, UART_BAUD_RATE_57600,
AnnaBridge 167:e84263d55307 29 UART_BAUD_RATE_115200, UART_BAUD_RATE_921600, UART_BAUD_RATE_1152000,
AnnaBridge 167:e84263d55307 30
AnnaBridge 167:e84263d55307 31 0xFFFFFFFF
AnnaBridge 167:e84263d55307 32 };
AnnaBridge 167:e84263d55307 33
AnnaBridge 167:e84263d55307 34 extern HAL_TIMER_OP HalTimerOp;
AnnaBridge 167:e84263d55307 35
AnnaBridge 167:e84263d55307 36 extern u32 ConfigDebugErr;
AnnaBridge 167:e84263d55307 37 extern u32 ConfigDebugWarn;
AnnaBridge 167:e84263d55307 38 extern u32 ConfigDebugInfo;
AnnaBridge 167:e84263d55307 39 extern u32 CfgSysDebugErr;
AnnaBridge 167:e84263d55307 40 extern u32 CfgSysDebugInfo;
AnnaBridge 167:e84263d55307 41 extern u32 CfgSysDebugWarn;
AnnaBridge 167:e84263d55307 42
AnnaBridge 167:e84263d55307 43 extern HAL_Status RuartIsTimeout (u32 StartCount, u32 TimeoutCnt);
AnnaBridge 167:e84263d55307 44 extern u32 HalLogUartInitSetting(HAL_LOG_UART_ADAPTER *pUartAdapter);
AnnaBridge 167:e84263d55307 45 extern VOID HalLogUartSetBaudRate(HAL_LOG_UART_ADAPTER *pUartAdapter);
AnnaBridge 167:e84263d55307 46 extern VOID HalLogUartSetLineCtrl(HAL_LOG_UART_ADAPTER *pUartAdapter);
AnnaBridge 167:e84263d55307 47 extern VOID HalLogUartIrqHandle(VOID * Data);
AnnaBridge 167:e84263d55307 48
AnnaBridge 167:e84263d55307 49 int32_t log_uart_init (log_uart_t *obj, int baudrate, int data_bits, SerialParity parity, int stop_bits)
AnnaBridge 167:e84263d55307 50 {
AnnaBridge 167:e84263d55307 51 HAL_LOG_UART_ADAPTER *pUartAdapter;
AnnaBridge 167:e84263d55307 52 int i;
AnnaBridge 167:e84263d55307 53
AnnaBridge 167:e84263d55307 54 _memset((void*)obj, 0, sizeof(log_uart_t));
AnnaBridge 167:e84263d55307 55 pUartAdapter = &obj->log_hal_uart;
AnnaBridge 167:e84263d55307 56 // Check Baud rate
AnnaBridge 167:e84263d55307 57 for (i=0; log_uart_support_rate[i]!=0xFFFFFF; i++) {
AnnaBridge 167:e84263d55307 58 if (log_uart_support_rate[i] == baudrate) {
AnnaBridge 167:e84263d55307 59 break;
AnnaBridge 167:e84263d55307 60 }
AnnaBridge 167:e84263d55307 61 }
AnnaBridge 167:e84263d55307 62 if (log_uart_support_rate[i]== 0xFFFFFF) {
AnnaBridge 167:e84263d55307 63 DBG_UART_ERR("log_uart_init: Not support Baud Rate %d\n", baudrate);
AnnaBridge 167:e84263d55307 64 return -1;
AnnaBridge 167:e84263d55307 65 }
AnnaBridge 167:e84263d55307 66 // check word width
AnnaBridge 167:e84263d55307 67 if ((data_bits < 5) || (data_bits > 8)) {
AnnaBridge 167:e84263d55307 68 DBG_UART_ERR("log_uart_init: Not support Word Width %d\n", data_bits);
AnnaBridge 167:e84263d55307 69 return -1;
AnnaBridge 167:e84263d55307 70 }
AnnaBridge 167:e84263d55307 71
AnnaBridge 167:e84263d55307 72 //4 Inital Log uart
AnnaBridge 167:e84263d55307 73 pUartAdapter->BaudRate = baudrate;
AnnaBridge 167:e84263d55307 74 pUartAdapter->DataLength = data_bits-5;
AnnaBridge 167:e84263d55307 75 pUartAdapter->FIFOControl = FCR_FIFO_EN | FCR_TX_TRIG_HF | FCR_RX_TRIG_HF;
AnnaBridge 167:e84263d55307 76 // only enable Rx linstatus at initial,
AnnaBridge 167:e84263d55307 77 // Tx & Rx interrupt will be enabled @ transfer start time
AnnaBridge 167:e84263d55307 78 pUartAdapter->IntEnReg = IER_ELSI;
AnnaBridge 167:e84263d55307 79 switch (parity) {
AnnaBridge 167:e84263d55307 80 case ParityNone:
AnnaBridge 167:e84263d55307 81 pUartAdapter->Parity = LCR_PARITY_NONE;
AnnaBridge 167:e84263d55307 82 break;
AnnaBridge 167:e84263d55307 83
AnnaBridge 167:e84263d55307 84 case ParityOdd:
AnnaBridge 167:e84263d55307 85 pUartAdapter->Parity = LCR_PARITY_ODD;
AnnaBridge 167:e84263d55307 86 break;
AnnaBridge 167:e84263d55307 87
AnnaBridge 167:e84263d55307 88 case ParityEven:
AnnaBridge 167:e84263d55307 89 pUartAdapter->Parity = LCR_PARITY_EVEN;
AnnaBridge 167:e84263d55307 90 break;
AnnaBridge 167:e84263d55307 91
AnnaBridge 167:e84263d55307 92 default:
AnnaBridge 167:e84263d55307 93 DBG_UART_ERR("log_uart_init: Not support parity type %d\n", parity);
AnnaBridge 167:e84263d55307 94 return -1;
AnnaBridge 167:e84263d55307 95 }
AnnaBridge 167:e84263d55307 96
AnnaBridge 167:e84263d55307 97 if (stop_bits > 1) {
AnnaBridge 167:e84263d55307 98 // if width is 5 bits, stop bit will be 1.5 bit
AnnaBridge 167:e84263d55307 99 pUartAdapter->Stop = LCR_STOP_2B;
AnnaBridge 167:e84263d55307 100 } else {
AnnaBridge 167:e84263d55307 101 pUartAdapter->Stop = LCR_STOP_1B;
AnnaBridge 167:e84263d55307 102 }
AnnaBridge 167:e84263d55307 103
AnnaBridge 167:e84263d55307 104 //4 Initial Log Uart
AnnaBridge 167:e84263d55307 105 HalLogUartInitSetting(pUartAdapter);
AnnaBridge 167:e84263d55307 106
AnnaBridge 167:e84263d55307 107 // disable all debug message
AnnaBridge 167:e84263d55307 108 ConfigDebugErr = 0;
AnnaBridge 167:e84263d55307 109 ConfigDebugWarn = 0;
AnnaBridge 167:e84263d55307 110 ConfigDebugInfo = 0;
AnnaBridge 167:e84263d55307 111 CfgSysDebugErr = 0;
AnnaBridge 167:e84263d55307 112 CfgSysDebugInfo = 0;
AnnaBridge 167:e84263d55307 113 CfgSysDebugWarn = 0;
AnnaBridge 167:e84263d55307 114
AnnaBridge 167:e84263d55307 115 return 0;
AnnaBridge 167:e84263d55307 116 }
AnnaBridge 167:e84263d55307 117
AnnaBridge 167:e84263d55307 118 void log_uart_free(log_uart_t *obj)
AnnaBridge 167:e84263d55307 119 {
AnnaBridge 167:e84263d55307 120 LOG_UART_ADAPTER UartAdapter;
AnnaBridge 167:e84263d55307 121
AnnaBridge 167:e84263d55307 122 // Recover the Log UART for debug message printing
AnnaBridge 167:e84263d55307 123 //4 Release log uart reset and clock
AnnaBridge 167:e84263d55307 124 LOC_UART_FCTRL(OFF);
AnnaBridge 167:e84263d55307 125 LOC_UART_FCTRL(ON);
AnnaBridge 167:e84263d55307 126 ACTCK_LOG_UART_CCTRL(ON);
AnnaBridge 167:e84263d55307 127
AnnaBridge 167:e84263d55307 128 //4 Inital Log uart
AnnaBridge 167:e84263d55307 129 UartAdapter.BaudRate = UART_BAUD_RATE_38400;
AnnaBridge 167:e84263d55307 130 UartAdapter.DataLength = UART_DATA_LEN_8BIT;
AnnaBridge 167:e84263d55307 131 UartAdapter.FIFOControl = 0xC1;
AnnaBridge 167:e84263d55307 132 UartAdapter.IntEnReg = 0x00;
AnnaBridge 167:e84263d55307 133 UartAdapter.Parity = UART_PARITY_DISABLE;
AnnaBridge 167:e84263d55307 134 UartAdapter.Stop = UART_STOP_1BIT;
AnnaBridge 167:e84263d55307 135
AnnaBridge 167:e84263d55307 136 // un_register current IRQ first
AnnaBridge 167:e84263d55307 137 InterruptUnRegister(&(obj->log_hal_uart.IrqHandle));
AnnaBridge 167:e84263d55307 138
AnnaBridge 167:e84263d55307 139 //4 Initial Log Uart
AnnaBridge 167:e84263d55307 140 HalLogUartInit(UartAdapter);
AnnaBridge 167:e84263d55307 141 }
AnnaBridge 167:e84263d55307 142
AnnaBridge 167:e84263d55307 143 void log_uart_baud(log_uart_t *obj, int baudrate)
AnnaBridge 167:e84263d55307 144 {
AnnaBridge 167:e84263d55307 145 HAL_LOG_UART_ADAPTER *pUartAdapter;
AnnaBridge 167:e84263d55307 146 int i;
AnnaBridge 167:e84263d55307 147
AnnaBridge 167:e84263d55307 148 pUartAdapter = &obj->log_hal_uart;
AnnaBridge 167:e84263d55307 149 // Check Baud rate
AnnaBridge 167:e84263d55307 150 for (i=0; log_uart_support_rate[i]!=0xFFFFFFFF; i++) {
AnnaBridge 167:e84263d55307 151 if (log_uart_support_rate[i] == baudrate) {
AnnaBridge 167:e84263d55307 152 break;
AnnaBridge 167:e84263d55307 153 }
AnnaBridge 167:e84263d55307 154 }
AnnaBridge 167:e84263d55307 155 if (log_uart_support_rate[i]== 0xFFFFFF) {
AnnaBridge 167:e84263d55307 156 DBG_UART_ERR("log_uart_baud: Not support Baud Rate %d\n", baudrate);
AnnaBridge 167:e84263d55307 157 return;
AnnaBridge 167:e84263d55307 158 }
AnnaBridge 167:e84263d55307 159 pUartAdapter->BaudRate = baudrate;
AnnaBridge 167:e84263d55307 160 HalLogUartSetBaudRate(pUartAdapter);
AnnaBridge 167:e84263d55307 161 }
AnnaBridge 167:e84263d55307 162
AnnaBridge 167:e84263d55307 163 void log_uart_format(log_uart_t *obj, int data_bits, SerialParity parity, int stop_bits)
AnnaBridge 167:e84263d55307 164 {
AnnaBridge 167:e84263d55307 165 HAL_LOG_UART_ADAPTER *pUartAdapter;
AnnaBridge 167:e84263d55307 166 pUartAdapter = &obj->log_hal_uart;
AnnaBridge 167:e84263d55307 167
AnnaBridge 167:e84263d55307 168 // check word width
AnnaBridge 167:e84263d55307 169 if ((data_bits < 5) || (data_bits > 8)) {
AnnaBridge 167:e84263d55307 170 DBG_UART_ERR("log_uart_format: Not support Word Width %d\n", data_bits);
AnnaBridge 167:e84263d55307 171 return;
AnnaBridge 167:e84263d55307 172 }
AnnaBridge 167:e84263d55307 173
AnnaBridge 167:e84263d55307 174 //4 Inital Log uart
AnnaBridge 167:e84263d55307 175 pUartAdapter->DataLength = data_bits - 5;
AnnaBridge 167:e84263d55307 176 switch (parity) {
AnnaBridge 167:e84263d55307 177 case ParityNone:
AnnaBridge 167:e84263d55307 178 pUartAdapter->Parity = LCR_PARITY_NONE;
AnnaBridge 167:e84263d55307 179 break;
AnnaBridge 167:e84263d55307 180
AnnaBridge 167:e84263d55307 181 case ParityOdd:
AnnaBridge 167:e84263d55307 182 pUartAdapter->Parity = LCR_PARITY_ODD;
AnnaBridge 167:e84263d55307 183 break;
AnnaBridge 167:e84263d55307 184
AnnaBridge 167:e84263d55307 185 case ParityEven:
AnnaBridge 167:e84263d55307 186 pUartAdapter->Parity = LCR_PARITY_EVEN;
AnnaBridge 167:e84263d55307 187 break;
AnnaBridge 167:e84263d55307 188
AnnaBridge 167:e84263d55307 189 default:
AnnaBridge 167:e84263d55307 190 DBG_UART_ERR("log_uart_format: Not support parity type %d\n", parity);
AnnaBridge 167:e84263d55307 191 return;
AnnaBridge 167:e84263d55307 192 }
AnnaBridge 167:e84263d55307 193
AnnaBridge 167:e84263d55307 194 if (stop_bits > 1) {
AnnaBridge 167:e84263d55307 195 // if width is 5 bits, stop bit will be 1.5 bit
AnnaBridge 167:e84263d55307 196 pUartAdapter->Stop = LCR_STOP_2B;
AnnaBridge 167:e84263d55307 197 } else {
AnnaBridge 167:e84263d55307 198 pUartAdapter->Stop = LCR_STOP_1B;
AnnaBridge 167:e84263d55307 199 }
AnnaBridge 167:e84263d55307 200
AnnaBridge 167:e84263d55307 201 HalLogUartSetLineCtrl(pUartAdapter);
AnnaBridge 167:e84263d55307 202 }
AnnaBridge 167:e84263d55307 203
AnnaBridge 167:e84263d55307 204 /******************************************************************************
AnnaBridge 167:e84263d55307 205 * INTERRUPTS HANDLING
AnnaBridge 167:e84263d55307 206 ******************************************************************************/
AnnaBridge 167:e84263d55307 207 void log_uart_irq_handler(log_uart_t *obj, loguart_irq_handler handler, uint32_t id)
AnnaBridge 167:e84263d55307 208 {
AnnaBridge 167:e84263d55307 209 HAL_LOG_UART_ADAPTER *pUartAdapter;
AnnaBridge 167:e84263d55307 210
AnnaBridge 167:e84263d55307 211 pUartAdapter = &(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 212 pUartAdapter->api_irq_handler = handler;
AnnaBridge 167:e84263d55307 213 pUartAdapter->api_irq_id = id;
AnnaBridge 167:e84263d55307 214 }
AnnaBridge 167:e84263d55307 215
AnnaBridge 167:e84263d55307 216 void log_uart_irq_set(log_uart_t *obj, LOG_UART_INT_ID irq, uint32_t enable)
AnnaBridge 167:e84263d55307 217 {
AnnaBridge 167:e84263d55307 218 HAL_LOG_UART_ADAPTER *pUartAdapter;
AnnaBridge 167:e84263d55307 219 u8 int_en=0;
AnnaBridge 167:e84263d55307 220
AnnaBridge 167:e84263d55307 221 pUartAdapter = &(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 222
AnnaBridge 167:e84263d55307 223 switch (irq) {
AnnaBridge 167:e84263d55307 224 case IIR_RX_RDY:
AnnaBridge 167:e84263d55307 225 int_en = IER_ERBFI;
AnnaBridge 167:e84263d55307 226 break;
AnnaBridge 167:e84263d55307 227
AnnaBridge 167:e84263d55307 228 case IIR_THR_EMPTY:
AnnaBridge 167:e84263d55307 229 int_en = IER_ETBEI;
AnnaBridge 167:e84263d55307 230 break;
AnnaBridge 167:e84263d55307 231
AnnaBridge 167:e84263d55307 232 case IIR_RX_LINE_STATUS:
AnnaBridge 167:e84263d55307 233 int_en = IER_ELSI;
AnnaBridge 167:e84263d55307 234 break;
AnnaBridge 167:e84263d55307 235
AnnaBridge 167:e84263d55307 236 case IIR_MODEM_STATUS:
AnnaBridge 167:e84263d55307 237 int_en = IER_EDSSI;
AnnaBridge 167:e84263d55307 238 break;
AnnaBridge 167:e84263d55307 239
AnnaBridge 167:e84263d55307 240 default:
AnnaBridge 167:e84263d55307 241 DBG_UART_WARN("log_uart_irq_set: Unknown Irq Id\n");
AnnaBridge 167:e84263d55307 242 return;
AnnaBridge 167:e84263d55307 243 }
AnnaBridge 167:e84263d55307 244
AnnaBridge 167:e84263d55307 245 if (enable) {
AnnaBridge 167:e84263d55307 246 pUartAdapter->IntEnReg |= int_en;
AnnaBridge 167:e84263d55307 247 } else {
AnnaBridge 167:e84263d55307 248 // disable
AnnaBridge 167:e84263d55307 249 pUartAdapter->IntEnReg &= (~int_en);
AnnaBridge 167:e84263d55307 250 }
AnnaBridge 167:e84263d55307 251 HalLogUartSetIntEn(pUartAdapter);
AnnaBridge 167:e84263d55307 252 }
AnnaBridge 167:e84263d55307 253
AnnaBridge 167:e84263d55307 254 /******************************************************************************
AnnaBridge 167:e84263d55307 255 * READ/WRITE
AnnaBridge 167:e84263d55307 256 ******************************************************************************/
AnnaBridge 167:e84263d55307 257
AnnaBridge 167:e84263d55307 258 char log_uart_getc(log_uart_t *obj)
AnnaBridge 167:e84263d55307 259 {
AnnaBridge 167:e84263d55307 260 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 261
AnnaBridge 167:e84263d55307 262 while (!log_uart_readable(obj));
AnnaBridge 167:e84263d55307 263 return (char)(HAL_UART_READ32(UART_REV_BUF_OFF) & 0xFF);
AnnaBridge 167:e84263d55307 264 }
AnnaBridge 167:e84263d55307 265
AnnaBridge 167:e84263d55307 266 void log_uart_putc(log_uart_t *obj, char c)
AnnaBridge 167:e84263d55307 267 {
AnnaBridge 167:e84263d55307 268 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 269
AnnaBridge 167:e84263d55307 270 while (!log_uart_writable(obj));
AnnaBridge 167:e84263d55307 271 HAL_UART_WRITE8(UART_TRAN_HOLD_OFF, c);
AnnaBridge 167:e84263d55307 272 }
AnnaBridge 167:e84263d55307 273
AnnaBridge 167:e84263d55307 274 int log_uart_readable(log_uart_t *obj)
AnnaBridge 167:e84263d55307 275 {
AnnaBridge 167:e84263d55307 276 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 277 volatile u8 line_status;
AnnaBridge 167:e84263d55307 278
AnnaBridge 167:e84263d55307 279 line_status = HAL_UART_READ8(UART_LINE_STATUS_REG_OFF);
AnnaBridge 167:e84263d55307 280
AnnaBridge 167:e84263d55307 281 if (line_status & LSR_DR) {
AnnaBridge 167:e84263d55307 282 return 1;
AnnaBridge 167:e84263d55307 283 } else {
AnnaBridge 167:e84263d55307 284 return 0;
AnnaBridge 167:e84263d55307 285 }
AnnaBridge 167:e84263d55307 286 }
AnnaBridge 167:e84263d55307 287
AnnaBridge 167:e84263d55307 288 int log_uart_writable(log_uart_t *obj)
AnnaBridge 167:e84263d55307 289 {
AnnaBridge 167:e84263d55307 290 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 291 volatile u8 line_status;
AnnaBridge 167:e84263d55307 292
AnnaBridge 167:e84263d55307 293 line_status = HAL_UART_READ8(UART_LINE_STATUS_REG_OFF);
AnnaBridge 167:e84263d55307 294 if (line_status & LSR_THRE) {
AnnaBridge 167:e84263d55307 295 return 1;
AnnaBridge 167:e84263d55307 296 } else {
AnnaBridge 167:e84263d55307 297 return 0;
AnnaBridge 167:e84263d55307 298 }
AnnaBridge 167:e84263d55307 299 }
AnnaBridge 167:e84263d55307 300
AnnaBridge 167:e84263d55307 301 void log_uart_clear(log_uart_t *obj)
AnnaBridge 167:e84263d55307 302 {
AnnaBridge 167:e84263d55307 303 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 304
AnnaBridge 167:e84263d55307 305 HalLogUartRstFIFO(pUartAdapter, (LOG_UART_RST_TX_FIFO|LOG_UART_RST_TX_FIFO));
AnnaBridge 167:e84263d55307 306 pUartAdapter->TxCount = 0;
AnnaBridge 167:e84263d55307 307 pUartAdapter->RxCount = 0;
AnnaBridge 167:e84263d55307 308 }
AnnaBridge 167:e84263d55307 309
AnnaBridge 167:e84263d55307 310 void log_uart_clear_tx(log_uart_t *obj)
AnnaBridge 167:e84263d55307 311 {
AnnaBridge 167:e84263d55307 312 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 313
AnnaBridge 167:e84263d55307 314 HalLogUartRstFIFO(pUartAdapter, LOG_UART_RST_TX_FIFO);
AnnaBridge 167:e84263d55307 315 pUartAdapter->TxCount = 0;
AnnaBridge 167:e84263d55307 316 }
AnnaBridge 167:e84263d55307 317
AnnaBridge 167:e84263d55307 318 void log_uart_clear_rx(log_uart_t *obj)
AnnaBridge 167:e84263d55307 319 {
AnnaBridge 167:e84263d55307 320 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 321
AnnaBridge 167:e84263d55307 322 HalLogUartRstFIFO(pUartAdapter, LOG_UART_RST_RX_FIFO);
AnnaBridge 167:e84263d55307 323 pUartAdapter->RxCount = 0;
AnnaBridge 167:e84263d55307 324 }
AnnaBridge 167:e84263d55307 325
AnnaBridge 167:e84263d55307 326 void log_uart_break_set(log_uart_t *obj)
AnnaBridge 167:e84263d55307 327 {
AnnaBridge 167:e84263d55307 328 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 329 u32 RegValue;
AnnaBridge 167:e84263d55307 330
AnnaBridge 167:e84263d55307 331 RegValue = HAL_UART_READ32(UART_LINE_CTL_REG_OFF);
AnnaBridge 167:e84263d55307 332 RegValue |= LCR_BC;
AnnaBridge 167:e84263d55307 333 HAL_UART_WRITE32(UART_LINE_CTL_REG_OFF, RegValue);
AnnaBridge 167:e84263d55307 334 }
AnnaBridge 167:e84263d55307 335
AnnaBridge 167:e84263d55307 336 void log_uart_break_clear(log_uart_t *obj)
AnnaBridge 167:e84263d55307 337 {
AnnaBridge 167:e84263d55307 338 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 339 u32 RegValue;
AnnaBridge 167:e84263d55307 340
AnnaBridge 167:e84263d55307 341 RegValue = HAL_UART_READ32(UART_LINE_CTL_REG_OFF);
AnnaBridge 167:e84263d55307 342 RegValue &= ~LCR_BC;
AnnaBridge 167:e84263d55307 343 HAL_UART_WRITE32(UART_LINE_CTL_REG_OFF, RegValue);
AnnaBridge 167:e84263d55307 344 }
AnnaBridge 167:e84263d55307 345
AnnaBridge 167:e84263d55307 346 void log_uart_tx_comp_handler(log_uart_t *obj, void *handler, uint32_t id)
AnnaBridge 167:e84263d55307 347 {
AnnaBridge 167:e84263d55307 348 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 349
AnnaBridge 167:e84263d55307 350 pUartAdapter->TxCompCallback = (void(*)(void*))handler;
AnnaBridge 167:e84263d55307 351 pUartAdapter->TxCompCbPara = (void*)id;
AnnaBridge 167:e84263d55307 352 }
AnnaBridge 167:e84263d55307 353
AnnaBridge 167:e84263d55307 354 void log_uart_rx_comp_handler(log_uart_t *obj, void *handler, uint32_t id)
AnnaBridge 167:e84263d55307 355 {
AnnaBridge 167:e84263d55307 356 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 357
AnnaBridge 167:e84263d55307 358 pUartAdapter->RxCompCallback = (void(*)(void*))handler;
AnnaBridge 167:e84263d55307 359 pUartAdapter->RxCompCbPara = (void*)id;
AnnaBridge 167:e84263d55307 360 }
AnnaBridge 167:e84263d55307 361
AnnaBridge 167:e84263d55307 362 void log_uart_line_status_handler(log_uart_t *obj, void *handler, uint32_t id)
AnnaBridge 167:e84263d55307 363 {
AnnaBridge 167:e84263d55307 364 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 365
AnnaBridge 167:e84263d55307 366 pUartAdapter->LineStatusCallback = (void(*)(void*, u8))handler;
AnnaBridge 167:e84263d55307 367 pUartAdapter->LineStatusCbPara = (void*)id;
AnnaBridge 167:e84263d55307 368 }
AnnaBridge 167:e84263d55307 369
AnnaBridge 167:e84263d55307 370 // Blocked(busy wait) receive, return received bytes count
AnnaBridge 167:e84263d55307 371 int32_t log_uart_recv (log_uart_t *obj, char *prxbuf, uint32_t len, uint32_t timeout_ms)
AnnaBridge 167:e84263d55307 372 {
AnnaBridge 167:e84263d55307 373 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 374 int ret;
AnnaBridge 167:e84263d55307 375
AnnaBridge 167:e84263d55307 376 ret = (int)HalLogUartRecv(pUartAdapter, prxbuf, len, timeout_ms);
AnnaBridge 167:e84263d55307 377 return (ret);
AnnaBridge 167:e84263d55307 378 }
AnnaBridge 167:e84263d55307 379
AnnaBridge 167:e84263d55307 380 // Blocked(busy wait) send, return transmitted bytes count
AnnaBridge 167:e84263d55307 381 int32_t log_uart_send (log_uart_t *obj, char *ptxbuf, uint32_t len, uint32_t timeout_ms)
AnnaBridge 167:e84263d55307 382 {
AnnaBridge 167:e84263d55307 383 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 384 int ret;
AnnaBridge 167:e84263d55307 385
AnnaBridge 167:e84263d55307 386 ret = (int)HalLogUartSend(pUartAdapter, ptxbuf, len, timeout_ms);
AnnaBridge 167:e84263d55307 387 return (ret);
AnnaBridge 167:e84263d55307 388 }
AnnaBridge 167:e84263d55307 389
AnnaBridge 167:e84263d55307 390 // Interrupt mode(no wait) receive, return HAL function result
AnnaBridge 167:e84263d55307 391 int32_t log_uart_recv_stream (log_uart_t *obj, char *prxbuf, uint32_t len)
AnnaBridge 167:e84263d55307 392 {
AnnaBridge 167:e84263d55307 393 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 394 int ret;
AnnaBridge 167:e84263d55307 395
AnnaBridge 167:e84263d55307 396 ret = (int)HalLogUartIntRecv(pUartAdapter, (u8*)prxbuf, len);
AnnaBridge 167:e84263d55307 397 return (ret);
AnnaBridge 167:e84263d55307 398 }
AnnaBridge 167:e84263d55307 399
AnnaBridge 167:e84263d55307 400 // Interrupt Mode(no wait) send, return HAL function result
AnnaBridge 167:e84263d55307 401 int32_t log_uart_send_stream (log_uart_t *obj, char *ptxbuf, uint32_t len)
AnnaBridge 167:e84263d55307 402 {
AnnaBridge 167:e84263d55307 403 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 404 int ret;
AnnaBridge 167:e84263d55307 405
AnnaBridge 167:e84263d55307 406 ret = (int)HalLogUartIntSend(pUartAdapter, (u8*)ptxbuf, len);
AnnaBridge 167:e84263d55307 407 return (ret);
AnnaBridge 167:e84263d55307 408 }
AnnaBridge 167:e84263d55307 409
AnnaBridge 167:e84263d55307 410 // Interrupt mode(no wait) receive with timeout
AnnaBridge 167:e84263d55307 411 // return the byte count received before timeout, or error(<0)
AnnaBridge 167:e84263d55307 412 int32_t log_uart_recv_stream_timeout (log_uart_t *obj, char *prxbuf, uint32_t len,
AnnaBridge 167:e84263d55307 413 uint32_t timeout_ms, void *force_cs)
AnnaBridge 167:e84263d55307 414 {
AnnaBridge 167:e84263d55307 415 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 416 uint32_t TimeoutCount=0, StartCount;
AnnaBridge 167:e84263d55307 417 int ret;
AnnaBridge 167:e84263d55307 418 void (*task_yield)(void);
AnnaBridge 167:e84263d55307 419
AnnaBridge 167:e84263d55307 420 task_yield = NULL;
AnnaBridge 167:e84263d55307 421 ret = (int)HalLogUartIntRecv(pUartAdapter, (u8*)prxbuf, len);
AnnaBridge 167:e84263d55307 422
AnnaBridge 167:e84263d55307 423 if ((ret == HAL_OK) && (timeout_ms > 0)) {
AnnaBridge 167:e84263d55307 424 TimeoutCount = (timeout_ms*1000/TIMER_TICK_US);
AnnaBridge 167:e84263d55307 425 StartCount = HalTimerOp.HalTimerReadCount(1);
AnnaBridge 167:e84263d55307 426 task_yield = (void (*)(void))force_cs;
AnnaBridge 167:e84263d55307 427 while (pUartAdapter->RxCount > 0) {
AnnaBridge 167:e84263d55307 428 if (HAL_TIMEOUT == RuartIsTimeout(StartCount, TimeoutCount)) {
AnnaBridge 167:e84263d55307 429 HalLogUartAbortIntRecv(pUartAdapter);
AnnaBridge 167:e84263d55307 430 break;
AnnaBridge 167:e84263d55307 431 }
AnnaBridge 167:e84263d55307 432 if (NULL != task_yield) {
AnnaBridge 167:e84263d55307 433 task_yield();
AnnaBridge 167:e84263d55307 434 }
AnnaBridge 167:e84263d55307 435 }
AnnaBridge 167:e84263d55307 436 return (len - pUartAdapter->RxCount);
AnnaBridge 167:e84263d55307 437 } else {
AnnaBridge 167:e84263d55307 438 return (-ret);
AnnaBridge 167:e84263d55307 439 }
AnnaBridge 167:e84263d55307 440 }
AnnaBridge 167:e84263d55307 441
AnnaBridge 167:e84263d55307 442 // Abort Interrupt Mode TX and return how many bytes data has been sent
AnnaBridge 167:e84263d55307 443 int32_t log_uart_send_stream_abort (log_uart_t *obj)
AnnaBridge 167:e84263d55307 444 {
AnnaBridge 167:e84263d55307 445 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 446 int ret;
AnnaBridge 167:e84263d55307 447
AnnaBridge 167:e84263d55307 448 HalLogUartAbortIntSend(pUartAdapter);
AnnaBridge 167:e84263d55307 449
AnnaBridge 167:e84263d55307 450 ret = (u32)pUartAdapter->pTxBuf - (u32)pUartAdapter->pTxStartAddr;
AnnaBridge 167:e84263d55307 451 return (ret);
AnnaBridge 167:e84263d55307 452 }
AnnaBridge 167:e84263d55307 453
AnnaBridge 167:e84263d55307 454 // Abort Interrupt Mode RX and return how many bytes data has been received
AnnaBridge 167:e84263d55307 455 int32_t log_uart_recv_stream_abort (log_uart_t *obj)
AnnaBridge 167:e84263d55307 456 {
AnnaBridge 167:e84263d55307 457 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 458 int ret;
AnnaBridge 167:e84263d55307 459
AnnaBridge 167:e84263d55307 460 HalLogUartAbortIntRecv(pUartAdapter);
AnnaBridge 167:e84263d55307 461
AnnaBridge 167:e84263d55307 462 ret = (u32)pUartAdapter->pRxBuf - (u32)pUartAdapter->pRxStartAddr;
AnnaBridge 167:e84263d55307 463 return (ret);
AnnaBridge 167:e84263d55307 464 }
AnnaBridge 167:e84263d55307 465
AnnaBridge 167:e84263d55307 466 void log_uart_disable (log_uart_t *obj)
AnnaBridge 167:e84263d55307 467 {
AnnaBridge 167:e84263d55307 468 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 469
AnnaBridge 167:e84263d55307 470 HalLogUartDisable(pUartAdapter);
AnnaBridge 167:e84263d55307 471 }
AnnaBridge 167:e84263d55307 472
AnnaBridge 167:e84263d55307 473 void log_uart_enable (log_uart_t *obj)
AnnaBridge 167:e84263d55307 474 {
AnnaBridge 167:e84263d55307 475 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 476
AnnaBridge 167:e84263d55307 477 HalLogUartEnable(pUartAdapter);
AnnaBridge 167:e84263d55307 478 }
AnnaBridge 167:e84263d55307 479
AnnaBridge 167:e84263d55307 480 // to read Line-Status register
AnnaBridge 167:e84263d55307 481 // Bit 0: RX Data Ready
AnnaBridge 167:e84263d55307 482 // Bit 1: Overrun Error
AnnaBridge 167:e84263d55307 483 // Bit 2: Parity Error
AnnaBridge 167:e84263d55307 484 // Bit 3: Framing Error
AnnaBridge 167:e84263d55307 485 // Bit 4: Break Interrupt (received data input is held in 0 state for a longer than a full word tx time)
AnnaBridge 167:e84263d55307 486 // Bit 5: TX FIFO empty (THR empty)
AnnaBridge 167:e84263d55307 487 // Bit 6: TX FIFO empty (THR & TSR both empty)
AnnaBridge 167:e84263d55307 488 // Bit 7: Receiver FIFO Error (parity error, framing error or break indication)
AnnaBridge 167:e84263d55307 489 uint8_t log_uart_raed_lsr(log_uart_t *obj)
AnnaBridge 167:e84263d55307 490 {
AnnaBridge 167:e84263d55307 491 uint8_t LineStatus;
AnnaBridge 167:e84263d55307 492
AnnaBridge 167:e84263d55307 493 LineStatus = HAL_UART_READ8(UART_LINE_STATUS_REG_OFF);
AnnaBridge 167:e84263d55307 494
AnnaBridge 167:e84263d55307 495 return LineStatus;
AnnaBridge 167:e84263d55307 496 }
AnnaBridge 167:e84263d55307 497
AnnaBridge 167:e84263d55307 498 // to read Modem-Status register
AnnaBridge 167:e84263d55307 499 // Bit 0: DCTS, The CTS line has changed its state
AnnaBridge 167:e84263d55307 500 // Bit 1: DDSR, The DSR line has changed its state
AnnaBridge 167:e84263d55307 501 // Bit 2: TERI, RI line has changed its state from low to high state
AnnaBridge 167:e84263d55307 502 // Bit 3: DDCD, DCD line has changed its state
AnnaBridge 167:e84263d55307 503 // Bit 4: Complement of the CTS input
AnnaBridge 167:e84263d55307 504 // Bit 5: Complement of the DSR input
AnnaBridge 167:e84263d55307 505 // Bit 6: Complement of the RI input
AnnaBridge 167:e84263d55307 506 // Bit 7: Complement of the DCD input
AnnaBridge 167:e84263d55307 507 uint8_t log_uart_raed_msr(log_uart_t *obj)
AnnaBridge 167:e84263d55307 508 {
AnnaBridge 167:e84263d55307 509 uint8_t RegValue;
AnnaBridge 167:e84263d55307 510
AnnaBridge 167:e84263d55307 511 RegValue = HAL_UART_READ8(UART_MODEM_STATUS_REG_OFF);
AnnaBridge 167:e84263d55307 512 return RegValue;
AnnaBridge 167:e84263d55307 513 }
AnnaBridge 167:e84263d55307 514