comparison g23m/condat/ms/src/aci/cmh_uarts.c @ 0:509db1a7b7b8

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