FreeCalypso > hg > freecalypso-citrine
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 */ |