comparison g23m-aci/aci/cmh_uarts.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:75a11d740a02
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GSM-PS (6147)
4 | Modul : CMH_UARTS
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose :
18 +-----------------------------------------------------------------------------
19 */
20
21 #include "config.h"
22 #include "fixedconf.h"
23 #include "condat-features.h"
24 #include "aci_conf.h"
25
26 #ifdef UART
27
28 #ifndef CMH_UARTS_C
29 #define CMH_UARTS_C
30 #endif
31
32 #include "aci_all.h"
33 /*==== INCLUDES ===================================================*/
34 #include "aci_cmh.h"
35 #include "ati_cmd.h"
36 #include "aci_cmd.h"
37 #include "dti.h" /* functionality of the dti library */
38
39 #include "aci.h"
40 #include "psa.h"
41 #include "aci_fd.h"
42 #include "cmh.h"
43
44 #include "aci_lst.h"
45
46 #include "dti_conn_mng.h"
47 #include "dti_cntrl_mng.h"
48 #include "psa_uart.h"
49 #include "cmh_uart.h"
50 #include "sap_dti.h"
51 #ifdef FF_PSI
52 #include "psa_psi.h"
53 #include "cmh_psi.h"
54 #endif /*FF_PSI*/
55 #include "aci_mem.h"
56 #include "aci_io.h"
57 #include "l4_tim.h"
58
59 #include "psa_cc.h"
60
61 typedef struct /* + IPR parameter */
62 {
63 T_ACI_BD_RATE rate;
64 T_ACI_CMD_SRC srcId;
65 }
66 T_ACI_IPR;
67
68 EXTERN T_ACI_LIST *ati_src_list;
69
70 /*==== CONSTANTS ==================================================*/
71
72 /*==== EXPORT =====================================================*/
73 EXTERN char *cmdErrStr; /* Error Message */
74 static T_ACI_IPR uart_ipr_param;
75 EXTERN CHAR *cmdAtError (AtErrCode e);
76
77 /*==== VARIABLES ==================================================*/
78
79 GLOBAL T_ACI_LIST *uart_src_params = NULL;
80 GLOBAL T_ACI_UART_MUX_PARMS holdMuxParms;
81
82 /*
83 * uart_com_par: Lists all COM parameter for every device.
84 *
85 * This list is only used so long as the UART SAP don't support parameter getting.
86 *
87 */
88 GLOBAL T_ACI_LIST *uart_com_par = NULL;
89
90 /*==== FUNCTIONS ==================================================*/
91
92 GLOBAL void cmhUART_lst_init (void)
93 {
94 TRACE_FUNCTION ("cmhUART_lst_init()");
95 uart_src_params = new_list ();
96 /*psi_src_params = new_list();*/
97
98 if ( !uart_com_par )
99 uart_com_par = new_list ();
100 /* if (!psi_dev_list)
101 psi_dev_list = new_list();*/
102 }
103
104
105 GLOBAL T_ACI_BD_RATE convert_mux_port_speed (UBYTE mux_port_speed)
106 {
107 switch (mux_port_speed)
108 {
109 case 1:
110 return (BD_RATE_9600);
111
112 case 2:
113 return (BD_RATE_19200);
114
115 case 3:
116 return (BD_RATE_38400);
117
118 case 4:
119 return (BD_RATE_57600);
120
121 case 5:
122 return (BD_RATE_115200);
123
124 default:
125 return (BD_RATE_NotPresent);
126 }
127 }
128
129 /*
130 +-------------------------------------------------------------------+
131 | PROJECT : GSM-PS (6147) MODULE : CMH_PHBS |
132 | STATE : code ROUTINE : sAT_PlusCMUX |
133 +-------------------------------------------------------------------+
134
135 PURPOSE : This is the functional counterpart of the +CMUX
136 AT command which is responsible for starting multiplexing transactions.
137
138 */
139 GLOBAL T_ACI_RETURN sAT_PlusCMUX ( T_ACI_CMD_SRC srcId,
140 UBYTE mode,
141 UBYTE subset,
142 UBYTE port_speed,
143 USHORT N1,
144 UBYTE T1,
145 UBYTE N2,
146 UBYTE T2,
147 UBYTE T3 )
148 {
149
150 #ifdef DTI
151 T_ACI_DTI_PRC *src_infos = NULL;
152 T_ACI_UART_MUX_PARMS *MuxParms = NULL;
153 T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, (UBYTE)srcId, search_ati_src_id);
154
155 TRACE_FUNCTION ("sAT_PlusCMUX()");
156
157 if(!cmh_IsVldCmdSrc (srcId))
158 {
159 return (AT_FAIL);
160 }
161
162 src_infos = find_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId);
163 if (src_infos EQ NULL)
164 {
165 TRACE_EVENT_P1("[ERR] sAT_PlusCMUX(): srcId=%d not found", srcId) ;
166 return (AT_FAIL);
167 }
168
169 /*
170 * AT+CMUX needs to get the answer OK before it sends the
171 * primitives to UART, because channel is then already closed.
172 */
173 io_sendConfirm ( (UBYTE)srcId, cmdAtError ( atOk ), ATI_NORMAL_OUTPUT );
174 cmdErrStr = NULL;
175
176 ACI_MALLOC( src_infos ->MuxParms, sizeof(T_ACI_UART_MUX_PARMS) );
177
178 MuxParms = src_infos -> MuxParms;
179 /* memorize parameters */
180 MuxParms->mode = mode;
181 MuxParms->subset = subset;
182 MuxParms->port_speed = port_speed;
183 MuxParms->N1 = N1;
184 MuxParms->T1 = T1;
185 MuxParms->N2 = N2;
186 MuxParms->T2 = T2;
187 MuxParms->T3 = T3;
188
189 if ((src_infos->data_buffer.data_list EQ NULL)
190 AND (aci_src_dti_params[srcId].dtxState EQ READY) )
191 {
192 uartEntcurCmd[srcId] = AT_CMD_NONE;
193 if ((cmhUART_CMUX (srcId)) EQ FALSE)
194 {
195 /*
196 * we already sent an OK according to GSM 27.010, but now the muxer is not ready !
197 * this AT_FAIL results in a ATI_FAIL_NO_OUTPUT at function setatPlusCMUX().
198 * so, what will the source do in this case ?
199 */
200 TRACE_EVENT("[ERR] sAT_PlusCMUX()(): UART muxer not ready");
201 return (AT_FAIL);
202 }
203 }
204 else
205 {
206 /*Now we wait for the dtx state to be ready and the multiplexer will be started
207 from function sig_dti_tx_buffer_ready_ind() after the data buffer of the source is
208 emptied*/
209 uartEntcurCmd[srcId] = AT_CMD_CMUX;
210 }
211 return ( AT_EXCT );
212 #else
213 return ( AT_FAIL );
214 #endif /* DTI */
215
216 }
217
218 GLOBAL T_ACI_RETURN qAT_PlusCMUX ( T_ACI_CMD_SRC srcId,
219 UBYTE *mode,
220 UBYTE *subset,
221 UBYTE *port_speed,
222 USHORT *N1,
223 UBYTE *T1,
224 UBYTE *N2,
225 UBYTE *T2,
226 UBYTE *T3 )
227 {
228 TRACE_FUNCTION ("qAT_PlusCMUX()");
229
230 if ( (holdMuxParms.mode EQ 0) AND (holdMuxParms.subset EQ 0) AND
231 (holdMuxParms.port_speed EQ 0) AND (holdMuxParms.N1 EQ 0) AND
232 (holdMuxParms.T1 EQ 0) AND (holdMuxParms.N2 EQ 0) AND
233 (holdMuxParms.T2 EQ 0) AND (holdMuxParms.T3 EQ 0) )
234 {
235 TRACE_FUNCTION("No Mux is enabled");
236 return (AT_FAIL);
237 }
238 *mode = holdMuxParms.mode;
239 *subset = holdMuxParms.subset;
240 *port_speed = holdMuxParms.port_speed;
241 *N1 = holdMuxParms.N1;
242 *T1 = holdMuxParms.T1;
243 *N2 = holdMuxParms.N2;
244 *T2 = holdMuxParms.T2;
245 *T3 = holdMuxParms.T3;
246
247 return ( AT_CMPL );
248 }
249
250 GLOBAL BOOL cmhUART_CMUX (T_ACI_CMD_SRC srcId)
251 {
252 T_ACI_DTI_PRC *src_infos = NULL;
253 T_ACI_BD_RATE speed = BD_RATE_NotPresent;
254
255 TRACE_FUNCTION ("cmhUART_CMUX()");
256
257 src_infos = find_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId);
258
259 if (src_infos EQ NULL)
260 {
261 TRACE_EVENT_P1("[ERR] sAT_PlusCMUX(): srcId=%d not found", srcId) ;
262 return (FALSE);
263 }
264
265 if (cmhUART_stopConnection ((UBYTE)srcId))
266 {
267 if (src_infos->MuxParms)
268 {
269 speed = convert_mux_port_speed (src_infos->MuxParms->port_speed);
270
271 if ( speed NEQ BD_RATE_NotPresent )
272 {
273 /*
274 * at first we have to change the baud rate (primitive to UART)
275 */
276 if (cmhUART_SetDataRate ((UBYTE)srcId, speed) EQ AT_EXCT)
277 {
278 return (TRUE);
279 }
280 else
281 {
282 TRACE_EVENT("[ERR] cmhUART_CMUX(): not able to change baud rate");
283 return (FALSE);
284 }
285 }
286 /*
287 * void function, sends the UART_MUX_START_REQ primitive
288 * return value is handled by the confirmation
289 */
290 psaUART_StartMux( src_infos->device,
291 src_infos->MuxParms->mode,
292 src_infos->MuxParms->subset,
293 src_infos->MuxParms->N1,
294 src_infos->MuxParms->T1,
295 src_infos->MuxParms->N2,
296 src_infos->MuxParms->T2,
297 src_infos->MuxParms->T3);
298
299 memcpy( (CHAR *)&holdMuxParms, (CHAR *)src_infos->MuxParms, sizeof(T_ACI_UART_MUX_PARMS));
300 ACI_MFREE( src_infos->MuxParms );
301 src_infos->MuxParms = NULL;
302 return (TRUE);
303 }
304 else
305 {
306 TRACE_EVENT("[ERR] cmhUART_CMUX(): no muxer parameters available");
307 }
308 }
309 else
310 {
311 TRACE_EVENT("[ERR] cmhUART_CMUX(): not able to stop UART connection");
312 }
313 return (FALSE);
314 }
315
316 /*
317 +-------------------------------------------------------------------+
318 | PROJECT : GSM-PS (6147) MODULE : CMH_DTIS |
319 | ROUTINE : cmhUART_getdata |
320 +-------------------------------------------------------------------+
321
322 PURPOSE : tell DTI that ACI is ready to receive more datas.
323 */
324 GLOBAL void cmhUART_getdata ( T_ACI_CMD_SRC srcId )
325 {
326 TRACE_FUNCTION ("cmhUART_getdata");
327
328 #ifdef RMV_01_04_03
329 #ifdef FF_TWO_UART_PORTS
330 if (srcId NEQ UART_DATA_CHANNEL)
331 {
332 psaDTI_getdata ( (UBYTE)srcId, DTI_ENTITY_UART);
333 }
334 #else
335 psaDTI_getdata ( (UBYTE)srcId, DTI_ENTITY_UART);
336 #endif
337 #endif
338
339 psaDTI_getdata ( (UBYTE)srcId, DTI_ENTITY_UART);
340
341 }
342
343 /*
344 +-------------------------------------------------------------------+
345 | PROJECT : GSM-PS (6147) MODULE : CMH_DTIS |
346 | ROUTINE : cmhUART_startConnection |
347 +-------------------------------------------------------------------+
348
349 PURPOSE : start a DTI connection with UART.
350 */
351
352 GLOBAL void cmhUART_startConnection (UBYTE srcId,
353 T_ACI_DEVICE_TYPE device_type)
354 {
355 T_ACI_DTI_PRC *src_infos;
356 T_ACI_DEVICE_ENTRY *device_entry;
357 T_ACI_DEVICE_TYPE curr_device_type;
358 T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_ACI};
359
360 TRACE_FUNCTION ("cmhUART_startConnection ()");
361
362 src_infos = find_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId);
363 if (src_infos EQ NULL)
364 {
365 TRACE_EVENT_P1("[ERR] cmhUART_startConnection: srcId=%d not found",
366 srcId) ;
367 return ;
368 }
369
370 device_entry = cmhUART_GetDeviceParOverDevice( src_infos->device );
371
372 if ( device_entry EQ NULL )
373 {
374 TRACE_EVENT_P1("[ERR] cmhUART_startConnection: device=%d not found", src_infos->device) ;
375 return;
376 }
377
378 curr_device_type = cmhUART_GetDeviceType (srcId);
379
380 switch (curr_device_type)
381 {
382 case DEVICE_TYPE_UNKNOWN:
383 /* register device to the DTI Control Manager */
384 #ifdef DTI
385 dti_cntrl_new_device ( srcId, /* ATI source ID */
386 DTI_ENTITY_UART, /* device ID */
387 src_infos->device, /* device number */
388 src_infos->dlci, /* sub-channel number */
389 DTI_PORT_NUMBER_NOTPRESENT, /* ATI-RIV port number */
390 DTI_CPBLTY_CMD | DTI_CPBLTY_SER, /* capabilities */
391 DTI_DRIVER_ID_NOTPRESENT,
392 DTI_DIO_ID_NOTPRESENT);
393
394 #endif /* DTI */
395 /* set device type */
396 cmhUART_ChangeDeviceType (srcId, device_type);
397 break;
398
399 default:
400 break;
401 } /* switch */
402
403 if (device_type EQ DEVICE_TYPE_URT)
404 {
405 /* initialize UART */
406 psaUART_SetParameters (src_infos->device, &device_entry->comPar);
407 /* has to wait for confirmation before setting DTI channel */
408 return;
409 }
410 #ifdef DTI
411 /* request of a DTI channel to communicate with UART */
412 dti_cntrl_est_dpath_indirect ( src_infos->srcId,
413 entity_list,
414 1,
415 SPLIT,
416 atiUART_dti_cb,
417 DTI_CPBLTY_CMD,
418 DTI_CID_NOTPRESENT);
419 #endif
420 }
421 /*
422 +-------------------------------------------------------------------+
423 | PROJECT : GSM-PS (6147) MODULE : CMH_DTIS |
424 | ROUTINE : cmhUART_stopConnection |
425 +-------------------------------------------------------------------+
426
427 PURPOSE : stop a DTI connection with UART.
428 */
429 GLOBAL BOOL cmhUART_stopConnection (UBYTE srcId)
430 {
431 T_ACI_DTI_PRC *src_infos;
432
433 TRACE_FUNCTION ("cmhUART_stopConnection()");
434
435 src_infos = find_element (uart_src_params, (UBYTE)srcId, cmhUARTtest_srcId);
436 if (src_infos EQ NULL)
437 {
438 TRACE_EVENT_P1("[ERR] cmhUART_stopConnection: srcId=%d not found",
439 srcId) ;
440 return (FALSE);
441 }
442
443 src_infos->LineState = LINE_DISCONNECTED;
444
445 if (cmhUART_ChangeDeviceType (src_infos->srcId, DEVICE_TYPE_UNKNOWN))
446 {
447 #ifdef DTI
448 if (dti_cntrl_close_dpath_from_src_id( srcId ))
449 {
450 return (TRUE);
451 }
452 #endif
453 }
454
455 return (FALSE);
456 }
457
458 /*
459 +--------------------------------------------------------------------+
460 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
461 | STATE : code ROUTINE : sAT_PlusIPR |
462 +--------------------------------------------------------------------+
463
464 PURPOSE : This is the functional counterpart to the +IPR AT command
465 which is responsible to set the data rate.
466 */
467
468 GLOBAL void cmhUART_init_ipr_params(void)
469 {
470 TRACE_FUNCTION ("cmhUART_init_ipr_params()");
471
472 uart_ipr_param.srcId = CMD_SRC_NONE;
473 uart_ipr_param.rate = BD_RATE_NotPresent;
474 }
475
476 GLOBAL T_ACI_RETURN sAT_PlusIPR(T_ACI_CMD_SRC srcId, T_ACI_BD_RATE rate)
477 {
478 ULONG ipr_timer = 0;
479
480 TRACE_FUNCTION ("sAT_PlusIPR()");
481
482 /* check command source */
483 if(srcId EQ CMD_SRC_LCL)
484 {
485 TRACE_ERROR("This command is not supported for local command source");
486 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotSupp );
487 return AT_FAIL;
488 }
489 if(!cmh_IsVldCmdSrc (srcId))
490 {
491 return AT_FAIL;
492 }
493
494 /* parameter check */
495 if ( rate < BD_RATE_AUTO OR rate > BD_RATE_115200 ) /* maximum supported value by UART */
496 {
497 ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotSupp );
498 return AT_FAIL;
499 }
500
501 /* We need to sent the OK prior we switch to the new baudrate */
502 io_sendConfirm((UBYTE)srcId, cmdAtError(atOk), ATI_NORMAL_OUTPUT);
503 cmdErrStr = NULL;
504
505 uart_ipr_param.rate = rate;
506 uart_ipr_param.srcId = srcId;
507
508 ipr_timer = 600; /* worst case calculation: 4 characters:OK<CR><LF> at 75bit/s
509 with 1 startbit, 1 paritybit and 1 stopbit (2 stopbits are only used for longer words)
510 4*(8+1+1+1)= 44 bits => 44/75 seconds = 586 msec*/
511
512 /* time for output "OK" then send changed parameter to UART */
513 uartEntcurCmd[srcId] = AT_CMD_IPR;
514 TIMERSTART(ipr_timer, ACI_IPR);
515
516 return AT_CMPL;
517 }
518
519
520 /*
521 +--------------------------------------------------------------------+
522 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
523 | STATE : code ROUTINE : timeout_PlusIPR |
524 +--------------------------------------------------------------------+
525
526 PURPOSE : This function send the changed baudrate to UART after
527 the timer ACI_IPR is expired
528 */
529
530 GLOBAL void timeout_PlusIPR ( void)
531 {
532 #ifdef FF_PSI
533 T_ACI_DTI_PRC_PSI *src_infos = find_element (psi_src_params,
534 (UBYTE)uart_ipr_param.srcId, cmhPSItest_srcId);
535 #endif /*FF_PSI*/
536 TRACE_FUNCTION ("timeout_PlusIPR()");
537 #ifdef FF_PSI
538 if ( src_infos NEQ NULL )
539 {
540 cmhPSI_SetDataRate((UBYTE)uart_ipr_param.srcId, uart_ipr_param.rate);
541 }
542 /* force parameter request */
543 else
544 #endif /*FF_PSI*/
545 cmhUART_SetDataRate((UBYTE)uart_ipr_param.srcId, uart_ipr_param.rate);
546
547 cmhUART_init_ipr_params();
548 uartEntcurCmd[uart_ipr_param.srcId] = AT_CMD_NONE;
549 }
550
551 /*
552 +--------------------------------------------------------------------+
553 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
554 | STATE : code ROUTINE : qAT_PlusIPR |
555 +--------------------------------------------------------------------+
556
557 PURPOSE : This is the functional counterpart to the +IPR? AT command
558 which returns the current setting for the data rate.
559
560 */
561 GLOBAL T_ACI_RETURN qAT_PlusIPR ( T_ACI_CMD_SRC srcId, T_ACI_BD_RATE *rate)
562 {
563 T_ACI_DEVICE_ENTRY *device_entry = cmhUART_GetDeviceParOverSrcID( (UBYTE) srcId );
564 #ifdef FF_PSI
565 T_ACI_DEVICE_DCB_ENTRY *device_dcb_entry;
566 U32 device_type;/* RM 26-05-04 Nice */
567 #endif /*FF_PSI*/
568 TRACE_FUNCTION ("qAT_PlusIPR()");
569
570 if ( device_entry EQ NULL )
571 {
572 #ifdef FF_PSI
573 device_dcb_entry = cmhPSI_GetDeviceParOverSrcID( (UBYTE) srcId );
574 if (device_dcb_entry EQ NULL)
575 #endif /*FF_PSI*/
576 return AT_FAIL;
577 #ifdef FF_PSI
578 else
579 {
580 device_type = device_dcb_entry->devId & DIO_TYPE_DAT_MASK;/* RM 26-05-04 Nice */
581 if (device_type EQ DIO_DATA_SER)/* RM 26-05-04 Nice */
582 *rate = (T_ACI_BD_RATE)device_dcb_entry->dcbPar.dio_dcb_ser.baudrate;
583 if (device_type EQ DIO_DATA_MUX)/* RM 26-05-04 Nice */
584 *rate = (T_ACI_BD_RATE)device_dcb_entry->dcbPar.dio_dcb_ser_mux.baudrate;
585 else if (device_type EQ DIO_DATA_PKT)/* RM 26-05-04 Nice */
586 return AT_FAIL;
587 return( AT_CMPL );
588 }
589 #endif /*FF_PSI*/
590 }
591 /*
592 *-------------------------------------------------------------------
593 * fill in parameters
594 *-------------------------------------------------------------------
595 */
596 *rate = (T_ACI_BD_RATE) device_entry->comPar.speed;
597
598 return( AT_CMPL );
599 }
600
601 /*
602 +--------------------------------------------------------------------+
603 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
604 | STATE : code ROUTINE : sAT_PlusICF |
605 +--------------------------------------------------------------------+
606
607 PURPOSE : This is the functional counterpart to the +ICF AT command
608 which is responsible to set the character framing.
609 */
610
611 GLOBAL T_ACI_RETURN sAT_PlusICF ( T_ACI_CMD_SRC srcId,
612 T_ACI_BS_FRM format,
613 T_ACI_BS_PAR parity)
614 {
615 #ifdef FF_PSI
616 T_ACI_DTI_PRC_PSI *src_infos = find_element (psi_src_params,
617 (UBYTE) srcId, cmhPSItest_srcId);
618 #endif /*FF_PSI*/
619 TRACE_FUNCTION ("sAT_PlusICF()");
620
621 /*
622 *-------------------------------------------------------------------
623 * parameter check
624 *-------------------------------------------------------------------
625 */
626 switch( format )
627 {
628 case( BS_FRM_NotPresent ):
629 case( BS_FRM_Dat8_Par0_St2 ):
630 case( BS_FRM_Dat8_Par1_St1 ):
631 case( BS_FRM_Dat8_Par0_St1 ):
632 case( BS_FRM_Dat7_Par0_St2 ):
633 case( BS_FRM_Dat7_Par1_St1 ):
634 case( BS_FRM_Dat7_Par0_St1 ):
635
636 break;
637
638 default:
639 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
640 return( AT_FAIL );
641 }
642
643 switch( parity )
644 {
645 case( BS_PAR_NotPresent ):
646 case( BS_PAR_Odd ):
647 case( BS_PAR_Even ):
648 case( BS_PAR_Mark ):
649 case( BS_PAR_Space ):
650
651 break;
652
653 default:
654 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
655 return( AT_FAIL );
656 }
657
658 /*
659 *-------------------------------------------------------------------
660 * force parameter request
661 *-------------------------------------------------------------------
662 */
663 #ifdef FF_PSI
664 if ( src_infos NEQ NULL )
665 {
666 if ( AT_EXCT EQ cmhPSI_SetCharacterFraming((UBYTE) srcId, format, parity) )
667 {
668 uartEntcurCmd[srcId] = AT_CMD_ICF;
669 return AT_EXCT;
670 }
671 }
672 /* force parameter request */
673 else
674 #endif /*FF_PSI*/
675 {
676 if ( AT_EXCT EQ cmhUART_SetCharacterFraming((UBYTE) srcId, format, parity) )
677 {
678 uartEntcurCmd[srcId] = AT_CMD_ICF;
679 return AT_EXCT;
680 }
681 }
682 return AT_FAIL;
683 }
684
685 /*
686 +--------------------------------------------------------------------+
687 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
688 | STATE : code ROUTINE : qAT_PlusICF |
689 +--------------------------------------------------------------------+
690
691 PURPOSE : This is the functional counterpart to the +ICF? AT command
692 which returns the current setting for character framing.
693
694 */
695
696 GLOBAL T_ACI_RETURN qAT_PlusICF ( T_ACI_CMD_SRC srcId,
697 T_ACI_BS_FRM *format,
698 T_ACI_BS_PAR *parity)
699 {
700 T_ACI_DEVICE_ENTRY *device_entry =
701 cmhUART_GetDeviceParOverSrcID( (UBYTE) srcId );
702 #ifdef FF_PSI
703 T_ACI_DEVICE_DCB_ENTRY *device_dcb_entry =
704 cmhPSI_GetDeviceParOverSrcID( (UBYTE) srcId );
705 #endif /*FF_PSI*/
706 TRACE_FUNCTION ("qAT_PlusICF()");
707 #ifdef FF_PSI
708 if (device_entry EQ NULL AND device_dcb_entry EQ NULL)
709 #else
710 if (device_entry EQ NULL)
711 #endif /*FF_PSI*/
712 {
713 return AT_FAIL;
714 }
715 #ifdef FF_PSI
716 if ( device_entry EQ NULL AND device_dcb_entry NEQ NULL )
717 {
718 *format = cmhPSI_GetFktInterfaceFormat(device_dcb_entry);
719 *parity = cmhPSI_GetFktInterfaceParity(device_dcb_entry);
720 return( AT_CMPL );
721 }
722 #endif /*FF_PSI*/
723
724 /*
725 *-------------------------------------------------------------------
726 * fill in parameters
727 *-------------------------------------------------------------------
728 */
729 /*lint -e613 (Warning --Possible use of null pointer) */
730 *format = cmhUART_GetFktInterfaceFormat(&(device_entry->comPar));
731
732 *parity = cmhUART_GetFktInterfaceParity(&(device_entry->comPar));
733 /*lint +e613 (Warning --Possible use of null pointer) */
734
735 return( AT_CMPL );
736 }
737
738 /*
739 +--------------------------------------------------------------------+
740 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
741 | STATE : code ROUTINE : sAT_PlusIFC |
742 +--------------------------------------------------------------------+
743
744 PURPOSE : This is the functional counterpart to the +IFC AT command
745 which is responsible to set the flow control.
746 */
747
748 GLOBAL T_ACI_RETURN sAT_PlusIFC ( T_ACI_CMD_SRC srcId,
749 T_ACI_RX_FLOW_CTRL DCE_by_DTE,
750 T_ACI_RX_FLOW_CTRL DTE_by_DCE )
751 {
752 #ifdef FF_PSI
753 T_ACI_DTI_PRC_PSI *src_infos = find_element (psi_src_params, (UBYTE) srcId, cmhPSItest_srcId);
754 #endif /*FF_PSI*/
755 T_ACI_RETURN result = AT_FAIL;
756 TRACE_FUNCTION ("sAT_PlusIFC()");
757
758 /*
759 *-------------------------------------------------------------------
760 * parameter check
761 *-------------------------------------------------------------------
762 */
763 TRACE_EVENT_P2("sAT_PlusIFC: DCE_by_DTE=%d DTE_by_DCE=%d", DCE_by_DTE, DTE_by_DCE);
764
765 if ( DCE_by_DTE < RX_FLOW_NotPresent OR DCE_by_DTE > RX_FLOW_HARDWARE )
766 {
767 TRACE_EVENT("sAT_PlusIFC: err1");
768 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
769 return AT_FAIL;
770 }
771
772 if ( DTE_by_DCE < RX_FLOW_NotPresent OR DTE_by_DCE > RX_FLOW_HARDWARE)
773 {
774 TRACE_EVENT("sAT_PlusIFC: err2");
775 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
776 return AT_FAIL;
777 }
778
779 if ( DTE_by_DCE NEQ RX_FLOW_NotPresent AND DCE_by_DTE NEQ DTE_by_DCE )
780 {
781 TRACE_EVENT("sAT_PlusIFC: err3");
782 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
783 return AT_FAIL;
784 }
785
786 /*
787 *-------------------------------------------------------------------
788 * force parameter request
789 *-------------------------------------------------------------------
790 */
791 #ifdef FF_PSI
792 if (src_infos NEQ NULL)
793 result = cmhPSI_SetFlowControl((UBYTE) srcId, DCE_by_DTE);
794 else
795 #endif /*FF_PSI*/
796 result = cmhUART_SetFlowControl((UBYTE) srcId, DCE_by_DTE);
797 switch (result)
798 {
799 case AT_EXCT:
800 uartEntcurCmd[srcId] = AT_CMD_IFC;
801 return AT_EXCT;
802 case AT_CMPL:
803 return AT_CMPL;
804 }
805 return result;
806 }
807
808 /*
809 +--------------------------------------------------------------------+
810 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
811 | STATE : code ROUTINE : qAT_PlusIFC |
812 +--------------------------------------------------------------------+
813
814 PURPOSE : This is the functional counterpart to the +ICF? AT command
815 which returns the current setting for character framing.
816
817 */
818
819 GLOBAL T_ACI_RETURN qAT_PlusIFC ( T_ACI_CMD_SRC srcId,
820 T_ACI_RX_FLOW_CTRL *DCE_by_DTE,
821 T_ACI_RX_FLOW_CTRL *DTE_by_DCE )
822 {
823 S32 flow_cntrl = RX_FLOW_NotPresent;
824 T_ACI_DEVICE_ENTRY *device_entry = cmhUART_GetDeviceParOverSrcID( (UBYTE) srcId );
825 #ifdef FF_PSI
826 T_ACI_DEVICE_DCB_ENTRY *device_dcb_entry = NULL;
827 U32 device_type;/* RM 26-05-04 Nice */
828 #endif /*FF_PSI*/
829 TRACE_FUNCTION ("qAT_PlusIFC()");
830
831 if ( device_entry EQ NULL )
832 {
833 #ifdef FF_PSI
834 if ( (device_dcb_entry = cmhPSI_GetDeviceParOverSrcID( (UBYTE) srcId )) EQ NULL)
835 #endif /*FF_PSI*/
836 return AT_FAIL;
837 #ifdef FF_PSI
838 device_type = device_dcb_entry->devId & DIO_TYPE_DAT_MASK;/* RM 26-05-04 Nice */
839 if (device_type EQ DIO_DATA_PKT)/* RM 26-05-04 Nice */
840 return AT_FAIL;
841 if (device_type EQ DIO_DATA_SER)/* RM 26-05-04 Nice */
842 flow_cntrl = device_dcb_entry->dcbPar.dio_dcb_ser.flow_control;
843 if (device_type EQ DIO_DATA_MUX)/* RM 26-05-04 Nice */
844 flow_cntrl = device_dcb_entry->dcbPar.dio_dcb_ser_mux.flow_control;
845
846 switch ( flow_cntrl )
847 {
848 case (DIO_FLOW_NONE):
849 default:
850 *DCE_by_DTE = *DTE_by_DCE = RX_FLOW_NONE;
851 break;
852 case (DIO_FLOW_XON_XOFF):
853 *DCE_by_DTE = *DTE_by_DCE = RX_FLOW_SOFTWARE;
854 break;
855 case ( DIO_FLOW_RTS_CTS):
856 *DCE_by_DTE = *DTE_by_DCE = RX_FLOW_HARDWARE;
857 break;
858 }
859 return( AT_CMPL );
860 #endif /*FF_PSI*/
861 }
862
863 /*
864 *-------------------------------------------------------------------
865 * fill in parameters
866 *-------------------------------------------------------------------
867 */
868 switch ( device_entry->comPar.flow_rx )
869 {
870 case UART_IO_FC_RX_NONE:
871 default:
872 *DCE_by_DTE = *DTE_by_DCE = RX_FLOW_NONE;
873 break;
874 case UART_IO_FC_RX_XOFF:
875 *DCE_by_DTE = *DTE_by_DCE = RX_FLOW_SOFTWARE;
876 break;
877 case UART_IO_FC_RX_RTS:
878 *DCE_by_DTE = *DTE_by_DCE = RX_FLOW_HARDWARE;
879 break;
880 }
881
882 return( AT_CMPL );
883 }
884
885
886 /*
887 +--------------------------------------------------------------------+
888 | PROJECT : GSM-PS (6147) MODULE : CMH_CCS |
889 | STATE : code ROUTINE : sAT_AndC |
890 +--------------------------------------------------------------------+
891
892 PURPOSE : set DCD behaviour
893 */
894
895 GLOBAL T_ACI_RETURN sAT_AndC ( T_ACI_CMD_SRC srcId,
896 T_ACI_DCD_MOD value )
897 {
898 BOOL no_data_call_on_this_line = TRUE;
899 UBYTE i;
900
901 TRACE_FUNCTION ("sAT_AndC()");
902
903 /* check command source */
904 if(!cmh_IsVldCmdSrc (srcId))
905 {
906 return( AT_FAIL );
907 }
908
909 /* check parameter value */
910 switch(value)
911 {
912 case(DCD_ALWAYS_ON):
913 case(DCD_DISABLE_AFTER_CALL):
914 break;
915 default:
916 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
917 return( AT_FAIL );
918 }
919
920 /* set DCD behaviour */
921 cmhPrm[srcId ].ccCmdPrm.DCDmode = value;
922
923 /* set DCD */
924 if(value EQ DCD_ALWAYS_ON)
925 {
926 io_setDCD (srcId, IO_DCD_ON);
927 }
928 else if(value EQ DCD_DISABLE_AFTER_CALL)
929 {
930 for (i = 0; i < MAX_CALL_NR; i++)
931 {
932 T_CC_CALL_TBL *ctbx = ccShrdPrm.ctb[i];
933
934 if (ctbx NEQ NULL AND
935 ctbx->curSrc EQ srcId)
936 {
937 switch(ctbx->BC[ctbx->curBC].bearer_serv)
938 {
939 case(MNCC_BEARER_SERV_NOT_PRES):
940 case(MNCC_BEARER_SERV_SPEECH):
941 case(MNCC_BEARER_SERV_AUX_SPEECH):
942 break;
943 default:
944 /* data call */
945 no_data_call_on_this_line = FALSE;
946 break;
947 }
948 }
949 }
950
951 if( no_data_call_on_this_line )
952 {
953 io_setDCD (srcId, IO_DCD_OFF);
954 }
955 }
956 return( AT_CMPL );
957 }
958
959
960 /*
961 +--------------------------------------------------------------------+
962 | PROJECT : GSM-PS (6147) MODULE : CMH_CCQ |
963 | STATE : code ROUTINE : qAT_AndC |
964 +--------------------------------------------------------------------+
965
966 PURPOSE : query DCD behaviour setting.
967 */
968
969 GLOBAL T_ACI_RETURN qAT_AndC ( T_ACI_CMD_SRC srcId,
970 T_ACI_DCD_MOD *value)
971 {
972
973 TRACE_FUNCTION ("qAT_AndC()");
974
975 /* check command source */
976 if(!cmh_IsVldCmdSrc (srcId))
977 {
978 return( AT_FAIL );
979 }
980
981 /* check parameter value */
982 if( value EQ NULL )
983 {
984 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
985 return( AT_FAIL );
986 }
987
988 /* query DCD behaviour */
989 *value = cmhPrm[srcId ].ccCmdPrm.DCDmode;
990
991 return( AT_CMPL );
992 }
993
994
995 /*
996 +--------------------------------------------------------------------+
997 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
998 | STATE : code ROUTINE : sAT_AndD |
999 +--------------------------------------------------------------------+
1000
1001 PURPOSE : set DTR behaviour.
1002 */
1003
1004 GLOBAL T_ACI_RETURN sAT_AndD ( T_ACI_CMD_SRC srcId, UBYTE value)
1005 {
1006 #ifdef FF_PSI
1007 T_ACI_DTI_PRC_PSI *dti_prc=find_element (psi_src_params,
1008 (UBYTE)srcId, cmhPSItest_srcId);
1009 #endif /*FF_PSI*/
1010 TRACE_FUNCTION ("sAT_AndD()");
1011 /*
1012 *-------------------------------------------------------------------
1013 * check command source
1014 *-------------------------------------------------------------------
1015 */
1016 if(!cmh_IsVldCmdSrc (srcId))
1017 {
1018 return( AT_FAIL );
1019 }
1020
1021 switch( value )
1022 {
1023 case( DTR_BEHAVIOUR_Ignore ):
1024 case( DTR_BEHAVIOUR_CommandMode ):
1025 case( DTR_BEHAVIOUR_ClearCall ):
1026 #ifdef FF_PSI
1027 if (dti_prc NEQ NULL)
1028 {
1029 psiShrdPrm.dtr_behaviour = (T_ACI_DTR_BEHAVIOUR)value;
1030 TRACE_EVENT("device entry is in PSI");
1031 }
1032 else
1033 #endif /*FF_PSI*/
1034 {
1035 uartShrdPrm.dtr_behaviour = (T_ACI_DTR_BEHAVIOUR)value;
1036 TRACE_EVENT("device entry is in UART");
1037 }
1038 break;
1039
1040 default:
1041 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1042 return( AT_FAIL );
1043 }
1044 return( AT_CMPL );
1045 }
1046
1047
1048 /*
1049 +--------------------------------------------------------------------+
1050 | PROJECT : GSM-PS (6147) MODULE : CMH_UARTS |
1051 | STATE : code ROUTINE : qAT_AndD |
1052 +--------------------------------------------------------------------+
1053
1054 PURPOSE : query DTR behaviour.
1055 */
1056
1057 GLOBAL T_ACI_RETURN qAT_AndD ( T_ACI_CMD_SRC srcId, UBYTE *value)
1058 {
1059 #ifdef FF_PSI
1060 T_ACI_DTI_PRC_PSI *dti_prc=find_element (psi_src_params, (UBYTE)srcId, cmhPSItest_srcId);
1061 #endif /*FF_PSI*/
1062 T_ACI_DTR_BEHAVIOUR dtr_behavior;
1063 TRACE_FUNCTION ("qAT_AndD()");
1064
1065 /*
1066 *-------------------------------------------------------------------
1067 * check command source
1068 *-------------------------------------------------------------------
1069 */
1070 if(!cmh_IsVldCmdSrc (srcId))
1071 {
1072 return( AT_FAIL );
1073 }
1074 #ifdef FF_PSI
1075 if (dti_prc NEQ NULL)
1076 dtr_behavior = psiShrdPrm.dtr_behaviour;
1077 else
1078 #endif /*FF_PSI*/
1079 dtr_behavior = uartShrdPrm.dtr_behaviour;
1080 switch( dtr_behavior )
1081 {
1082 case( DTR_BEHAVIOUR_Ignore ):
1083 case( DTR_BEHAVIOUR_CommandMode ):
1084 case( DTR_BEHAVIOUR_ClearCall ):
1085 *value = dtr_behavior;
1086 break;
1087
1088 default:
1089 ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
1090 return( AT_FAIL );
1091 }
1092 return( AT_CMPL );
1093 }
1094
1095 GLOBAL void cmhUART_lst_exit(void)
1096 {
1097 T_ACI_LIST *src_infos = NULL;
1098
1099 while (1)
1100 {
1101 src_infos = (T_ACI_LIST *)remove_first_element (uart_src_params);
1102
1103 if (src_infos EQ NULL)
1104 {
1105 break;
1106 }
1107 ACI_MFREE (src_infos);
1108
1109 }
1110 }
1111 #endif /* ifdef UART */