mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
targets/TARGET_Realtek/TARGET_AMEBA/TARGET_RTL8195A/log_uart_api.c@186:707f6e361f3e
mbed library release version 165

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++) {
Anna Bridge 186:707f6e361f3e 58 if (log_uart_support_rate[i] == (u32)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++) {
Anna Bridge 186:707f6e361f3e 151 if (log_uart_support_rate[i] == (u32)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 184:08ed48f1de7f 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 184:08ed48f1de7f 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 184:08ed48f1de7f 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 while (!log_uart_readable(obj));
AnnaBridge 167:e84263d55307 261 return (char)(HAL_UART_READ32(UART_REV_BUF_OFF) & 0xFF);
AnnaBridge 167:e84263d55307 262 }
AnnaBridge 167:e84263d55307 263
AnnaBridge 167:e84263d55307 264 void log_uart_putc(log_uart_t *obj, char c)
AnnaBridge 167:e84263d55307 265 {
AnnaBridge 167:e84263d55307 266 while (!log_uart_writable(obj));
AnnaBridge 167:e84263d55307 267 HAL_UART_WRITE8(UART_TRAN_HOLD_OFF, c);
AnnaBridge 167:e84263d55307 268 }
AnnaBridge 167:e84263d55307 269
AnnaBridge 167:e84263d55307 270 int log_uart_readable(log_uart_t *obj)
AnnaBridge 167:e84263d55307 271 {
AnnaBridge 167:e84263d55307 272 volatile u8 line_status;
AnnaBridge 167:e84263d55307 273
AnnaBridge 167:e84263d55307 274 line_status = HAL_UART_READ8(UART_LINE_STATUS_REG_OFF);
AnnaBridge 167:e84263d55307 275
AnnaBridge 167:e84263d55307 276 if (line_status & LSR_DR) {
AnnaBridge 167:e84263d55307 277 return 1;
AnnaBridge 167:e84263d55307 278 } else {
AnnaBridge 167:e84263d55307 279 return 0;
AnnaBridge 167:e84263d55307 280 }
AnnaBridge 167:e84263d55307 281 }
AnnaBridge 167:e84263d55307 282
AnnaBridge 167:e84263d55307 283 int log_uart_writable(log_uart_t *obj)
AnnaBridge 167:e84263d55307 284 {
AnnaBridge 167:e84263d55307 285 volatile u8 line_status;
AnnaBridge 167:e84263d55307 286
AnnaBridge 167:e84263d55307 287 line_status = HAL_UART_READ8(UART_LINE_STATUS_REG_OFF);
AnnaBridge 167:e84263d55307 288 if (line_status & LSR_THRE) {
AnnaBridge 167:e84263d55307 289 return 1;
AnnaBridge 167:e84263d55307 290 } else {
AnnaBridge 167:e84263d55307 291 return 0;
AnnaBridge 167:e84263d55307 292 }
AnnaBridge 167:e84263d55307 293 }
AnnaBridge 167:e84263d55307 294
AnnaBridge 167:e84263d55307 295 void log_uart_clear(log_uart_t *obj)
AnnaBridge 167:e84263d55307 296 {
AnnaBridge 167:e84263d55307 297 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 298
AnnaBridge 167:e84263d55307 299 HalLogUartRstFIFO(pUartAdapter, (LOG_UART_RST_TX_FIFO|LOG_UART_RST_TX_FIFO));
AnnaBridge 167:e84263d55307 300 pUartAdapter->TxCount = 0;
AnnaBridge 167:e84263d55307 301 pUartAdapter->RxCount = 0;
AnnaBridge 167:e84263d55307 302 }
AnnaBridge 167:e84263d55307 303
AnnaBridge 167:e84263d55307 304 void log_uart_clear_tx(log_uart_t *obj)
AnnaBridge 167:e84263d55307 305 {
AnnaBridge 167:e84263d55307 306 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 307
AnnaBridge 167:e84263d55307 308 HalLogUartRstFIFO(pUartAdapter, LOG_UART_RST_TX_FIFO);
AnnaBridge 167:e84263d55307 309 pUartAdapter->TxCount = 0;
AnnaBridge 167:e84263d55307 310 }
AnnaBridge 167:e84263d55307 311
AnnaBridge 167:e84263d55307 312 void log_uart_clear_rx(log_uart_t *obj)
AnnaBridge 167:e84263d55307 313 {
AnnaBridge 167:e84263d55307 314 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 315
AnnaBridge 167:e84263d55307 316 HalLogUartRstFIFO(pUartAdapter, LOG_UART_RST_RX_FIFO);
AnnaBridge 167:e84263d55307 317 pUartAdapter->RxCount = 0;
AnnaBridge 167:e84263d55307 318 }
AnnaBridge 167:e84263d55307 319
AnnaBridge 167:e84263d55307 320 void log_uart_break_set(log_uart_t *obj)
AnnaBridge 167:e84263d55307 321 {
AnnaBridge 167:e84263d55307 322 u32 RegValue;
AnnaBridge 167:e84263d55307 323
AnnaBridge 167:e84263d55307 324 RegValue = HAL_UART_READ32(UART_LINE_CTL_REG_OFF);
AnnaBridge 167:e84263d55307 325 RegValue |= LCR_BC;
AnnaBridge 167:e84263d55307 326 HAL_UART_WRITE32(UART_LINE_CTL_REG_OFF, RegValue);
AnnaBridge 167:e84263d55307 327 }
AnnaBridge 167:e84263d55307 328
AnnaBridge 167:e84263d55307 329 void log_uart_break_clear(log_uart_t *obj)
AnnaBridge 167:e84263d55307 330 {
AnnaBridge 167:e84263d55307 331 u32 RegValue;
AnnaBridge 167:e84263d55307 332
AnnaBridge 167:e84263d55307 333 RegValue = HAL_UART_READ32(UART_LINE_CTL_REG_OFF);
AnnaBridge 167:e84263d55307 334 RegValue &= ~LCR_BC;
AnnaBridge 167:e84263d55307 335 HAL_UART_WRITE32(UART_LINE_CTL_REG_OFF, RegValue);
AnnaBridge 167:e84263d55307 336 }
AnnaBridge 167:e84263d55307 337
AnnaBridge 167:e84263d55307 338 void log_uart_tx_comp_handler(log_uart_t *obj, void *handler, uint32_t id)
AnnaBridge 167:e84263d55307 339 {
AnnaBridge 167:e84263d55307 340 HAL_LOG_UART_ADAPTER *pUartAdapter=(PHAL_LOG_UART_ADAPTER)&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 341
AnnaBridge 167:e84263d55307 342 pUartAdapter->TxCompCallback = (void(*)(void*))handler;
AnnaBridge 167:e84263d55307 343 pUartAdapter->TxCompCbPara = (void*)id;
AnnaBridge 167:e84263d55307 344 }
AnnaBridge 167:e84263d55307 345
AnnaBridge 167:e84263d55307 346 void log_uart_rx_comp_handler(log_uart_t *obj, void *handler, uint32_t id)
AnnaBridge 167:e84263d55307 347 {
AnnaBridge 167:e84263d55307 348 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 349
AnnaBridge 167:e84263d55307 350 pUartAdapter->RxCompCallback = (void(*)(void*))handler;
AnnaBridge 167:e84263d55307 351 pUartAdapter->RxCompCbPara = (void*)id;
AnnaBridge 167:e84263d55307 352 }
AnnaBridge 167:e84263d55307 353
AnnaBridge 167:e84263d55307 354 void log_uart_line_status_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->LineStatusCallback = (void(*)(void*, u8))handler;
AnnaBridge 167:e84263d55307 359 pUartAdapter->LineStatusCbPara = (void*)id;
AnnaBridge 167:e84263d55307 360 }
AnnaBridge 167:e84263d55307 361
AnnaBridge 167:e84263d55307 362 // Blocked(busy wait) receive, return received bytes count
AnnaBridge 167:e84263d55307 363 int32_t log_uart_recv (log_uart_t *obj, char *prxbuf, uint32_t len, uint32_t timeout_ms)
AnnaBridge 167:e84263d55307 364 {
AnnaBridge 167:e84263d55307 365 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 366
Anna Bridge 186:707f6e361f3e 367 return (int32_t)HalLogUartRecv(pUartAdapter, (u8 *)prxbuf, len, timeout_ms);
AnnaBridge 167:e84263d55307 368 }
AnnaBridge 167:e84263d55307 369
AnnaBridge 167:e84263d55307 370 // Blocked(busy wait) send, return transmitted bytes count
AnnaBridge 167:e84263d55307 371 int32_t log_uart_send (log_uart_t *obj, char *ptxbuf, 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
Anna Bridge 186:707f6e361f3e 375 return (int32_t)HalLogUartSend(pUartAdapter, (u8 *)ptxbuf, len, timeout_ms);
AnnaBridge 167:e84263d55307 376 }
AnnaBridge 167:e84263d55307 377
AnnaBridge 167:e84263d55307 378 // Interrupt mode(no wait) receive, return HAL function result
AnnaBridge 167:e84263d55307 379 int32_t log_uart_recv_stream (log_uart_t *obj, char *prxbuf, uint32_t len)
AnnaBridge 167:e84263d55307 380 {
AnnaBridge 167:e84263d55307 381 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 382 int ret;
AnnaBridge 167:e84263d55307 383
AnnaBridge 167:e84263d55307 384 ret = (int)HalLogUartIntRecv(pUartAdapter, (u8*)prxbuf, len);
AnnaBridge 167:e84263d55307 385 return (ret);
AnnaBridge 167:e84263d55307 386 }
AnnaBridge 167:e84263d55307 387
AnnaBridge 167:e84263d55307 388 // Interrupt Mode(no wait) send, return HAL function result
AnnaBridge 167:e84263d55307 389 int32_t log_uart_send_stream (log_uart_t *obj, char *ptxbuf, uint32_t len)
AnnaBridge 167:e84263d55307 390 {
AnnaBridge 167:e84263d55307 391 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 392 int ret;
AnnaBridge 167:e84263d55307 393
AnnaBridge 167:e84263d55307 394 ret = (int)HalLogUartIntSend(pUartAdapter, (u8*)ptxbuf, len);
AnnaBridge 167:e84263d55307 395 return (ret);
AnnaBridge 167:e84263d55307 396 }
AnnaBridge 167:e84263d55307 397
AnnaBridge 167:e84263d55307 398 // Interrupt mode(no wait) receive with timeout
AnnaBridge 167:e84263d55307 399 // return the byte count received before timeout, or error(<0)
AnnaBridge 167:e84263d55307 400 int32_t log_uart_recv_stream_timeout (log_uart_t *obj, char *prxbuf, uint32_t len,
AnnaBridge 167:e84263d55307 401 uint32_t timeout_ms, void *force_cs)
AnnaBridge 167:e84263d55307 402 {
AnnaBridge 167:e84263d55307 403 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 404 uint32_t TimeoutCount=0, StartCount;
AnnaBridge 167:e84263d55307 405 int ret;
AnnaBridge 167:e84263d55307 406 void (*task_yield)(void);
AnnaBridge 167:e84263d55307 407
AnnaBridge 167:e84263d55307 408 task_yield = NULL;
AnnaBridge 167:e84263d55307 409 ret = (int)HalLogUartIntRecv(pUartAdapter, (u8*)prxbuf, len);
AnnaBridge 167:e84263d55307 410
AnnaBridge 167:e84263d55307 411 if ((ret == HAL_OK) && (timeout_ms > 0)) {
AnnaBridge 167:e84263d55307 412 TimeoutCount = (timeout_ms*1000/TIMER_TICK_US);
AnnaBridge 167:e84263d55307 413 StartCount = HalTimerOp.HalTimerReadCount(1);
AnnaBridge 167:e84263d55307 414 task_yield = (void (*)(void))force_cs;
AnnaBridge 167:e84263d55307 415 while (pUartAdapter->RxCount > 0) {
AnnaBridge 167:e84263d55307 416 if (HAL_TIMEOUT == RuartIsTimeout(StartCount, TimeoutCount)) {
AnnaBridge 167:e84263d55307 417 HalLogUartAbortIntRecv(pUartAdapter);
AnnaBridge 167:e84263d55307 418 break;
AnnaBridge 167:e84263d55307 419 }
AnnaBridge 167:e84263d55307 420 if (NULL != task_yield) {
AnnaBridge 167:e84263d55307 421 task_yield();
AnnaBridge 167:e84263d55307 422 }
AnnaBridge 167:e84263d55307 423 }
AnnaBridge 167:e84263d55307 424 return (len - pUartAdapter->RxCount);
AnnaBridge 167:e84263d55307 425 } else {
AnnaBridge 167:e84263d55307 426 return (-ret);
AnnaBridge 167:e84263d55307 427 }
AnnaBridge 167:e84263d55307 428 }
AnnaBridge 167:e84263d55307 429
AnnaBridge 167:e84263d55307 430 // Abort Interrupt Mode TX and return how many bytes data has been sent
AnnaBridge 167:e84263d55307 431 int32_t log_uart_send_stream_abort (log_uart_t *obj)
AnnaBridge 167:e84263d55307 432 {
AnnaBridge 167:e84263d55307 433 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 434 int ret;
AnnaBridge 167:e84263d55307 435
AnnaBridge 167:e84263d55307 436 HalLogUartAbortIntSend(pUartAdapter);
AnnaBridge 167:e84263d55307 437
AnnaBridge 167:e84263d55307 438 ret = (u32)pUartAdapter->pTxBuf - (u32)pUartAdapter->pTxStartAddr;
AnnaBridge 167:e84263d55307 439 return (ret);
AnnaBridge 167:e84263d55307 440 }
AnnaBridge 167:e84263d55307 441
AnnaBridge 167:e84263d55307 442 // Abort Interrupt Mode RX and return how many bytes data has been received
AnnaBridge 167:e84263d55307 443 int32_t log_uart_recv_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 HalLogUartAbortIntRecv(pUartAdapter);
AnnaBridge 167:e84263d55307 449
AnnaBridge 167:e84263d55307 450 ret = (u32)pUartAdapter->pRxBuf - (u32)pUartAdapter->pRxStartAddr;
AnnaBridge 167:e84263d55307 451 return (ret);
AnnaBridge 167:e84263d55307 452 }
AnnaBridge 167:e84263d55307 453
AnnaBridge 167:e84263d55307 454 void log_uart_disable (log_uart_t *obj)
AnnaBridge 167:e84263d55307 455 {
AnnaBridge 167:e84263d55307 456 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 457
AnnaBridge 167:e84263d55307 458 HalLogUartDisable(pUartAdapter);
AnnaBridge 167:e84263d55307 459 }
AnnaBridge 167:e84263d55307 460
AnnaBridge 167:e84263d55307 461 void log_uart_enable (log_uart_t *obj)
AnnaBridge 167:e84263d55307 462 {
AnnaBridge 167:e84263d55307 463 HAL_LOG_UART_ADAPTER *pUartAdapter=&(obj->log_hal_uart);
AnnaBridge 167:e84263d55307 464
AnnaBridge 167:e84263d55307 465 HalLogUartEnable(pUartAdapter);
AnnaBridge 167:e84263d55307 466 }
AnnaBridge 167:e84263d55307 467
AnnaBridge 167:e84263d55307 468 // to read Line-Status register
AnnaBridge 167:e84263d55307 469 // Bit 0: RX Data Ready
AnnaBridge 167:e84263d55307 470 // Bit 1: Overrun Error
AnnaBridge 167:e84263d55307 471 // Bit 2: Parity Error
AnnaBridge 167:e84263d55307 472 // Bit 3: Framing Error
AnnaBridge 167:e84263d55307 473 // Bit 4: Break Interrupt (received data input is held in 0 state for a longer than a full word tx time)
AnnaBridge 167:e84263d55307 474 // Bit 5: TX FIFO empty (THR empty)
AnnaBridge 167:e84263d55307 475 // Bit 6: TX FIFO empty (THR & TSR both empty)
AnnaBridge 167:e84263d55307 476 // Bit 7: Receiver FIFO Error (parity error, framing error or break indication)
AnnaBridge 167:e84263d55307 477 uint8_t log_uart_raed_lsr(log_uart_t *obj)
AnnaBridge 167:e84263d55307 478 {
AnnaBridge 167:e84263d55307 479 uint8_t LineStatus;
AnnaBridge 167:e84263d55307 480
AnnaBridge 167:e84263d55307 481 LineStatus = HAL_UART_READ8(UART_LINE_STATUS_REG_OFF);
AnnaBridge 167:e84263d55307 482
AnnaBridge 167:e84263d55307 483 return LineStatus;
AnnaBridge 167:e84263d55307 484 }
AnnaBridge 167:e84263d55307 485
AnnaBridge 167:e84263d55307 486 // to read Modem-Status register
AnnaBridge 167:e84263d55307 487 // Bit 0: DCTS, The CTS line has changed its state
AnnaBridge 167:e84263d55307 488 // Bit 1: DDSR, The DSR line has changed its state
AnnaBridge 167:e84263d55307 489 // Bit 2: TERI, RI line has changed its state from low to high state
AnnaBridge 167:e84263d55307 490 // Bit 3: DDCD, DCD line has changed its state
AnnaBridge 167:e84263d55307 491 // Bit 4: Complement of the CTS input
AnnaBridge 167:e84263d55307 492 // Bit 5: Complement of the DSR input
AnnaBridge 167:e84263d55307 493 // Bit 6: Complement of the RI input
AnnaBridge 167:e84263d55307 494 // Bit 7: Complement of the DCD input
AnnaBridge 167:e84263d55307 495 uint8_t log_uart_raed_msr(log_uart_t *obj)
AnnaBridge 167:e84263d55307 496 {
AnnaBridge 167:e84263d55307 497 uint8_t RegValue;
AnnaBridge 167:e84263d55307 498
AnnaBridge 167:e84263d55307 499 RegValue = HAL_UART_READ8(UART_MODEM_STATUS_REG_OFF);
AnnaBridge 167:e84263d55307 500 return RegValue;
AnnaBridge 167:e84263d55307 501 }
AnnaBridge 167:e84263d55307 502