rjw | 6c1fd8f | 2022-11-30 14:33:01 +0800 | [diff] [blame] | 1 | /***************************************************************************** |
| 2 | * Copyright Statement: |
| 3 | * -------------------- |
| 4 | * This software is protected by Copyright and the information contained |
| 5 | * herein is confidential. The software may not be copied and the information |
| 6 | * contained herein may not be used or disclosed except with the written |
| 7 | * permission of MediaTek Inc. (C) 2012 |
| 8 | * |
| 9 | * BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES |
| 10 | * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE") |
| 11 | * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON |
| 12 | * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES, |
| 13 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF |
| 14 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT. |
| 15 | * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE |
| 16 | * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR |
| 17 | * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH |
| 18 | * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO |
| 19 | * NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S |
| 20 | * SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM. |
| 21 | * |
| 22 | * BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE |
| 23 | * LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE, |
| 24 | * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE, |
| 25 | * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO |
| 26 | * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. |
| 27 | * |
| 28 | * THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE |
| 29 | * WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF |
| 30 | * LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND |
| 31 | * RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER |
| 32 | * THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC). |
| 33 | * |
| 34 | *****************************************************************************/ |
| 35 | |
| 36 | /******************************************************************************* |
| 37 | * Filename: |
| 38 | * --------- |
| 39 | * uart_handler.c |
| 40 | * |
| 41 | * Project: |
| 42 | * -------- |
| 43 | * TATAKA |
| 44 | * |
| 45 | * Description: |
| 46 | * ------------ |
| 47 | * Handler for UART |
| 48 | * |
| 49 | * Author: |
| 50 | * ------- |
| 51 | * ------- |
| 52 | * ------- |
| 53 | * |
| 54 | * ========================================================================== |
| 55 | * $Log$ |
| 56 | * |
| 57 | * 07 29 2019 yao.xue |
| 58 | * [MOLY00425268] [SMO][VMOLY]Remove unnecessary Assert in user load |
| 59 | * Modify Assert to DEBUG ASSERT in UART driver |
| 60 | * |
| 61 | * 02 15 2019 panu.peisa |
| 62 | * [MOLY00384803] [Gen97][SystemService][Change Request] KAL Refactoring Phase-in |
| 63 | * |
| 64 | * Added changes to swrd part. |
| 65 | * |
| 66 | * 04 10 2018 yuke.ren |
| 67 | * [MOLY00318981] Merge SLT Code |
| 68 | * . |
| 69 | * |
| 70 | * 03 13 2018 shenghui.shi |
| 71 | * [MOLY00309657] UMOLYE driver warning fix |
| 72 | * update UART driver |
| 73 | * |
| 74 | * 09 07 2017 yao.xue |
| 75 | * [MOLY00275927] update uart dbg_print init |
| 76 | * update dbgprint init |
| 77 | * |
| 78 | * 04 24 2017 shenghui.shi |
| 79 | * [MOLY00243727] update UART PDN feature |
| 80 | * update UART pdn feature,to void system could not entry DCM issue. |
| 81 | * |
| 82 | * 03 15 2016 shenghui.shi |
| 83 | * [MOLY00081492] [UART] update uart driver |
| 84 | * update dbgprint driver for SMP |
| 85 | * |
| 86 | * 02 11 2015 shenghui.shi |
| 87 | * [MOLY00081492] [UART] update uart driver |
| 88 | * 1. add sw escape feature to UMOLY |
| 89 | * 2. phase out VFIFO hw code in devdrv_common.c |
| 90 | * |
| 91 | * 12 18 2014 shenghui.shi |
| 92 | * [MOLY00081492] [UART] update uart driver |
| 93 | * . |
| 94 | * |
| 95 | * 11 14 2014 shenghui.shi |
| 96 | * [MOLY00081492] [UART] update uart driver |
| 97 | * add UART eception check timeout status feature |
| 98 | * |
| 99 | * 12 30 2013 shenghui.shi |
| 100 | * [MOLY00051976] Update UART driver to separate UARTcore and DRV_DEBUG |
| 101 | * update uart driver to sperate uartcore and DRV_DEBUG |
| 102 | * |
| 103 | * 12 25 2013 shenghui.shi |
| 104 | * [MOLY00051587] [MT6290 MOLY] uart driver update for TTY_CMD_EXCEPTION_HIF_POLL |
| 105 | * uart driver update for TTY_CMD_EXCEPTION_HIF_POL |
| 106 | * |
| 107 | * 12 04 2013 shenghui.shi |
| 108 | * [MOLY00048917] [MT6290E2] uart driver update |
| 109 | * . |
| 110 | * |
| 111 | * 11 07 2013 shenghui.shi |
| 112 | * [MOLY00045403] update UARTcore task |
| 113 | * . |
| 114 | * |
| 115 | * 08 27 2013 shenghui.shi |
| 116 | * [MOLY00035212] fix uart build modis error |
| 117 | * update UART exception driver for following the HMU standard mode. |
| 118 | * |
| 119 | * 02 04 2013 ansel.liao |
| 120 | * [MOLY00006575] Add UART/HDMA Driver |
| 121 | * rename: 7208 -> 6290 |
| 122 | * |
| 123 | * 12 12 2012 ansel.liao |
| 124 | * [MOLY00006575] Add UART/HDMA Driver |
| 125 | * Integration change. |
| 126 | * |
| 127 | * 11 23 2012 ansel.liao |
| 128 | * [MOLY00006575] Add UART/HDMA Driver |
| 129 | * Add UART/HDMA driver |
| 130 | ****************************************************************************/ |
| 131 | #include "dcl.h" |
| 132 | #include "uart_internal.h" |
| 133 | #include "uart_sw.h" |
| 134 | #include "kal_general_types.h" |
| 135 | #include "drv_comm.h" |
| 136 | #include "kal_public_api.h" |
| 137 | #include "kal_ex_api.h" |
| 138 | |
| 139 | |
| 140 | #if defined(__HMU_ENABLE__) |
| 141 | #include "hmu.h" |
| 142 | #include "hmu_conf_data.h" |
| 143 | #endif |
| 144 | |
| 145 | #define UART_CHUNK_SIZE 512 |
| 146 | |
| 147 | UartDriver_strcut* pUart_CMD_FUNC[MAX_UART_PORT_NUM]; |
| 148 | kal_uint32 uart_open_event = 0; |
| 149 | extern UARTStruct UARTPort[]; |
| 150 | extern kal_uint32 uart_ecpt_get_tx_state(UART_PORT port); |
| 151 | extern void UART_PDN_Disable(UART_PORT port); |
| 152 | extern void UART_PDN_Enable(UART_PORT port); |
| 153 | extern void dbg_uart_init(void); |
| 154 | #ifndef KTEST_UART_TRACES |
| 155 | extern void dbg_uart_create_spinlock(void); |
| 156 | #endif |
| 157 | static DCL_STATUS UART_Handler(DCL_DEV dev,DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data); |
| 158 | |
| 159 | Seriport_HANDLER_T Uart_Drv_Handler = {DCL_UART_TYPE, UART_Handler}; |
| 160 | //extern UART_flowCtrlMode UART_GetFlowCtrl(UART_PORT uart_port); |
| 161 | |
| 162 | DCL_STATUS UART_Handler(DCL_DEV dev,DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data) |
| 163 | { |
| 164 | kal_bool return_flag = KAL_FALSE; |
| 165 | DCL_STATUS return_status = STATUS_OK; |
| 166 | if(dev >= MAX_UART_PORT_NUM) |
| 167 | return STATUS_INVALID_DEVICE; |
| 168 | |
| 169 | switch (cmd) |
| 170 | { |
| 171 | // Class Driver must implement |
| 172 | case SIO_CMD_INIT: |
| 173 | { |
| 174 | #if defined(DRV_DEBUG)||defined(__IC_SLT__) |
| 175 | UART_DriverInit(dev); |
| 176 | #ifndef KTEST_UART_TRACES |
| 177 | dbg_uart_create_spinlock(); |
| 178 | #endif |
| 179 | //dbg_uart_init(); |
| 180 | #elif defined(__HIF_UART_SUPPORT__) |
| 181 | UART_DriverInit(dev); |
| 182 | #else |
| 183 | /* disable uart clock in drv_init_phase1() if not used */ |
| 184 | UART_PDN_Enable(dev); |
| 185 | #endif |
| 186 | } |
| 187 | break; |
| 188 | |
| 189 | case SIO_CMD_OPEN: |
| 190 | { |
| 191 | UART_CTRL_OPEN_T* prCtrlOpen; |
| 192 | #if defined(__UARTCORE_SUPPORT__) && !defined(UARTCORE_NOT_PRESENT) && !defined(__UARTCORE_TASK_DISABLE__)&&!defined(DRV_DEBUG) |
| 193 | uart_open_event ++; |
| 194 | hmu_hifeg_set(HIF_DRV_EG_UART_IND_EVENT); |
| 195 | #endif |
| 196 | prCtrlOpen = &(data->rUARTCtrlOPEN); |
| 197 | return_flag = pUart_CMD_FUNC[dev]->Open(dev,(module_type)(prCtrlOpen->u4OwenrId)); |
| 198 | if(return_flag == KAL_FALSE){ |
| 199 | UART_DriverInit(dev); |
| 200 | return_status = STATUS_FAIL; |
| 201 | } |
| 202 | } |
| 203 | break; |
| 204 | |
| 205 | case SIO_CMD_CLOSE: |
| 206 | { |
| 207 | UART_CTRL_CLOSE_T* prCtrlClose; |
| 208 | prCtrlClose = &(data->rUARTCtrlCLOSE); |
| 209 | pUart_CMD_FUNC[dev]->Close(dev,(module_type)(prCtrlClose->u4OwenrId)); |
| 210 | #if defined(__UARTCORE_SUPPORT__) && !defined(UARTCORE_NOT_PRESENT) && !defined(__UARTCORE_TASK_DISABLE__)&&!defined(DRV_DEBUG) |
| 211 | if(uart_open_event>0){ |
| 212 | uart_open_event--; |
| 213 | } |
| 214 | #endif |
| 215 | } |
| 216 | break; |
| 217 | |
| 218 | case SIO_CMD_PURGE: |
| 219 | { |
| 220 | UART_CTRL_PURGE_T* prCtrlPurge; |
| 221 | prCtrlPurge = &(data->rUARTCtrlPURGE); |
| 222 | pUart_CMD_FUNC[dev]->Purge(dev,(UART_buffer)(prCtrlPurge->dir),(module_type)(prCtrlPurge->u4OwenrId) ); |
| 223 | } |
| 224 | break; |
| 225 | |
| 226 | case SIO_CMD_SET_OWNER: |
| 227 | { |
| 228 | UART_CTRL_OWNER_T* prCtrlOwner; |
| 229 | prCtrlOwner = &(data->rUARTCtrlOWNER); |
| 230 | pUart_CMD_FUNC[dev]->SetOwner(dev, (module_type) (prCtrlOwner->u4OwenrId)); |
| 231 | } |
| 232 | break; |
| 233 | |
| 234 | case SIO_CMD_CLR_RX_BUF: |
| 235 | { |
| 236 | UART_CTRL_CLR_BUFFER_T* prCtrlClrBuffer; |
| 237 | prCtrlClrBuffer = &(data->rUARTCtrlCLRBUFFER); |
| 238 | pUart_CMD_FUNC[dev]->ClrRxBuffer(dev, (module_type) (prCtrlClrBuffer->u4OwenrId)); |
| 239 | } |
| 240 | break; |
| 241 | |
| 242 | case SIO_CMD_CLR_TX_BUF: |
| 243 | { |
| 244 | UART_CTRL_CLR_BUFFER_T* prCtrlClrBuffer; |
| 245 | prCtrlClrBuffer = &(data->rUARTCtrlCLRBUFFER); |
| 246 | pUart_CMD_FUNC[dev]->ClrTxBuffer(dev, (module_type) (prCtrlClrBuffer->u4OwenrId)); |
| 247 | } |
| 248 | break; |
| 249 | |
| 250 | case SIO_CMD_GET_OWNER_ID: |
| 251 | { |
| 252 | UART_CTRL_OWNER_T* prCtrlOwner; |
| 253 | prCtrlOwner = &(data->rUARTCtrlOWNER); |
| 254 | prCtrlOwner->u4OwenrId = pUart_CMD_FUNC[dev]->GetOwnerID(dev); |
| 255 | } |
| 256 | break; |
| 257 | |
| 258 | // Other SIO configuration related commands |
| 259 | case SIO_CMD_SET_FLOW_CTRL: |
| 260 | { |
| 261 | UART_CTRL_FLOW_CTRL_T* prCtrlFlowCtrl; |
| 262 | prCtrlFlowCtrl = &(data->rUARTCtrlFLOWCTRL); |
| 263 | pUart_CMD_FUNC[dev]->SetFlowCtrl(dev,(kal_bool)(prCtrlFlowCtrl->bXON),(module_type)(prCtrlFlowCtrl->u4OwenrId)); |
| 264 | } |
| 265 | break; |
| 266 | |
| 267 | case SIO_CMD_CONFIG_ESCAPE: |
| 268 | { |
| 269 | UART_CTRL_CONFIG_ESP_T* prCtrlConfigEsp; |
| 270 | prCtrlConfigEsp = &(data->rUARTCtrlCONFIGESP); |
| 271 | pUart_CMD_FUNC[dev]->ConfigEscape(dev, prCtrlConfigEsp->uEscChar, prCtrlConfigEsp->u2ESCGuardtime, (module_type) (prCtrlConfigEsp->u4OwenrId)); |
| 272 | } |
| 273 | break; |
| 274 | |
| 275 | case SIO_CMD_SET_DCB_CONFIG: |
| 276 | { |
| 277 | UARTDCBStruct *prDCB; |
| 278 | UART_CTRL_DCB_T* prCtrlDCB; |
| 279 | prCtrlDCB = &(data->rUARTCtrlDCB); |
| 280 | prDCB = (UARTDCBStruct*)(&(prCtrlDCB->rUARTConfig)); |
| 281 | pUart_CMD_FUNC[dev]->SetDCBConfig(dev,prDCB,(module_type)(prCtrlDCB->u4OwenrId)); |
| 282 | } |
| 283 | break; |
| 284 | |
| 285 | case SIO_CMD_CTRL_DCD: // Not used in MT6290 UART |
| 286 | DEBUG_ASSERT(0); |
| 287 | break; |
| 288 | |
| 289 | case SIO_CMD_CTRL_BREAK: |
| 290 | { |
| 291 | UART_CTRL_BREAK_T* prCtrlBreak; |
| 292 | prCtrlBreak = &(data->rUARTCtrlBREAK); |
| 293 | pUart_CMD_FUNC[dev]->CtrlBreak(dev, (IO_level) (prCtrlBreak->rIOLevelBRK), (module_type) (prCtrlBreak->u4OwenrId)); |
| 294 | } |
| 295 | break; |
| 296 | |
| 297 | case SIO_CMD_SET_BAUDRATE: |
| 298 | { |
| 299 | UART_CTRL_BAUDRATE_T* prCtrlBaudrate; |
| 300 | prCtrlBaudrate = &(data->rUARTCtrlBAUDRATE); |
| 301 | pUart_CMD_FUNC[dev]->SetBaudRate(dev, prCtrlBaudrate->baudrate, (module_type)(prCtrlBaudrate->u4OwenrId)); |
| 302 | } |
| 303 | break; |
| 304 | |
| 305 | case SIO_CMD_SET_AUTOBAUD_DIV: // LTE TBC |
| 306 | DEBUG_ASSERT(0); |
| 307 | break; |
| 308 | |
| 309 | case SIO_CMD_READ_DCB_CONFIG: |
| 310 | { |
| 311 | UARTDCBStruct *prDCB; |
| 312 | UART_CTRL_DCB_T* prCtrlDCB; |
| 313 | prCtrlDCB = &(data->rUARTCtrlDCB); |
| 314 | prDCB = (UARTDCBStruct*) &(prCtrlDCB->rUARTConfig); |
| 315 | pUart_CMD_FUNC[dev]->ReadDCBConfig(dev, prDCB); |
| 316 | } |
| 317 | break; |
| 318 | |
| 319 | case SIO_CMD_CTRL_RI: // Not used in MT6290 UART |
| 320 | DEBUG_ASSERT(0); |
| 321 | break; |
| 322 | |
| 323 | case SIO_CMD_GET_ESCAPE_INFO: |
| 324 | { |
| 325 | UART_CTRL_CONFIG_ESP_T* prCtrlConfigEsp; |
| 326 | prCtrlConfigEsp = &(data->rUARTCtrlCONFIGESP); |
| 327 | prCtrlConfigEsp->u2ESCGuardtime = UARTPort[dev].ESCDet.GuardTime; |
| 328 | prCtrlConfigEsp->uEscChar = UARTPort[dev].ESCDet.EscChar; |
| 329 | } |
| 330 | break; |
| 331 | |
| 332 | case SIO_CMD_CTRL_DTR: // Not used in MT6290 UART |
| 333 | case SIO_CMD_READ_HW_STATUS: // Not used in MT6290 UART (assert temporary) |
| 334 | |
| 335 | // Not used commands in driver level (TTY would handle/wrap these commands from conventional upper layer module) |
| 336 | case SIO_CMD_GET_BYTES: |
| 337 | case SIO_CMD_PUT_BYTES: |
| 338 | case SIO_CMD_GET_RX_AVAIL: |
| 339 | case SIO_CMD_GET_TX_AVAIL: |
| 340 | case SIO_CMD_PUT_ISR_BYTES: |
| 341 | case SIO_CMD_GET_ISR_TX_AVAIL: |
| 342 | case SIO_CMD_SEND_ISR_DATA: |
| 343 | case SIO_CMD_SEND_DATA: |
| 344 | case SIO_CMD_REG_TX_CB: |
| 345 | case SIO_CMD_REG_RX_CB: |
| 346 | case SIO_CMD_PUT_UART_BYTE: |
| 347 | case SIO_CMD_GET_UART_BYTE: |
| 348 | case SIO_CMD_PUT_UART_BYTES: |
| 349 | DEBUG_ASSERT(0); |
| 350 | break; |
| 351 | |
| 352 | // ??? |
| 353 | case SIO_CMD_GET_UART_BYTE_WITH_TIMEOUT: |
| 354 | // temporary |
| 355 | DEBUG_ASSERT(0); |
| 356 | { |
| 357 | UART_CTRL_GET_UART_BYTE_WITH_TIMEOUT_T* prCtrlGetUartByte; |
| 358 | prCtrlGetUartByte = &(data->rUARTCtrlGETUARTBYTEWithTimeOut); |
| 359 | prCtrlGetUartByte->u1retByte = pUart_CMD_FUNC[dev]->GetUARTByte_WithTimeOut(dev, &(prCtrlGetUartByte->uByte), prCtrlGetUartByte->u4timeout_value); |
| 360 | } |
| 361 | break; |
| 362 | |
| 363 | // Only UART driver need to take care |
| 364 | case UART_CMD_SET_FIFO_TRIGGER: |
| 365 | { |
| 366 | UART_CTRL_SFT_T* prCtrlSFT; |
| 367 | prCtrlSFT = &(data->rUARTCtrlSFT); |
| 368 | UART_set_FIFO_trigger(dev, prCtrlSFT->tx_level, prCtrlSFT->rx_level); |
| 369 | } |
| 370 | break; |
| 371 | |
| 372 | case UART_CMD_POWER_ON: |
| 373 | break; |
| 374 | |
| 375 | case UART_CMD_CHECK_TX_BUF_EMPTY: |
| 376 | { |
| 377 | UART_CTRL_CHECK_TBE_T* prCtrlTBE; |
| 378 | prCtrlTBE = &(data->rUARTCtrlCheckBUFEMP); |
| 379 | prCtrlTBE->bFlag = UART_CheckTxBufferEmpty(dev); |
| 380 | } |
| 381 | break; |
| 382 | |
| 383 | case UART_CMD_CHECK_TX_SEND_OUT: |
| 384 | { |
| 385 | UART_CTRL_CHECK_TSO_T* prCtrlTSO; |
| 386 | prCtrlTSO = &(data->rUARTCtrlCheckTXSendOut); |
| 387 | prCtrlTSO->bFlag = UART_CheckTxAllSentOut(dev); |
| 388 | } |
| 389 | break; |
| 390 | |
| 391 | case UART_CMD_GET_TX_BUF_SIZE: |
| 392 | DEBUG_ASSERT(0); |
| 393 | { |
| 394 | UART_CTRL_GET_TBS_T* prCtrlGetTBS; |
| 395 | prCtrlGetTBS = &(data->rUARTCtrlGetTxBufSize); |
| 396 | UART_GetTxBufferSize(dev, (kal_uint32 *)(prCtrlGetTBS->ptotal_size), (kal_uint32 *)(prCtrlGetTBS->preturn_size)); |
| 397 | } |
| 398 | break; |
| 399 | |
| 400 | case UART_CMD_SLEEP_TX_ENABLE: |
| 401 | return STATUS_UNSUPPORTED; |
| 402 | |
| 403 | case UART_CMD_CTRL_SLEEP_MODE: |
| 404 | { |
| 405 | UART_CTRL_SLEEP_ENABLE_T* prCtrlSleepEnable; |
| 406 | prCtrlSleepEnable = &(data->rUARTCtrlSleepEnable); |
| 407 | UART_SetSleepEnable(dev, (kal_bool) prCtrlSleepEnable->bFlag); |
| 408 | } |
| 409 | break; |
| 410 | case UART_CMD_SWITCH_PORT: |
| 411 | return STATUS_UNSUPPORTED; |
| 412 | |
| 413 | case UART_CMD_BOOTUP_INIT: |
| 414 | { |
| 415 | UART_Bootup_Init(); |
| 416 | } |
| 417 | break; |
| 418 | |
| 419 | case UART_CMD_BOOT_PUTBYTES: |
| 420 | { |
| 421 | UART_CTRL_BOOT_PUTBYTES_T* prCtrlPutBytes; |
| 422 | prCtrlPutBytes = &(data->rUARTCtrlBootPutBytes); |
| 423 | UART_Boot_PutUARTBytes(dev,prCtrlPutBytes->puBuffaddr, prCtrlPutBytes->u2Length); |
| 424 | } |
| 425 | break; |
| 426 | |
| 427 | case UART_CMD_LOOPBACK: |
| 428 | { |
| 429 | UART_loopback(dev); |
| 430 | } |
| 431 | break; |
| 432 | |
| 433 | case UART_CMD_ASSERT_WAIT_SEND_OUT: |
| 434 | { |
| 435 | UART_AssertWaitPrevDataSentOut(dev); |
| 436 | } |
| 437 | break; |
| 438 | |
| 439 | case UART_CMD_CTRL_USE_VFIFO: |
| 440 | return STATUS_UNSUPPORTED; |
| 441 | DEBUG_ASSERT(0); |
| 442 | { |
| 443 | // UART_CTRL_USE_VFIFO_T* prCtrlUseVfifo; |
| 444 | // prCtrlUseVfifo = &(data->rUARTCtrlUseVFifo); |
| 445 | // UART_UseVFIFO(dev,prCtrlUseVfifo->bUseVFifo); |
| 446 | } |
| 447 | break; |
| 448 | |
| 449 | case UART_CMD_GET_FLOW_CONTROL: |
| 450 | { |
| 451 | UART_CTRL_GET_FC_T* prCtrlFlowControl; |
| 452 | prCtrlFlowControl = &(data->rUARTCtrlGetFC); |
| 453 | prCtrlFlowControl->FlowCtrlMode = (UART_FLOW_CTRL_MODE_T) U_GetFlowCtrl(dev, prCtrlFlowControl->u4OwenrId); |
| 454 | } |
| 455 | break; |
| 456 | |
| 457 | case UART_CMD_REG_DEF_CB: |
| 458 | DEBUG_ASSERT(0); |
| 459 | break; |
| 460 | |
| 461 | case UART_CMD_BMT_PUT_BYTES: |
| 462 | { |
| 463 | #ifdef DRV_DEBUG |
| 464 | UART_CTRL_PUT_BYTES_T* prCtrlBMTPutBytes; |
| 465 | prCtrlBMTPutBytes = &(data->rUARTCtrlPUTBYTES); |
| 466 | BMT_PutBytes(dev, prCtrlBMTPutBytes->puBuffaddr, prCtrlBMTPutBytes->u2Length); |
| 467 | #endif |
| 468 | } |
| 469 | break; |
| 470 | |
| 471 | case UART_CMD_GET_MAX_BAUDRATE: |
| 472 | { |
| 473 | UART_CTRL_GET_MAXBAUDRATE_T* prCtrlGetMaxBaudrate; |
| 474 | prCtrlGetMaxBaudrate = &(data->rUARTCtrlGetMaxBaudrate); |
| 475 | prCtrlGetMaxBaudrate->max_baudrate = UART_Get_Maxbaudrate(dev); |
| 476 | } |
| 477 | break; |
| 478 | |
| 479 | case UART_CMD_RECHANDLER_VFIFO: |
| 480 | case UART_CMD_TRXHANDLER_VFIFO: |
| 481 | case UART_CMD_RECTIMEOUTHANDLE: |
| 482 | case UART_CMD_CTRL_TX_DMA: |
| 483 | DEBUG_ASSERT(0); |
| 484 | { |
| 485 | UART_CTRL_USE_VFIFO_T* prCtrlTxDMA; |
| 486 | prCtrlTxDMA = &(data->rUARTCtrlUseVFifo); |
| 487 | UART_VFIFO_TX_DMA_Enable(dev,(kal_bool)(prCtrlTxDMA->bUseVFifo)); |
| 488 | } |
| 489 | break; |
| 490 | |
| 491 | // TTY commands |
| 492 | case TTY_CMD_GET_CHUNK_SIZE: |
| 493 | { |
| 494 | UART_CTRL_GET_CHUNK_SIZE_T *prCtrlGetChunkSize; |
| 495 | prCtrlGetChunkSize = &(data->rUARTCtrlGETCHUNKSIZE); |
| 496 | prCtrlGetChunkSize->chunkSize = UART_CHUNK_SIZE; |
| 497 | } |
| 498 | break; |
| 499 | |
| 500 | case TTY_CMD_ASSIGN_RX_IOR: |
| 501 | { |
| 502 | UART_CTRL_ASSIGN_RX_IOR_T *prCtrlAssignRxIor; |
| 503 | prCtrlAssignRxIor = &(data->rUARTCtrlAssignRxIor); |
| 504 | UART_GetBytesIor(dev, prCtrlAssignRxIor->ior); |
| 505 | } |
| 506 | break; |
| 507 | |
| 508 | case TTY_CMD_NEED_TX_DONE_CB: |
| 509 | { |
| 510 | UART_CTRL_NEED_TX_DONE_CB_T *prNeedTxDoneCb; |
| 511 | prNeedTxDoneCb = &(data->rUARTCtrlNeedTxDoneCb); |
| 512 | UART_SetNeedTxDoneCb(dev, prNeedTxDoneCb->needTxDoneCb, prNeedTxDoneCb->u4OwnerId); |
| 513 | } |
| 514 | break; |
| 515 | |
| 516 | case TTY_CMD_GET_DRV_STATE: |
| 517 | { |
| 518 | UART_CTRL_GET_DRV_STATE_T *prGetDrvState; |
| 519 | prGetDrvState = &(data->rUARTCtrlGetDrvState); |
| 520 | prGetDrvState->drv_state = DRV_ST_ATTACHED; |
| 521 | } |
| 522 | break; |
| 523 | |
| 524 | case TTY_CMD_PUT_BYTES_IOR: |
| 525 | { |
| 526 | UART_CTRL_PUT_BYTES_IOR_T *prCtrlPutBytesIor; |
| 527 | prCtrlPutBytesIor = &(data->rUARTCtrlPUTBYTESIOR); |
| 528 | UART_PutBytesIor(dev, prCtrlPutBytesIor->putIor); |
| 529 | } |
| 530 | break; |
| 531 | |
| 532 | case TTY_CMD_PUT_BYTES_IOR_LIGHT: |
| 533 | { |
| 534 | UART_CTRL_PUT_BYTES_IOR_T *prCtrlPutBytesIor; |
| 535 | prCtrlPutBytesIor = &(data->rUARTCtrlPUTBYTESIOR); |
| 536 | UART_PutBytesIor_LIGHT(dev, prCtrlPutBytesIor->putIor); |
| 537 | } |
| 538 | break; |
| 539 | |
| 540 | // TTY commands for exception |
| 541 | case TTY_CMD_EXCEPTION_RESET: |
| 542 | break; |
| 543 | |
| 544 | case TTY_CMD_EXCEPTION_HIF_INIT: |
| 545 | { |
| 546 | return_status = uart_ecpt_init_hif(dev); |
| 547 | } |
| 548 | break; |
| 549 | |
| 550 | case TTY_CMD_EXCEPTION_CLEAR_CHANNEL: |
| 551 | { |
| 552 | return_status = uart_ecpt_clear_ch(dev); |
| 553 | } |
| 554 | break; |
| 555 | |
| 556 | case TTY_CMD_EXCEPTION_TX_GPD: |
| 557 | { |
| 558 | TTY_CTRL_EXCP_TX_GPD_T* prCtrlExptTxGpd; |
| 559 | prCtrlExptTxGpd = &(data->rTTYCtrlExcpTxGPD); |
| 560 | return_status = uart_ecpt_tx_gpd(dev, prCtrlExptTxGpd->first_gpd, prCtrlExptTxGpd->last_gpd); |
| 561 | } |
| 562 | break; |
| 563 | |
| 564 | case TTY_CMD_EXCEPTION_TX_DONE_INFO: |
| 565 | { |
| 566 | TTY_CTRL_EXCP_TX_DONE_INFO_T* prCtrlExptTxDoneInfo; |
| 567 | prCtrlExptTxDoneInfo = &(data->rTTYCtrlExcpTxDoneInfo); |
| 568 | return_status = uart_ecpt_tx_done_info(dev, &(prCtrlExptTxDoneInfo->first_gpd), &(prCtrlExptTxDoneInfo->last_gpd), (kal_uint32 *) &(prCtrlExptTxDoneInfo->num)); |
| 569 | } |
| 570 | break; |
| 571 | |
| 572 | case TTY_CMD_EXCEPTION_HIF_STATE: |
| 573 | { |
| 574 | TTY_CTRL_EXCP_HIF_STATE_T* prCtrlExptHifState; |
| 575 | prCtrlExptHifState = &(data->rTTYCtrlExcpHifState); |
| 576 | prCtrlExptHifState->hif_state = uart_ecpt_get_tx_state(dev); //HIF_STATE_NORMAL |
| 577 | |
| 578 | } |
| 579 | break; |
| 580 | |
| 581 | case TTY_CMD_EXCEPTION_ASSIGN_RX_GPD: |
| 582 | { |
| 583 | TTY_CTRL_EXCP_ASSIGN_RX_GPD_T* prCtrlExptAssignRxGpd; |
| 584 | prCtrlExptAssignRxGpd = &(data->rTTYCtrlExcpAssignRxGPD); |
| 585 | return_status = uart_ecpt_assign_rx_gpd(dev, prCtrlExptAssignRxGpd->first_gpd, prCtrlExptAssignRxGpd->last_gpd); |
| 586 | } |
| 587 | break; |
| 588 | |
| 589 | case TTY_CMD_EXCEPTION_GET_RX_GPD: |
| 590 | { |
| 591 | TTY_CTRL_EXCP_GET_RX_GPD_T* prCtrlExptGetRxGpd; |
| 592 | prCtrlExptGetRxGpd = &(data->rTTYCtrlExcpGetRxGPD); |
| 593 | return_status = uart_ecpt_get_rx_gpd(dev, &(prCtrlExptGetRxGpd->first_gpd), &(prCtrlExptGetRxGpd->last_gpd), (kal_uint32 *) &(prCtrlExptGetRxGpd->num)); |
| 594 | } |
| 595 | break; |
| 596 | |
| 597 | case TTY_CMD_EXCEPTION_HIF_POLL: |
| 598 | { |
| 599 | TTY_CTRL_EXCP_HIF_POLL_T* pCtrlHifPoll; |
| 600 | pCtrlHifPoll = &(data->rTTYCtrlExcpHifPoll); |
| 601 | pCtrlHifPoll->reset_event = DCL_FALSE; |
| 602 | } |
| 603 | break; |
| 604 | |
| 605 | default: |
| 606 | return STATUS_INVALID_CMD; |
| 607 | } |
| 608 | |
| 609 | return return_status; |
| 610 | } |