blob: 76142346952f84beb6562eec9a9f8fdf5320aa5b [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
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
147UartDriver_strcut* pUart_CMD_FUNC[MAX_UART_PORT_NUM];
148kal_uint32 uart_open_event = 0;
149extern UARTStruct UARTPort[];
150extern kal_uint32 uart_ecpt_get_tx_state(UART_PORT port);
151extern void UART_PDN_Disable(UART_PORT port);
152extern void UART_PDN_Enable(UART_PORT port);
153extern void dbg_uart_init(void);
154#ifndef KTEST_UART_TRACES
155extern void dbg_uart_create_spinlock(void);
156#endif
157static DCL_STATUS UART_Handler(DCL_DEV dev,DCL_CTRL_CMD cmd, DCL_CTRL_DATA_T *data);
158
159Seriport_HANDLER_T Uart_Drv_Handler = {DCL_UART_TYPE, UART_Handler};
160//extern UART_flowCtrlMode UART_GetFlowCtrl(UART_PORT uart_port);
161
162DCL_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}